Новостной бот
В этом коротком туториале мы научимся добавлять в любого бота одну из самых распространенных функций — чтение новостей. Бот сможет читать RSS ленту с любого сайта и рассказывать пользователю свежие статьи.
Мы научимся применять продвинутые инструменты Aimylogic, чтобы бот работал с новостями правильно, и чтобы пользователю было удобно им пользоваться.
Что такое RSS
Это специальный формат, который использует почти каждый сайт в интернете (особенно новостные порталы). При публикации новой статьи RSS лента обновляется и в ней появляется новая запись. В каждой записи есть заголовок статьи (title), текст статьи (description) и ссылка на источник (link).
Как бот прочитает RSS ленту
Итак, в этом туториале мы хотим создать бота, который рассказывает пользователю новости из какой-то RSS ленты. Например, это будут новости про высокие технологии от Яндекс Новостей. Эта лента живет по адресу https://news.yandex.ru/computers.rss
Но RSS — это данные в формате XML, а боту на Aimylogic удобнее работать с JSON. Поэтому в Aimylogic есть специальный инструмент, который превращает RSS в массив JSON объектов. Чтобы это сделать, просто подставим адрес RSS ленты в URL вида
https://tools.aimylogic.com/api/rss2json?url=RSS
Вместо RSS нужно подставить адрес нашей ленты. В итоге получим https://tools.aimylogic.com/api/rss2json?url=https://news.yandex.ru/computers.rss
Этот сервис вернет ответ вот в таком виде
[
{
"title": "«Ростех» поставил оптику на самый большой в Евразии телескоп",
"link": "https://news.yandex.ru/yandsearch?cl4url=sm-news.ru%2Fnews%2Fkosmos%2Frostekh-postavil-optiku-na-samyy-bolshoy-v-evrazii-teleskop%2F&from=rss",
"description": "До 1993 года БТА являлся крупнейшим телескопом в мире. Сегодня это самый большой оптический телескоп в Евразии."
},
{
"title": "Мессенджер WhatsApp запустил функцию групповых звонков",
"link": "https://news.yandex.ru/yandsearch?cl4url=www.astera.ru%2Fnews%2Fmessendzher-whatsapp-zapustil-funktsiyu-gruppovyh-zvonkov%2F&from=rss",
"description": "Как сообщает пресс-служба мессенджера, в среднем пользователи сервиса тратят 2 млрд минут в день, а теперь они могут объединять в один звонок до четырех пользователей мессенджера."
}
]
То есть массив, в котором каждый объект с полями из RSS ленты. То что нужно нашему боту!
Создаем бота
Откройте Aimylogic и создайте нового бота.На первом экране бот должен получить весь список новостей из ленты, а на следующих экранах рассказывать о них по порядку.
Поэтому добавим на первый экран блок HTTP запрос
Укажем в URL адрес, который мы сформировали ранее. А ответ от сервиса сохраним в переменную items — это будет наш массив статей из ленты.
Читаем статьи
Бот должен выдавать новости по одной, а не все сразу. То есть вывести заголовок первой новости и спросить пользователя, хочет ли он прочитать ее полностью. Если нет — то перейти к следующей. А если да — то вывести всю новость целиком.
На втором экране бот должен принять решение — выдать следующую новость, или сказать что в списке больше нет непрочитанных новостей.
Кликните на Завершен успешно в созданном блоке и добавьте на новый экран блок Условия. Он нужен, чтобы бот вытащил из массива items следующую запись и перешел к чтению ее заголовка.
Что тут происходит?
Первое условие $items.next() — вызывает функцию next на нашем массиве статей. Если там еще есть непрочитанные статьи, то условие сработает. И бот может перейти на следующий экран для чтения статьи.
Подробнее о функциях для работы с массивами в Aimylogic
Если бот прочитал уже все статьи, то условие не сработает, и бот попытается выполнить второе условие — $items.length. Оно сработает, если в массиве вообще что-нибудь есть. В этом случае бот может сказать, что просто нет свежих статей (то есть он уже прочитал все статьи).
Если же массив вообще пустой — то оба условия не выполнятся, и бот перейдет по ветке else. Это значит, что сервис вообще не вернул ни одной статьи. Бот может сказать пользователю, что пока мы ничего не опубликовали.
Читаем заголовок
Итак, бот получил массив статей и он не пустой. Значит сработает первое условие, которое поведет бота на экран, где он выведет заголовок следующей статьи.
Кликните на первое условие в получившемся блоке. Создастся новый экран. Мы добавим тут блок Текст, чтобы бот вывел заголовок очередной статьи.
Тут мы используем еще одну функцию — current — она вернет из массива items текущий объект (тот, на которой бот перешел в предыдущем блоке с помощью функции next).
В объекте есть поле title (заголовок статьи) — его и выводим пользователю.
Рассказать подробнее?
Заголовок — это только часть статьи, а сама новость хранится в поле description. Но она может быть объемной. П оэтому бот только показывает заголовок и после этого должен спросить «Рассказать подробнее?»
Добавьте на этот же экран еще один блок Текст
Добавьте несколько вариантов реплик — бот будет выбирать реплику случайным образом и таким образом разнообразит диалог.
Пользователь может ответить либо «Да», либо «Нет». Добавьте пару кнопок на экран и несколько фраз в блоке Интенты, чтобы пользователь мог попросить рассказать подробнее, повторить новость или двигаться дальше
Свяжите группы фраз Нет и Дальше с предыдущим экраном, а группу фраз Повтори с этим же экраном.