Тесты Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
29 Авг 2023
10 мин
16006

Как написать Телеграм-бот на Python

Пройдите тест, узнайте какой профессии подходите

В 2025 году Python — самый популярный язык программирования. Именно на нём чаще всего пишут телеграм-ботов, которые помогают автоматизировать рутинные

Телеграм используют больше миллиарда человек по всему миру. Компании с его помощью упрощают заказ товаров или услуг, дают консультации. Для этого используют ботов — автоматические программы. Их пишут на разных языках программирования. Рассмотрим, как создать бота на Python — самом популярном в 2025 году языке.

Установите интерпретатор Python

Python — динамически типизированный, интерпретируемый язык. Программы, написанные на нём, не компилируются в файлы, которые можно запустить сразу после клика по ним. Поэтому, чтобы Python-программы заработали, устанавливают интерпретатор языка.

На курсе Skypro «Python-разработчик» с этого начинается первый модуль. Вся программа построена от простого к сложному и подходит даже для тех, кто не имеет опыта в программировании и технических знаний. За 10 месяцев можно освоить профессию на уровне уверенного новичка.

Windows

  1. Перейдите на официальную страницу загрузки Python.

    Python release for windows

    Выберите последнюю версию Python

  2. Пролистайте вниз и скачайте Windows Installer.

    таблица

    Выберите 64-bit

  3. Откройте установщик и поставьте галочку, нажмите Install Now.

    Install Python

    Поставьте галочку перед установкой напротив Add python.exe to PATH

  4. Откройте командную строку сочетанием клавиш Win и R, введите «cmd.exe» и установите виртуальное окружение с помощью команды:
pip install virtualenv

Вызов интерпретатора в командной строке Windows отличается от вызова в других ОС. Используйте команду py вместо python3.

Linux
Если используете ОС Linux, то, скорее всего, Python уже установлен. Чтобы это проверить, откройте терминал с помощью команды:

python3 --version

Если видите что-то вроде Python 3.x.x, то Python есть. Если нет — используйте установленный менеджер пакетов. В основном это apt. Для этого введите команду:

sudo apt install python3

Установите виртуальное окружение с помощью команды:

sudo apt install python3-venv

macOS
На макбуках Python часто тоже уже есть. Откройте терминал и проверьте это с помощью команды:

python3 --version

Ответ Python 3.x.x подтверждает, что Python установлен. Если нет — используйте менеджер пакетов brew. Введите команду:

brew install python3

Установите пакет для создания виртуального окружения:

pip install virtualenv

Создайте папки проекта и виртуального окружения

Откройте терминал Linux или macOS. Перейдите в директорию, в которой хотите создать проект простого бота на Python для Telegram. Последовательно введите команды:

mkdir myBot
cd myBot
python3 -m venv env
#

Если используете Windows, откройте командную строку и введите:

py -m venv env #

Эти команды создадут папку проекта myBot внутри текущей рабочей директории, а в ней — папку с виртуальным окружением.

Активируйте окружение, выберите и установите библиотеки

Чтобы активировать виртуальное окружение на macOS или Linux, используйте команду:

source ./env/bin/activate

Для Windows используйте команду:

source.\env\bin\activate.bat

Чтобы создавать ботов, используют разные библиотеки. Самые популярные: python-telegram-bot с синхронным подходом и aiogram с асинхронным подходом. Асинхронность позволяет отвлекаться от задач и не ждать ввода от пользователя, поэтому нужно использовать библиотеку aiogram. Документация по ней — на docs.aiogram.

Используйте менеджер Python-пакетов (pip). Чтобы установить библиотеку aiogram, введите команду:

pip install aiogram

Зарегистрируйте бота и получите API-ключ. Откройте телеграм и найдите бота @BotFather. Он нужен, чтобы создавать других ботов и управлять ими. Нажмите «Запустить».

code

code

Введите команду /newbot и отображаемое имя бота

code

Никому не сообщайте полученный токен

Теперь введите никнейм бота. Он должен быть уникальным, в конце обязательно слово bot. Когда юзернейм пройдет валидацию, вы получите сообщение с API-ключом.

 

