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

В этом туториале мы создадим навык для голосового помощника Яндекс Алиса, который умеет сохранять заметки, а затем озвучивать их, когда попросит пользователь.

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

Вы можете попробовать этот навык, сказав Алисе "Запусти навык Заметки на холодильнике".





А вот так готовый навык выглядит в редакторе Aimylogic

Как работает навык

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

Где хранить заметки

Для того, чтобы ассистент мог озвучить ранее созданную заметку, ее текст нужно где-то сохранить. Переменные в Aimylogic привязаны к текущей сессии, и переменные пропадут после того, как сессия закончится. Поэтому текст заметки нужно уметь сохранять в какую-то внешнюю базу данных, которая умеет хранить данные вне зависимости от сессии.

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

mLab

Одним из таких сервисов по работе с базой MongoDB является mlab.com



На этом сервисе можно абсолютно бесплатно создавать базы данных объемом до 500 MB. Этого более чем достаточно для того, чтобы сохранять заметки от всех пользователей нашего навыка.

Еще одним плюсом является то, что у mLab есть HTTP API, а это значит, что боты созданные на Aimylogic могут без труда сохранять и получать данные с помощью блока HTTP запрос.

Создание базы данных

Первым делом нужно создать базу, в которую бот будет сохранять заметки пользователей. Зайдите на mlab.com и зарегистрируйтесь или войдите в свой аккаунт. Далее создайте новую базу данных с планом Sandbox



На следующем шаге выберите физическое месторасположение сервера с базой данных. Мы рекомендуем выбирать US East, так как он работает быстрее.



На последнем шаге придумайте базе данных название и создайте ее.

Ключ доступа к mLab

Чтобы бот мог получить доступ к данным в вашей базе на mLab, нужно получить ключ доступа. Для этого нажмите на ссылку с именем пользователя в правом верхнем углу экрана. Откроются настройки аккаунта. В самом низу страницы вы увидите секцию API key. Нажмите на кнопку "Enable Data API access", чтобы получить ключ. Он будет отображен в поле API key.



Создаем сценарий бота

Итак, переходим в Aimylogic и создаем нового бота. Откроется редактор сценария.

Первым делом бот должен вытащить из базы данных сохраненную заметку. Как это сделать?

Добавьте на первый экран блок HTTP запрос и в URL пропишите адрес в таком формате

https://api.mlab.com/api/1/databases/имя_вашей_базы_данных/collections/${userId}?apiKey=ключ

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

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

Коллекции вместо таблиц, JSON вместо SQL

Дело в том, что MongoDB - это noSQL база, поэтому в ней нет таблиц и SQL. Вместо этого в ней хранятся коллекции обычных JSON объектов, с которыми очень удобно работать в вашем боте. Мы просто запрашиваем массив JSON объектов из нужной коллекции. Если коллекции еще нет, то массив будет пустым.

Получаем заметку из базы

Такой запрос вернет нам массив JSON объектов. Либо пустой массив, если коллекции еще нет. Наш бот должен получить из этого массива только первый элемент, потому что наш навык должен уметь сохранять и озвучивать только одну заметку.

Добавьте на вкладке Response переменную с именем note и значением

$httpResponse.length ? $httpResponse[0].note : ""

Весь массив объектов сохраняется автоматически в системную переменную httpResponse. Каждый элемент в массиве - это не просто строка, а объект с полями. Мы будем сохранять текст заметки в поле note, поэтому его и вытаскиваем. Если массив пустой, то текст заметки так же будет пустой строкой, то есть "".

В результате у нас должна получиться примерно вот такая конфигурация HTTP запроса



Нажмите Сохранить и двигаемся дальше.

Создаем новую заметку или читаем эту

Итак, на первом экране бот получил заметку и сохранил ее в переменную $note. Если заметки еще нет, то в этой переменной будет пустая строчка. Теперь бот должен либо создать заметку, либо прочитать ее текст.

Здесь получается ветвление в сценарии бота, а это значит, что на втором экране нам потребуется блок Условия.

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



Здесь мы добавляем единственное условие - $note - оно сработает, если в переменной $note не пустая строка.

Нажмите на Сохранить и кликните на условие $note в создавшемся блоке. Добавится новый экран, на котором наш бот будет выводить текст заметки, если в $note что-то есть. Добавьте блок Текст из палитры блоков и напишите в нем примерно так



То есть бот подставит в ответ текст заметки из переменной $note и предложит ее переписать.

