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

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

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

В этом туториале мы создадим такой навык на 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 запросов и получать от них нужные данные.