Создаем бота для 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:

pip install pyTelegramBotAPI pip install feedparser

Теперь можно приступать к описанию логики бота. При получении сообщения от пользователя бот должен реагировать по-разному, в зависимости от типа сообщения (команда / текст / что-то иное). Для обработки различных реакций в библиотеке telebotреализован специальный механизм так называемых хэндлеров (handler), использующий декораторы Python.

Реализуем обработку нескольких основных команд (start / help), а также команды read_rss, которая и будет решать поставленную задачу. Ниже показан код основного модуля программы:

import telebot from telebot import types import utils bot = telebot.TeleBot(ТОКЕН_ВАШЕГО_БОТА) @bot.message_handler(commands=['start']) def start_menu(message): message_text = 'Здравствуйте!\n' \ + 'Наберите /help - для отображения списка доступных команд.' bot.send_message(message.chat.id, message_text) @bot.message_handler(commands=['help']) def print_menu(message): message_text = 'Вот, что умеет этот бот:\n' \ + '/help - отображает список доступных команд\n' \ + '/read_rss - присылает сводную информацию из выбранных источников' bot.send_message(message.chat.id, message_text) @bot.message_handler(commands=['read_rss']) def read_rss(message): post = utils.feed_parser() bot.send_message(message.chat.id, 'Новая информация на выбранных площадках:') for key in post.keys(): bot.send_message(message.chat.id, key + '\n' + post[key]) if __name__ == '__main__': bot.infinity_polling()

После импорта библиотек создается экземпляр бота, в параметрах которого необходимо указать токен, полученный на первом шаге. Три обработчика сообщений с параметром commands=… ] отслеживают получение соответствующих команд от пользователя.

Функция infinity_polling() запускает бесконечный цикл получения новых записей со стороны Telegram. При этом бот старается не прекращать работу при возникновении каких-либо ошибок.

В ответ на команды start и help бот будет отправлять сообщения с приветствием или списком доступных действий. Это реализовано функцией send_message с параметрами: ID чата, в котором получено сообщение и сам текст сообщения:

bot.send_message(message.chat.id, message_text)

При получении команды read_rss бот вызывает процедуру чтения RSS – feed_parser(), описанную в отдельном модуле utils:

import feedparser def feed_parser(): NewsFeed = {'РосРеестр': 'https://rosreestr.ru/site/rss/', 'Федеральная Налоговая Служба': 'https://www.nalog.ru/rn62/rss/'} message = dict() for key in NewsFeed.keys(): current_news = feedparser.parse(NewsFeed[key]).entries[0] message[key] = current_news.title + '\n' + current_news.link return message

Функция feedparser.parse() принимает в качестве параметра адрес RSS-ленты сайта и создает объект, который по умолчанию содержит несколько последних записей(entries), расположенных в прямом порядке (новейшие записи идут в начале). Нас интересует только самая новая статья на каждой площадке, получаемая строкой current_news = feedparser.parse(NewsFeed[key]).entries[0]. Отдельный модуль utils понадобился для того, чтобы не загромождать основной обработчик событий. В дальнейшем в этом модуле можно будет описать дополнительные функции.

На данном этапе бот с минимальной функциональностью готов и может решать поставленную в начале статьи задачу. Запустите код на исполнение и отправьте боту команду /read_rss. Должно получить что-то вроде этого:

При необходимости формат сообщения можно привести к удобному для себя виду (объединить источники в одно сообщение, выводить краткий текст новости, титульное изображение и др.).

В интерфейсе BotFather можно отредактировать параметры вашего бота: имя, описание, поле «About», иконку и список основных команд. Это добавит ему уникальности и позволит сделать более удобным.

При желании функциональность бота можно существенно расширить и настроить под свои нужды – например, дополнительно получать сводку погоды по выбранным городам (на случай, если придется поехать в командировку). Можно агрегировать данные из других источников, в зависимости от направления проводимого вами аудита. Например, получать новости по аудиту IT-технологий и присылать отформатированные отчеты. Все зависит только от вас.

Однако, после того как вы выключите свой компьютер, бот тоже перестанет работать. Для того, чтобы этого не происходило и не нужно было все время держать компьютер включенным, бота необходимо разместить на сервере.

0
5 комментариев
Олег Абрамов

Видел такие статьи в 2016 году на хабре.
В 2020 году:
- нет блокировки Telegram
- при написании ботов используют aiogram

Ответить
Развернуть ветку
Mihail Relby

Тоже самое можно сказать и о:
if __name__ == '__main__':
bot.infinity_polling()

Сейчас в телеботе достаточно написать:
bot.polling()

Видать статейка действительно просто скопипащена из прошлого. Зачем? - ...

Ответить
Развернуть ветку
Нейро Формалин
NTA сегодня в 13:46
В связи с тем, что в России мессенджер Telegram официально пока блокируется

Штаааа?

Ответить
Развернуть ветку
NTA
Автор

Благодарим за замечание! Вы абсолютно правы!

Ответить
Развернуть ветку
Alexander Lipkovich

Можно ли создавать в боте список дочерних ботов и перенаправлять входящие запросы от  пользователей на свободный дочерний бот чтобы распараллелить диалоги? 

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку

Комментарий удален модератором

Развернуть ветку
2 комментария
Раскрывать всегда