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

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

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