Parsing / Сбор информации, Анализ данных

Создаем бота для Telegram

Время прочтения: 5 мин.

Первым шагом при создании бота является его регистрация в системе 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-технологий и присылать отформатированные отчеты. Все зависит только от вас.

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

Советуем почитать