Перейти к основному содержимому

Новостной бот

В этом коротком туториале мы научимся добавлять в любого бота одну из самых распространенных функций — чтение новостей. Бот сможет читать 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. Но она может быть объемной. Поэтому бот только показывает заголовок и после этого должен спросить «Рассказать подробнее?»

Добавьте на этот же экран еще один блок Текст

Добавьте несколько вариантов реплик — бот будет выбирать реплику случайным образом и таким образом разнообразит диалог.

Пользователь может ответить либо «Да», либо «Нет». Добавьте пару кнопок на экран и несколько фраз в блоке Интенты, чтобы пользователь мог попросить рассказать подробнее, повторить новость или двигаться дальше

Свяжите группы фраз Нет и Дальше с предыдущим экраном, а группу фраз Повтори с этим же экраном.

Читаем всю новость целиком​

Если же пользователь нажмет на кнопку Да или скажет Хочу, то бот должен вывести текст всей новости целиком. Кликните на группу фраз Хочу и добавьте на новый экран блок Текст

Здесь бот просто выводит поле description в текущем элементе массива items. Также добавьте кнопку Дальше и блок Интенты с группами Дальше и Повтори. Если пользователь попросит повторить — то бот снова выполнит этот же экран. А если скажет Дальше — то бот перейдет к экрану с условиями, выберет следующую новость и прочитает ее заголовок.

Тестируем сценарий​

Итак, у нас получился вот такой бот

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

В этом туториале мы научились добавлять в ботов функцию чтения статей из любой RSS ленты. Использовать функции для работы с массивами и разнообразить ответы бота с помощью дополнительных реплик в блоке Текст.