Написание Telegram Bot`ов
Что такое эти боты?
Кому-то боты в мессенжерах могут показаться сложной штукой, в действительности же мы можем рассматривать бота как запрограммированного собеседника или участника чата. Еще проще будет изначально рассматривать бота как некий Веб-сервер который может получать сообщения и на них отвечать. В дальнейшем мы разберем более сложные конфигурации но первым нашим ботом будет примитивный echo-бот
, задача которого отвечать тем-же сообщением которое он получил. Но прежде чем нам приступить к его написанию нам надо написать простой "Hello world!" на языке python
.
Создание Hello World проекта на Python.
И так.. у нас есть интерпретатор языка python3
, для того чтобы стартануть проект нам потребуется сделать следующее:
Создать папку проекта
Давайте в папке пользователя создадим директорию
mybot
, для этого выполним следующие команды:cd ~# переходим в директорию пользователяmkdir mybot # Создаем папку mybotcd mybot # Переходим в папку mybotУстановить инструмент
virtualenv
используя менеджер пакетовpip
При разработке... допустим на NodeJs ваши зависимости проекта устанавливаются в директорию
node_modules
, в python по умолчанию немного по другому - все зависимости устанавливаются глобально, а это может привести к тому, что все ваши проекты будут шарить между собой одну версию пакета. Пакеты же имеют свойство обновляться и ломать обратную совместимость, для борьбы с подобным поведением мы будем испльзовать инструментvirtualenv
. Начнем с того что установим его:pip install virtualenv# Но скорее всего, если вы на Linux, вы увидете сообщение о том, что вам не хватает прав для вызова подобной командыsudo pip install virtualenv # Вот так уже лучшеДля того чтобы убедиться в том, что
virtualenv
установлен наберем следующее:virtualenv --versionЕсли версия вывелась - то все хорошо. После этого давайте уже создадим виртуальное окружение для проекта, находясь в директории проекта набираем следующее:
virtualenv ./.pyenvsource ./.pyenv/bin/activateИ снова! Если нет сообщений об ошибке - вы уже активировали виртуальное окружение.
Пишем скрипт, который выведет в консоле "Hello world!"
Создаем файл
hello.py
с следующим содержанием:print("Hello world!")Запускаем это файл
python3 ./hello.pyРадуемся надписи "Hello world!" в консоли
Возвращаемся к ботам
Мы сейчас написали самый простой скрипт на python
и скорее всего он для кого-то первый. Теперь давайте снова вернемся к разговору о ботах и перечислим сущности с которыми нам надо оперировать в ходе работы над ним.
Разговор
- Чат между двумя людьми.Если мы будем говорить только про Telegram, то для него нет отдельной сущности
Разговор
в его терминологии все является чатами, просто бывают такие особенные, где только два участника.Чат
- Комната в которой находятся люди и сообщения.Сообщение
- Какая-то запись у которой скорее всего есть автор и информация о том в каком чате это сообщение находится.
Естественно, что сущностей намного больше.. Изображения
, Файлы
, Аудио
и.т.д. Помимо всего этого эти сущности имеют достаточно большое кол-во полей. Со всеми сущностями мы можем ознакомиться по этой ссылке: Telegram Bot API (Available Types). С типами/сущностями мы еще будем знакомиться, а пока попытаемся подумать как должен работать echo-бот, давайте пока перечислим основные шаги:
- Мы заведем с ботом разговор
- Он начнет получать от нас сообщения, бот будет знать кто ему написал и в каком чате это сообщение было написано.
- После получения сообщения бот будет отправлять ответное сообщение
- С тем же текстом
- В тот же чат от куда он сообщение получил
Надеюсь, что на этом этапе у вас уже сложилось впечатление о том что будет представлять из себя наша программа(бот).
Регистрация бота
Для того чтобы написать бота нам надо быть зарегистрированными в телеге. А еще мы должны найти бота по имени BotFather
.
Для того чтобы создать бота пишем "папаше": /newbot
, после чего вы попадете с ним в диалог, где вы сообщите ему требуемую информацию. В конце вы получите сообщение об успешном создании бота и самое главное! - Токен доступа к API
⚠️Внимательно смотрите на то, что вам отвечает бот! Какие ошибки могут быть:
- Вы неверно указали
username
бота, который должен быть уникальным и заканчиваться на 'Bot'
Первый запрос к API
За документацией по методам бежим по следующей ссылке: Telegram Bot API (Available Methods)
Желательно чтобы вы делали запросы либо в браузере Firefox, либо в чтобы в вашем браузере было установленно расширения для красивого отображения JSON
Теперь у нас есть токен а с ним мы можем делать запросы в апишку. Как делать запросы? Легко! Просто открываем браузер и пишем в адресной строке: https://api.telegram.org/bot<YOUR_TOKEN>/getMe
.
Что такое
getMe
в урле? Да! Это метов, а ссылка на список методов лежит выше👆
Первое общение с нашим ботом
Мы с вами смогли сделать первый запрос к API, после этого нам следует попробовать пообщаться с ботом без написания нами кода для этого пройдемся по следующим шагам
Проходим по следующей ссылке в браузере:
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
. Мы получим ответ но ниодного сообщения в нем не будетНаходим бота в Telegram
Начинаем с ним разговор и пишем
hello
Повторяем первый шаг и уже что-то есть! Вы увидете примерно такой JSON:
{"ok": true,"result": [{"update_id": 403492974,"message": {"message_id": 3,"from": {"id": 197562409,"is_bot": false,"first_name": "*****","last_name": "****","username": "****","language_code": "en"},"chat": {"id": 197562409,"first_name": "*****","last_name": "*******","username": "*******","type": "private"},"date": 1580395346,"text": "hello"}}]}Давайте ответим на это сообщение, для этого отправляем примерно такой запрос:
https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage?text=hi%20to%20you%20too&chat_id=<CHAT_ID ИЗ ПРОШЛОГО ОТВЕТА>&reply_to_message_id=<MESSAGE_ID ИЗ ПРОШЛОГО ЗАПРОСА>
Проделав все эти действия вы получите сообщение от бота с текстом
hi to you too
На этом шаге мы используем метод API
sendMessage
, сразуже приложу ссылку на доку по этому методу: sendMessage
python-telegram-bot
Это пакет для языка python
, который поможет нам взаимодействовать с API проще. Давайте установим его в наш проект(виртуальное окружение).
Справедливо будет если мы скажем, что пакет разбит на 2 части:
telegram
- Предоставляет нам инструменты для вызова методов API и какие-то абстракции над типами апишки.telegram.ext
- Уже более интересный модуль, потому что в нем находятся инструменты для роутинга сообщений и.т.д. Сейчас может быть не совсем понятно, но на практике станет яснее что я имел ввиду.
При написании нашего echo-бота мы заюзаем только первую часть библиотеки - telegram
Echo-Bot
Давайте я сразу представлю вам финальный код echo-бота, но напишем мы его постепенно, вот только нам надо еще установить python-telegram-bot
А вот и сам код файлика echo-bot.py
:
Как вы можете видеть, код кажется избыточным, плюс его не так удобно дополнять скорее всего нам хочется:
- Избавиться от бесконечного лупа
- Удобно добавлять обработчики... ведь добавлять логику сейчас сложно
Нужна какая-то "архитектура", а telegram.ext
предоставляет нам очень удобные абстракции:
Updater
- Получает изменение/обновления и перенаправляет их диспетчеру (doc: Updater)Dispatcher
- Полученные обновления он будет распределять по обработчикам (doc: Dispatcher)Handler
- Обработчик обновлений, в диспетчер мы можем добавить несколько обработчиков под разные типы обновленийВот некоторые подклассы
Handler
:MessageHandler
- Обрабатывает простые сообщения, которые прошли какой-то фильтрCommandHandler
- Обрабатывает команды (сообщения в виде:/some_command
)
Давайте теперь перепишем нашу первую версию используя уже telegram.ext
🤔TODO: Если будет время допишу сюда разбор кода сверху, но вообще я сделаю это словестно на воркшопе
TODO-Bot
Вот мы с вами уже что-то и умеем теперь давайте напишем TODO-Bot. Общаться мы с ним будет командами:
/addtodo Купить молоко
- Добавить задание "Купить молоко"/ls
- Вывести список заданий c их статусами/rm
- Удалить задание/done
- Пометить задание как выполненное
И давайте введем несколько условий:
- Бот при начале работы с ним должен вывести справочную информацию
- Если он не понимает нашу команду он должен нам об этом сообщить