Как показать новости по запросу пользователя
Потребность
Часто пользователи желают смотреть только те новости, которые им интересны. Поэтому у пользователя должна быть возможность поиска.
Решение
Сделаем бота с возможностью поиска по новостной ленте и подключим его в канал 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: