Создаем RSS Feed бота с помощью Leecero
Шаг первый. Регистрация на www.leecero.com
Самый простой шаг. Идем на сайт и жмем на кнопку Register, после чего заполняем формочку и попадаем в ЛК. Здесь мы сразу можем создать бота, что мы немедленно делаем.
Шаг второй. Создание бота в Telegram
Внутри нас встречает инструкция, как создать бота в телеграм. Последуем ей.
Идем в Telegram и пишем привет BotFather
Тут мы узнаем что все простые названия, типа RssBot или RssFeedBot уже заняты. Неужели и тут появились киберсквоттеры? Ну тогда хотя бы в приветствии написали бы где и как купить бота. Еще можно с помощью Leecero эту покупку автоматизировать ;)
Впрочем, имя RssyBot свободно - его и возьмем.
Мы не будем добавлять боту морфологии, сделаем поддержку простых команд. Подумав немного, мы придумываем список необходимых команд:
- start - Start Rssy Feed bot
- list - Show current feeds
- add - Add new feed
- remove - Remove old feed, call with params like "/remove 1"
- cancel - Cancel current operation
- stop - Stop Rssy Feed bot
И сразу скармливаем их BotFather
Еще добавляем описание, картинку - все эти настройки легко сделать в интерактивном режиме. И конечно сохраняем токен - он нам понадобится для подключения бота к Leecero
Шаг третий. Подключаем бота к Leecero и пишем сценарий
Тут все тоже довольно просто. Leecero просит от нас три вещи: токен полученный от BotFather, Username владельца чата для отладки и сценарий, причем заглушку сценария он уже создал
Поэтому мы вносим все данные и начинаем писать сценарий. Сначала его стоит спроектировать, чтобы понимать как он должен выглядеть. Для этого я люблю вот этот сервис. Итак, наши предпосылки таковы:
- Состояние start обязательно, выход из него по команде /start
- Необходимо состояние из которого будут вызываться все команды
- Для добавления rss ссылки нужно 2 состояния: для вызова add и для передачи ссылки
- Нужно поддерживать команду /cancel
- Нужно поддерживать команду /stop для отмены рассылки и /start для повторного запуска
Рисуем!
Таким образом после /start бот уходит в состояние AwaitingCommand. Из этого состояния ему доступны команды list, remove, add, stop. По команде Add будет выполнен переход в состояние AddFeed а выходом из этого состояние будет отправленная ссылка.
Состояние /remove требует цифру (/remove НОМЕР_ФИДА) поэтому добавим ему морфологию типа "num".
Состояние AddFeed - * должно отправить ссылку в web-service для сохранения в БД, поэтому добавим ему морфологию типа "msg".
Напомню список модификаторов морфологии которые поддерживает Leecero
- msg - сообщение целиком
- num - цифра или номер. отправляется первая найденная в сообщение цифра.
- dt - дата и время
- address - адрес
- fio - ФИО, необходимо чтобы в сообщение были все части ФИО, иначе система не распознает его целиком
Нажимаем Save и бот готов. Уже можно слать ему сообщения и он будет отвечать. Однако пока он ничего не делает. Следующий раздел будет содержать некоторое количество кода и может быть не интересен многим на этом ресурсе. Однако он очень важен для демонстрации всех возможностей Leecero
Шаг четвертый. Пишем back-end бота на ASP.NET
Писать back-end можно на чем угодно. Я выберу ASP.NET просто потому что я его лучше знаю. В качестве back-end нам понадобиться База Данных с одной таблицей, несколько webhook для обработки команд и сервис по опросу RSS фидов
База данных
В БД нам потребуется хранить какой пользователь какой фид для себя сохранил. Структура базы данных будет максимально простая: одна таблица со следующими полями
- ID Чата - чтобы знать куда отправлять
- Имя пользователя - просто для информации
- Ссылка на feed
- Активен ли пользователь - чтобы не присылать ничего тем пользователям, которые находятся в состоянии NoData
Это таблица не нормализована, что не очень хорошо, так что выполним приведение к нормальным формам. Пользователей и feeds можно разделить на две таблицы и связать их связью один-ко-много. Это ускорит как опрос feedov так и рассылку данных.
Созданные таблицы выглядят следующим образом:
Webhooks для обработки команд
Вспомним список команд
- start - Start Rssy Feed bot
- list - Show current feeds
- add - Add new feed
- remove - Remove old feed, call with params like "/remove 1"
- cancel - Cancel current operation
- stop - Stop Rssy Feed bot
Для каждой команды нам понадобится свой webhook который будет вызван.
Если в поле action какого-либо перехода (transition) находится верная url ссылка, например http://tjnewsbot.mybluemix.net/paper, то Leecero при выполнение этого перехода выполнит GET-запрос по указанному адресу. В ответ ожидается сообщение с кодом 200 и телом в виде JSON ответа - списка сообщений для отправки пользователю. В запрос будет переданы id чата и параметры указанные в атрибуте morphology.
Не буду утомлять вас кусками кода, скажу только что я потратил ровно один час на написание backend этого бота. Класс который реализует backend выглядит вот так
Названия методов будут превращены в url адреса действий, например Add будет превращен в ссылку вида www.domain.com/api/rssy/start?id=1 где id будет идентификатором чата. Теперь мы можем опубликовать backend и поправить сценарий. В нашем случае backend будет развернут на Azure, но вы можете использовать что угодно, в т.ч. собственные сервера.
В сценарии в атрибуты action мы записываем ссылки на наши webhook'и которые будут вызваны при переходе из одного состояния в другое по action
Бот готов и полностью функционирует. Давайте попробуем добавить пару rss фидов
Успех! Однако, пока бот ничего не присылает. Для отправки сообщения нужен сервис.
Сервис мониторинга RSS feed'ов и рассылки
Сервис мониторинга будет простым консольным приложением подключенным к веб-сервису как AzureWebJob. Он будет раз в час опрашивать все feed пользователя, формировать ему пакет сообщений и отправлять все новое за последний час в чат. Конечно не самый лучший вариант для отслеживания 1000+ источников, но для слежкой за 1-2 сайтами в самый раз.
Опять же я не буду утомлять читателя скучным кодом, покажу только самую важную часть. Для отправки чего-либо в конкретный чат нам необходимо три компонента:
- API Token из личного кабинет. Находится в верхней части Dashboard
- Bot Token бота. Находится в Details бота
- Chat Id чата. Эту информацию мы собирали при добавлении пользователем ссылки в базу
После чего необходимо выполнить POST запрос следующего вида
http://leecero.com/api/chat/{API_TOKEN}/{BOT_TOKEN}/{CHAT_ID}
С телом в виде нашего сообщения в JSON.
Шаг последний. Добавляем бота в каталог и радуемся.
Бот готов. Он будет раз в час присылать последние новости из выбранных RSS каналов.
Чтобы о нем все узнали, давайте добавим его в каталог. Есть один очень неплохой: http://storebot.me/
Добавим же нашего бота туда.
А пока он ждет аппрува, приглашаю всех желающих попробовать бота telegram.me/RssyBot и обсудить что ему не хватает в комментариях.