Примеры ботов

Эхобот

Для начала в папке проекта создайте несколько файлов.

папки

Handlers.py будет хранить функции — обработчики сообщений и команд, main.py нужен для запуска

Напишите в main.py код:

from aiogram import Bot, Dispatcher, executor
import handlers
API_TOKEN = 'вставьте сюда ваш токен'
# создаем экземпляры бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# запускаем программу
if __name__ == '__main__':
# указание skip_updates=True
# пропустит команды,
# которые отправили
# до старта бота
executor.start_polling(dp, skip_updates=True)

Разберем построчно:

from aiogram import Bot, Dispatcher, executor
import handlers

Сначала импортируйте из библиотеки aiogram классы:

  • Bot — для работы с ботом.
  • Dispatcher — он отвечает за регистрацию обработчиков: связывает команды и сообщения с нужными функциями.
  • Executor — запускает бота и выполняет все зарегистрированные функции.

На второй строке импортируйте модуль handlers.py, в котором находятся обработчики команд и сообщений.

После этого:

  • Объявите переменную с токеном, который вы получите от бота @BotFather.
  • Создайте экземпляр класса Bot — передайте в него токен.
  • Создайте экземпляр Dispatcher — передайте в него объект бота.

Далее откройте файл handlers.py и напишите в нём пару команд, которые будут обрабатывать запросы:

from aiogram import types

# Функция, обрабатывающая команду /start
async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне что-нибудь!")

# Функция, которая отвечает на сообщение
# с текстом
async def echo(message: types.Message):
await message.answer("Сам ты: " + message.text)

Здесь из модуля aiogram импортируйте типы, с помощью которых преобразуйте текст сообщения или файлы в структуру данных. Это может быть Message — сообщение, Audio — аудиозапись, Animation — анимация.

Далее определите асинхронные функции, чтобы обрабатывать команды /start и отвечать на сообщения.

Зарегистрируйте эти функции в диспетчере. Для этого в файле main.py добавьте перед запуском программы:

# регистрируем функции
dp.register_message_handler(h.start, commands=["start"])
dp.register_message_handler(h.echo)

В итоге файл выглядит так:

from aiogram import Bot, Dispatcher, executor
import handlers
API_TOKEN = 'вставьте сюда ваш токен'
# создаем бота и диспетчер
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# регистрируем функции
dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.echo)
# запускаем программу
if __name__ == '__main__':
# указание skip_updates=True
# пропустит команды,
# которые отправили
# до старта бота
executor.start_polling(dp, skip_updates=True)
code

Чтобы проверить работу, введите в терминале python3 main.py или py main.py на Windows. Откройте бота в телеграме и запустите его

Криптобот

Используйте бесплатный API-сервис SoChain, чтобы написать криптобота, который будет сообщать текущую цену BTC, LTC и DASH. Еще потребуется дополнительная библиотека, чтобы создать асинхронные запросы aiohttp, но ее устанавливают вместе с aiogram.

Создайте новый модуль utils.py. Добавьте в него URL-адрес API-сервиса. Чтобы узнавать цену, используйте метод Get Prices. Он возвращает json-объект с данными о цене из нескольких источников. Поэтому напишите функцию, которая вычисляет среднее значение:

BASE_URL = "https://sochain.com/api/v2/" # API URL
# функция, чтобы рассчитать цену
def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"

Потом откройте файл handlers.py и напишите код:

from aiogram import types

# импортируем библиотеку aiohttp
import aiohttp
# импортируем из utils все данные
from utils import *
# обработчик команды /start
async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне акроним криптовалюты, чтобы узнать текущую цену")
# обработчик команды /help
async def help(message: types.Message):
await message.answer("Доступные сети:\n" + "\n".join(networks))

# обработчик запроса цены
async def get_price(message: types.Message):
session = aiohttp.ClientSession()
# создаем GET-запрос по закрепленному за методом get_price url
async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:
# получаем ответ в формате json
data = await resp.json()
# если статус запроса — успешно
if data["status"] == "success":
# рассчитываем цену и отправляем пользователю
price = calculate_price(data)
await message.answer(price)
else:
# сообщаем о том, что произошла ошибка
await message.answer("Произошла ошибка")

