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

Как показать новости по запросу пользователя

Потребность

Часто пользователи желают смотреть только те новости, которые им интересны. Поэтому у пользователя должна быть возможность поиска.

Решение

Сделаем бота с возможностью поиска по новостной ленте и подключим его в канал Telegram. Сценарий:

Как это работает

На первом экране у нас блок Текст с приветствием и блок Фраз. В блоке Интенты напишем один пример — нашу системную сущность $TEXT — она принимает любой текст.

От Интента с сущностью $TEXT делаем следующий экран с блоком HTTP-запрос. В запросе мы будем обращаться к новостному порталу. В данном примере мы выбрали новости от Рамблера, так как там можно будет получить ответ в формате json. Для этого заходим в браузер Google Chrome, на странице Рамблер/новости нажимаем правую кнопку мыши и выбираем пункт «Просмотреть код». Откроется инспектор. Нажмите там на вкладку Network, чтобы увидеть все запросы, которые посылаются с данной страницы сайта. Теперь попробуйте что-нибудь поискать на сайте. Вы увидите в инспекторе, что поисковые запросы уходят по адресу такого вида:

https://nova.rambler.ru/localsearchv4/?query=запрос&from=0&size=10&project=news_media&timeout=6000

В результате запроса возвращается ответ в таком формате:

То есть JSON объект, в котором есть массив blocks, массив data — наш искомый массив найденных новостей. У каждой новости есть поле title_for_path — заголовок новости, URL — адрес полной статьи с сайта, массив tags — теги.

Теперь вернемся к нашему http-запросу. URL будет выглядеть так: https://nova.rambler.ru/localsearchv4/?query=${TEXT}&from=0&size=10&project=news_media&timeout=6000

Когда пользователь говорит фразу, бот автоматически сохраняет ее в переменную $TEXT и подставляет в URL запроса. Таким образом он получает новости, которые подходят под запрос.

Также добавьте переменную $result:

$httpResponse.blocks[0].data

Далее, от блока «HTTP-запрос завершен успешно» делаем блок Условие, и напишем $result.first() — берем первую новость.

От этого условия делаем новый экран. Добавим блок Текст, в котором выведем заголовок новости, а также хештеги. Выглядеть это будет так:

Также добавим на этот экран кнопку-ссылку «Читать подробности». Вставим в поле Ссылка — $result.current().url. Добавим кнопку «Далее», она будет листать новости.

От кнопки Далее, делаем блок Условие, напишем там $result.next() — берем следующую новость. От этого условия делаем связь с блоком, где выводим заголовок новости. Сделаем логику по ветке else на тот случай когда у нас закончатся новости по определенному запросу. В итоге у нас получится такая конструкция:

Вот и все, теперь можем посмотреть как это будет работать в Telegram: