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

Навык для поиска навыков

У помощника Яндекс Алиса уже очень много навыков. И пользователю нужно помочь найти нужный. Было бы здорово, если бы существовал навык, с помощью которого Алиса сама искала подходящие навыки в своем каталоге.

В этом туториале мы создадим такой навык на Aimylogic, и будем при этом использовать сразу несколько хитростей. Поехали!

Рабочий вариант

Мы уже опубликовали навык, сделанный по этому туториалу в каталоге Алисы. Вы можете посмотреть, как он работает, сказав Алисе «Запусти навык Поиск навыков».

Логика работы навыка

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

Где и как искать навыки

Итак, нам нужно для начала понять, как технически наш бот будет искать навыки по запросу пользователя. В Aimylogic есть блок HTTP запрос, с помощью которого можно отправлять запросы к любому сервису в Интернете и разбирать ответы.

Но куда отправлять запросы и как вытаскивать информацию о навыках?

Для этого мы зайдем на сайт Навыки Алисы, где Яндекс публикует все навыки.

Здесь же есть и поисковая строка, и меню категорий для навыков. Если попробовать что-то поискать, то каталог быстро выдаст список. Нам нужно узнать, на какой URL уходят HTTP запросы и в каком формате, чтобы потом использовать это в блоке HTTP запрос в сценарии нашего бота.

Залезаем под капот

Для этого в браузере Google Chrome на странице каталога навыков нажмем правую кнопку мыши и выберем пункт «Просмотреть код». Откроется инспектор. Нажмите там на вкладку Network, чтобы увидеть все запросы, которые посылаются с данной страницы сайта.

Теперь попробуйте что-нибудь поискать в каталоге. Вы увидите в инспекторе, что поисковые запросы уходят по адресу такого вида

https://dialogs.yandex.ru/store/api/dialogs/search?q=запрос

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

То есть JSON объект, в котором есть поле result, в котором есть массив items — наш искомый массив найденных навыков. У каждого из них есть name — название навыка и examples — примеры фраз, которыми он запускается.

Все что нам нужно! Теперь начинаем создавать бота!

Простая версия

Наша версия навыка будет просто искать навыки по запросу. Вот так этот вариант выглядит в редакторе Aimylogic

Бот предлагает поискать навыки и ждет, когда пользователь скажет что-нибудь. Далее ищет навык в каталоге и выдает название навыка и как им пользоваться, а также показывает кнопку «Еще варианты». При нажатии на нее — выдает следующий навык из найденных. И так до тех пор, пока не исчерпает весь список.

Создаем бота

Переходим в Aimylogic и создаем нового бота. На первый экран добавим приветствие (блок Текст)

Таким образом бот при старте сразу спросит пользователя, что он ищет.

Хитрость номер 1. В голосовых каналах всегда нужно говорить пользователю, чего мы от него ожидаем сейчас.

Поисковый запрос

Нажмите на Сохранить и добавьте на тот же экран блок Интенты

Добавьте в него шаблон $TEXT. Под этот шаблон подходит любая фраза. Когда пользователь скажет что-нибудь, то бот сохранит всю фразу в переменную $TEXT. Не забудьте поставить галочку «Глобальный блок». Нажмите на Сохранить.

Хитрость 2. Чтобы использовать шаблон $TEXT во фразах, нужно переключить переключатель «кавычки» на «@»

Ищем навыки

Теперь давайте научим нашего бота искать что-нибудь в каталоге навыков.

Кликните на блоке фраз с шаблоном $TEXT и на новом экране добавьте блок HTTP запрос

В поле URL пропишите такой адрес

https://dialogs.yandex.ru/store/api/dialogs/search?q=${TEXT}

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

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

$httpResponse.result.items

Так бот разберет ответ от поискового сервиса и сохранит в переменную items массив найденных навыков.

Показываем результаты поиска

Итак, наш бот поприветствовал пользователя, попросил его сказать, что он ищет, и сделал запрос к поисковому сервису Яндекса. Теперь нужно показать пользователю результаты поиска.

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

Функция first

Кликните на Завершен успешно в блоке HTTP запрос, чтобы создать экран, на который бот перейдет, если поисковый сервис отработал корректно. На новом экране добавьте блок Условия

Добавьте единственное условие вида

$items.first()

Функция first вернет первый элемент из массива, если массив не пуст. Таким образом бот пытается вытащить первый навык из результатов поиска, и если там что-то есть, то условие сработает, и бот перейдет на следующий экран.

Нажмите на Сохранить и кликните на условие $items.first, чтобы связать его с новым экраном, на котором бот должен рассказать о навыке.

Функция current

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

Тут бот вызывает функцию current, чтобы получить данные о текущем навыке из массива items.

Из поля name можно получить название навыка. В поле examples хранится массив с примерами запросов.

$items.current().name. Просто скажите Алисе - "$items.current().examples[0]".

Так бот формирует строку ответа, например

Футбольная игра Яндекса. Просто скажите Алисе — «запусти навык футбольная игра».

Функция next

Теперь нужно дать пользователю возможность послушать информацию о следующем найденном навыке. Для этого добавьте на этот же экран кнопку «Еще варианты». Кликните на нее, чтобы создать новый экран. На нем добавьте блок Условия

Здесь тоже только одно условие

$items.next()

Функция next переместит бота на следующий элемент в массиве items, если там еще есть элементы. А если нет — то условие не сработает. Так бот может перемещаться по массиву, перебирая все элементы друг за другом, и выдавая их пользователю по одному.

Нажмите на Сохранить и соедините это условие с экраном, на котором бот рассказывает о навыке

Так бот перейдет к следующему навыку из результата поиска и расскажет о нем пользователю.

Хитрость 3. С помощью вспомогательных функций first, next и current можно заставить бота перемещаться по любому массиву и вытаскивать из него данные.

Подробнее о дополнительных функциях для работы с массивами данных в Aimylogic можно прочитать здесь.

А если ничего не найдено

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

Для этого кликните на else в первом блоке с условиями (там где есть условие $items.first()). Создастся экран, на который нужно добавить текст с признанием в неудаче.

А если мы обо всем рассказали

Другой случай — это когда бот перебрал все элементы массива с результатами поиска и рассказал обо всех найденных навыках. Тогда функция next ничего не вернет и условие $items.next() не сработает.

Кликните на else во втором блоке условий (там где есть условие $items.next()) и на новом экране добавьте текст, в котором бот должен просто сказать, что это все навыки, которые ему удалось найти.

Тестируем!

Наконец-то можно потестить, что у нас получилось. Нажмите на кнопку Текст в правом верхнем углу экрана (или на кнопку микрофона, если вы хотите поговорить с вашим ботом, как в Алисе).

Бот поприветствует вас и спросит, что вы ищете. Далее можно написать (или сказать) что-нибудь. Если бот найдет подходящие навыки, то он выдаст информацию о нем и покажет кнопку «Еще варианты». Если на нее нажать, то бот расскажет о следующем подходящем навыке. Можно также в любой момент написать новый запрос — и бот должен попытаться найти что-нибудь снова.

Хитрость 4. Используйте голосовой тест, чтобы поговорить с вашим навыком до публикации в каталоге Яндекс Диалогов.

Итого

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