Теперь измените файл main.py: зарегистрируйте функции. После этого протестируйте бота:

from aiogram import Bot, Dispatcher, executor
import handlers
API_TOKEN = 'вставьте сюда ваш токен'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.help, commands=["help"])
dp.register_message_handler(handlers.get_price)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
code

Когда пользователь укажет неподдерживаемую сеть ETH, бот вернет цену биткоина, потому что так устроен API-сервис. Если он не распознал сеть, то использует BTC

Чтобы исправить ошибку, нужно настроить клавиатуру так, чтобы она возвращала корректные значения. Есть два способа добавить проверку:

  1. Создать специальный класс — Middleware. В нём можно описать, какие проверки выполнять до и после обработки запроса.
  2. Или добавить проверку прямо внутри функции. Этот способ проще и подойдет для небольших задач.

Если пользователь отправит неподдерживаемый акроним криптосети, вы сообщите ему об этом. Для этого в файле utils.py определите список поддерживаемых сетей:

networks = ["BTC", "LTC", "DASH"] # <-- поддерживаемые сети
BASE_URL = "https://sochain.com/api/v2/" # API URL
def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"
Теперь отредактируйте функцию расчета цены криптовалюты в файле handlers.py. Для этого добавьте проверку вхождения сети в список поддерживаемых:
async def get_price(message: types.Message):
network = message.text.upper() # приводим сообщение к верхнему регистру

# выполняем проверку вхождения
if network not in networks:
await message.answer("Вы указали неподдерживаемую криптовалюту")
return
session = aiohttp.ClientSession()
async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:
data = await resp.json()
if data["status"] == "success":
price = calculate_price(data)
await message.answer(price)
else:
await message.answer("Произошла ошибка")
code

Когда пользователь укажет неподдерживаемую сеть ETH, бот сообщит об этом

Код всех файлов
utils.py

networks = ["BTC", "LTC", "DASH"] # поддерживаемые сети
BASE_URL = "https://sochain.com/api/v2/" # API URL
def calculate_price(data):
prices = [float(entity["price"]) for entity in data["data"]["prices"]]
return f"{(sum(prices) / len(prices)):.2f} USD"

handlers.py

import aiohttp
from aiogram import types
from utils import *
async def start(message: types.Message):
await message.answer("Привет!\nНапиши мне акроним криптовалюты, чтобы узнать текущую цену.")
async def help(message: types.Message):
await message.answer("Доступные сети:\n" + "\n".join(networks))

async def get_price(message: types.Message):
network = message.text.upper()
if network not in networks:
await message.answer("Вы указали неподдерживаемую криптовалюту")
return
session = aiohttp.ClientSession()
async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp:
data = await resp.json()
if data["status"] == "success":
price = calculate_price(data)
await message.answer(price)
else:
await message.answer("Произошла ошибка")

main.py

from aiogram import Bot, Dispatcher, executor
import handlers
API_TOKEN = 'вставьте сюда ваш токен'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.register_message_handler(handlers.start, commands=["start"])
dp.register_message_handler(handlers.help, commands=["help"])
dp.register_message_handler(handlers.get_price)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

Главное о телеграм-боте на Python

  • 🟦 Телеграм-бот — это программа, которая автоматически отвечает на сообщения пользователей в телеграме.
  • 🟦 Создание телеграм бота на Python начинается с установки интерпретатора языка. На Linux и macOS он часто уже есть.
  • 🟦 Создайте папку для проекта с названием myBot. Внутри нее создайте виртуальное окружение, активируйте его и установите библиотеку aiogram. В этой библиотеке можно обрабатывать входящие запросы, в том числе в тех случаях, когда бот ждет ответа от пользователя — например, ввода текста или выбора кнопки.
  • 🟦 Регистрируйте бота и управляйте его настройками с помощью @BotFather.

Добавить комментарий