Введение
На Хабре уже полно статей-туториалов с заголовками «Создание бота на Python», но многие из них используют готовые обертки над HTTP-интерфейсом Bot API Телеграма. Я же использую стандартную библиотеку для отправки и получения GET- и POST-запросов — requests. И так, рассмотрим создание примитивного Телеграм бота, который будет отвечать на все наши текстовые сообщения. Это будет заготовка для дальнейшего расширения.
Шаг 1. Создание бота
Для работы с ботом нужно сначала его создать внутри приложения Телеграм. Для этого напишем первородному боту телеграма @BotFather.
Пишем ему /newbot:
Выполняем его просьбу ввести имя вашего бот. Оно обязательно должно иметь на конце слово bot.
Если имя ввели правильно БотОтец любезно предоставит вам токен вашего бота для доступа к нему через API.
Вот теперь можно приступать к написанию самого бота.
Шаг 2. Авторизация бота
Так как API телеграма для работы с ботами представляет из себя HTTP-интерфейс, нам понадобится модуль для работы с HTTP — requests.
import requests
Принцип работы с ботом заключается получении обновлений, то есть получения действий, которые были совершены с вашим ботом. Для этого отправляем POST запрос в форме "URL + TOKEN + необязательная информация о частоте запросов, о количестве хранимых апдейтов и т.д.", который по умолчанию выдаст 100 последний не подтвержденных обновлений. Даже если бот не активен его обновления будут храниться на сервере до тех пор, пока вы их не обработаете, но не более 24 часов. Обработка обновления происходит посредством его подтверждения. Для подтверждения обновления в запросе /getUpdates передается параметр offset. Все обновления с id меньшим или равным переданному offset будут отмечены как подтверждённые и не будут больше возвращаться сервером. В ответ на запрос вы получите объект Update, который уже сериализован в JSON. Обработку JSON можно посмотреть в документации.
Инициализируем переменные для последующих запросов:
offset = 0 # параметр необходим для подтверждения обновления
URL = 'https://api.telegram.org/bot' # URL на который отправляется запрос
TOKEN = 'token' # токен вашего бота, полученный от @BotFather
data = {'offset': offset 1, 'limit': 0, 'timeout': 0}
Дальше отправляем запрос обновлений:
try: # обрабатываем исключения
request = requests.post(URL TOKEN '/getUpdates', data=data) # собственно сам запрос
except:
print('Error getting updates')
return False
if not request.status_code == 200: return False # проверяем пришедший статус ответа
if not request.json()['ok']: return False
Обработка исключений обязательна, так как бот чувствителен к ошибкам и любой сбой приведет к «пробке» в очереди обновлений.
Шаг 3. Обработка обновлений и отправка сообщений
И так, проходимся по накопившимся обновлениям:
for update in request.json()['result']:
offset = update['update_id'] # подтверждаем текущее обновление
if 'message' not in update or 'text' not in update['message']: # это просто текст или какая-нибудь картиночка?
print('Unknown message')
continue
message_data = { # формируем информацию для отправки сообщения
'chat_id': update['message']['chat']['id'], # куда отправляем сообщение
'text': "I'm <b>bot</b>", # само сообщение для отправки
'reply_to_message_id': update['message']['message_id'], # если параметр указан, то бот отправит сообщение в reply
'parse_mode': 'HTML' # про форматирование текста ниже
}
try:
request = requests.post(URL TOKEN '/sendMessage', data=message_data) # запрос на отправку сообщения
except:
print('Send message error')
return False
if not request.status_code == 200: # проверим статус пришедшего ответа
return False
Немного о форматировании отправляемых сообщений.
Телеграм позволяет выделять некоторый текст в сообщении жирным шрифтом, курсивом, выделять ссылки и код. Существует два способа выделения текста: Markdown или HTML разметкой, что как раз и определяется в передаваемом /sendMessage параметре _parsemode.
Шаг 4. Постоянная прослушка
Осталось только организовать постоянную прослушку обновлений с бота и дело в шляпе. Запрос обновлений и их обработку можно оформить в функцию _checkupdates, а затем просто вызывать ее в бесконечном цикле с обработкой прерывании бота пользователем:
while True:
try:
check_updates()
except KeyboardInterrupt: # порождается, если бота остановил пользователь
print('Interrupted by the user')
break
Вот и готов самый простой бот для Телеграма. Конечно, можно использовать уже готовые оболочки над Bot API, но зачем, если обращение напрямую к HTTP-интерфейсу и так не занимает много места. Пожалуй, на этом остановимся. В будущем можно будет реализовать отправку стикеров, обработку пришедших сообщений, и определенные ответы на определенные слова. Так же с ботами можно общаться посредством команд формата /команда, что очень удобно для каких-либо конкретных, шаблонных запросов к боту.
Автор: NullaCham