Теперь нажмите на Сохранить и кликните на else в блоке с условиями на предыдущем экране. Эта ветка сработает, если в переменной $note пустая строчка - то есть если пользователь еще ни разу не создавал заметку.

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



Нажмите на Сохранить. В итоге у нас первые четыре экрана в сценарии должны выглядеть вот так



Реакция пользователя

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

То есть после обоих исходов бот должен ожидать, что пользователь ответит "Да" или "Нет" на вопрос о создании/переписывании заметки.

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

На этом экране добавьте блок Фразы, в которых создайте две группы фраз - да и нет, как на скриншоте.



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

Пользователь отвечает "Да"

Итак, если пользователь хочет создать новую заметку или переписать старую, он просто отвечает "Да". После этого бот должен послушать текст заметки и сохранить ее в базе. Если же пользователь передумает, он может сказать слово "Отмена" или "Отменить", чтобы бот перестал его слушать.

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



Также добавьте блок Фразы, чтобы отреагировать на команду Отмены или послушать текст заметки.



Обратите внимание, что мы переключили кавычки на знак @ рядом с нашим примером фразы. Это сделано для того, чтобы бот не отменял создание заметки, если пользователь использует это слово или синонимы при диктовке текста.

Когда пользователь продиктует текст заметки, он сохранится в системную переменную $queryText, которую можно передать в запросе на сохранение заметки в базе данных.

Сохраняем заметку в базу данных

Кликните на Любая другая фраза в только что созданном блоке с фразами. Создастся новый экран, на который бот попадет, как только пользователь произнесет текст заметки.

На этом экране мы сохраним текст заметки в базе данных. Для этого добавьте HTTP запрос с такой конфигурацией



Укажите метод POST вместо GET (так как мы отправляем, а не получаем данные). В качестве URL укажите тот же, что мы указывали при получении заметки. На вкладке Body укажите JSON такого вида

{
"_id": "1",
"note": "$queryText"
}

Здесь _id - это обязательное поле для любого документа в MongoDB. Просто напишите там что угодно, так как мы все равно сохраняем только одну заметку на пользователя.

В поле note укажите "$queryText" (обязательно в кавычках) - это и есть продиктованный пользователем текст заметки.

На вкладке Headers обязательно добавьте заголовок с именем Content-Type и значением application/json



Нажмите Сохранить. В добавленном блоке кликните на Завершен успешно и добавьте текст, который бот скажет, когда сохранит заметку. Например вот так



Тестируем навык

У нас получился навык, который при старте произносит заметку и предлагает ее переписать, либо говорит что заметка еще не создана и предлагает создать ее.

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



Подключаем в Алису

Для тестирования в Яндекс Диалогах перед публикацией - просто перейдите в меню Каналы и создайте новый канал Алиса. Подробнее о том, как сделать из бота навык для Алисы, можно прочитать в разделе Яндекс Алиса.

Проблема с User ID

Теперь почти все готово, чтобы превратить нашего бота в навык для Алисы. Но есть одна проблема... В Алисе идентификаторы пользователей очень длинные. А наш бот использует этот идентификатор в качестве коллекции, в которой он будет хранить заметку пользователя. Если имя коллекции слишком длинное, то mLab просто вернет ошибку.

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

Зайдите в настройки бота и пропишите в поле "URL вашего вебхука" такой адрес

https://wt-6d0774537b9ad37723ccd256ccaf665c-0.sandbox.auth0-extend.com/aimylogic

Сохраните и вернитесь в редактор. На первом экране включите в правом верхнем углу экрана событие для вебхука и пропишите там get_collection



Затем в обоих блоках HTTP запрос в URL замените ${userId} на ${collection}.

Таким образом бот сперва получит подходящее имя коллекции на нашем вебхуке, а уже потом продолжит свою работу. Код нашего вебхука - это просто функция, которая из длинного userId делает более короткую строчку.

Тестируем в Алисе

Теперь можно перейти в Яндекс Диалоги и протестировать навык в интерфейсе Диалогов. Перед этим конечно же нужно указать адрес вебхука, который указан в настройках канала Алиса в Aimylogic.



Обратите внимание, что если перезагрузить страницу, то навык не потеряет ранее созданную заметку, так как бот сохранил ее текст в базе. Именно то, чего мы добивались в этом туториале.
Была ли эта статья полезна?
отменить
Спасибо!