Создаем бота для Telegram
В этой статье расскажем о том, как создать Telegram бота, решающего задачу по предоставлению актуальных сводных данных из нескольких источников.
Первым шагом при создании бота является его регистрация в системе Telegram. Для этого необходимо обратиться опять же к боту – BotFather. Он предназначен для создания новых учетных записей ботов и управления существующими ботами (редактирование, настройка, удаление и др.):
Отправим команду /newbot
BotFather попросит прислать название нового бота и его имя, которое должно оканчиваться строкой «bot». После получения необходимой информации BotFather вернет сообщение, содержащее токен вашего бота. Необходимо сохранить его с ограничением доступа, т.к. этот ключ используется для управления ботом, и, зная его, любой человек сможет изменить логику работы вашей программы.
На данном этапе ваш бот уже создан, и можно даже написать ему сообщение. Но по сути это пока макет, пустая оболочка, которая не может реагировать на информацию и команды пользователя. Поэтому перейдем к следующему шагу – добавим функциональности.
Но предварительно понадобится провести некоторые настройки рабочего места. Так как бота мы разрабатывали в период блокировки Telegram, просто так работать с его API и программировать бота не получалось. Одним из решений обхода блокировки было использование VPN. Я выбрал бесплатный VPN-сервис Windscribe – он не требует сложной настройки, работает стабильно и предоставляет 10 Гб трафика в месяц, которых вполне хватает для решения большинства задач:
В качестве источников информации для нашего бота возьмем несколько площадок: сайт Федеральной налоговой службы и сайт Росреестра. Необходимую информацию об изменениях будем получать из RSS-лент данных сайтов, которые размещены в новостных разделах.
RSS (Rich Site Summary — обогащённая сводка сайта) – динамический файл в формате XML, привязанный к домену сайта и формирующийся по определенным правилам. При публикации нового материала (статья / комментарий) RSS-лента этого типа материала дополняется и обновляется. Обычно в ней содержится краткое описание новой информации и ссылка на полную версию.
При желании вы можете дополнить список источников теми сайтами, которые обычно используете в работе. Например, многие современные сайты построены на базе CMS (Content Management System — система управления контентом) WordPress, которая по умолчанию создает несколько RSS каналов. Главные из них – новые записи и новые комментарии, обычно расположенные по адресам Имя_сайта/feed/Имя_сайта/comments/feed/ соответственно.
Для написания бота я предлагаю использовать язык программирования python. Для доступа к API Telegram вам понадобится библиотека telebot а для чтения RSS-ленты – feedparser:
Теперь можно приступать к описанию логики бота. При получении сообщения от пользователя бот должен реагировать по-разному, в зависимости от типа сообщения (команда / текст / что-то иное). Для обработки различных реакций в библиотеке telebotреализован специальный механизм так называемых хэндлеров (handler), использующий декораторы Python.
Реализуем обработку нескольких основных команд (start / help), а также команды read_rss, которая и будет решать поставленную задачу. Ниже показан код основного модуля программы:
После импорта библиотек создается экземпляр бота, в параметрах которого необходимо указать токен, полученный на первом шаге. Три обработчика сообщений с параметром commands=… ] отслеживают получение соответствующих команд от пользователя.
Функция infinity_polling() запускает бесконечный цикл получения новых записей со стороны Telegram. При этом бот старается не прекращать работу при возникновении каких-либо ошибок.
В ответ на команды start и help бот будет отправлять сообщения с приветствием или списком доступных действий. Это реализовано функцией send_message с параметрами: ID чата, в котором получено сообщение и сам текст сообщения:
bot.send_message(message.chat.id, message_text)
При получении команды read_rss бот вызывает процедуру чтения RSS – feed_parser(), описанную в отдельном модуле utils:
Функция feedparser.parse() принимает в качестве параметра адрес RSS-ленты сайта и создает объект, который по умолчанию содержит несколько последних записей(entries), расположенных в прямом порядке (новейшие записи идут в начале). Нас интересует только самая новая статья на каждой площадке, получаемая строкой current_news = feedparser.parse(NewsFeed[key]).entries[0]. Отдельный модуль utils понадобился для того, чтобы не загромождать основной обработчик событий. В дальнейшем в этом модуле можно будет описать дополнительные функции.
На данном этапе бот с минимальной функциональностью готов и может решать поставленную в начале статьи задачу. Запустите код на исполнение и отправьте боту команду /read_rss. Должно получить что-то вроде этого:
При необходимости формат сообщения можно привести к удобному для себя виду (объединить источники в одно сообщение, выводить краткий текст новости, титульное изображение и др.).
В интерфейсе BotFather можно отредактировать параметры вашего бота: имя, описание, поле «About», иконку и список основных команд. Это добавит ему уникальности и позволит сделать более удобным.
При желании функциональность бота можно существенно расширить и настроить под свои нужды – например, дополнительно получать сводку погоды по выбранным городам (на случай, если придется поехать в командировку). Можно агрегировать данные из других источников, в зависимости от направления проводимого вами аудита. Например, получать новости по аудиту IT-технологий и присылать отформатированные отчеты. Все зависит только от вас.
Однако, после того как вы выключите свой компьютер, бот тоже перестанет работать. Для того, чтобы этого не происходило и не нужно было все время держать компьютер включенным, бота необходимо разместить на сервере.
Видел такие статьи в 2016 году на хабре.
В 2020 году:
- нет блокировки Telegram
- при написании ботов используют aiogram
Тоже самое можно сказать и о:
if __name__ == '__main__':
bot.infinity_polling()
Сейчас в телеботе достаточно написать:
bot.polling()
Видать статейка действительно просто скопипащена из прошлого. Зачем? - ...
NTA сегодня в 13:46В связи с тем, что в России мессенджер Telegram официально пока блокируетсяШтаааа?
Благодарим за замечание! Вы абсолютно правы!
Можно ли создавать в боте список дочерних ботов и перенаправлять входящие запросы от пользователей на свободный дочерний бот чтобы распараллелить диалоги?