Расширьте возможности своего Google Ассистента с помощью Google Actions и Go

Неделю назад я пытался создать Google Action на базе Go, и мне показалось странным, что не так много руководств / документов, посвященных этому с помощью языка программирования Go. Большинство примеров было в Node.js, а документация Dialogflow Go SDK была скудной.

Что ж, сегодня я здесь, чтобы восполнить пробел и показать вам, как создать собственную интеграцию Google Assistant с Go.

Давайте сразу же приступим.

Начните с создания действия Google

Полное раскрытие информации: я уже проделал это один раз с моим существующим проектом, но мы просто собираемся воссоздать функциональность с новым. Сначала мы начнем с настройки Google Action.

Начните с перехода в консоль Google Actions и создайте новый проект.

Я собираюсь прокрутить вниз до конца и выбрать «Разговорный».

Теперь мы собираемся нажать «Решить, как будет запускаться ваше действие».

Затем нам нужно дать Google название продукта, чтобы люди могли ссылаться на нашу интеграцию. Я собираюсь использовать "Gopher news" в качестве отображаемого имени .

Продолжите, нажав Сохранить.

Затем давайте добавим действие, нажав Действия слева.

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

Мы собираемся создать собственное намерение, выбрав «Особое намерение». Затем нажмите BUILD.

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

Вам будет предложено создать нового агента, и я рассматриваю это как намерение, хотя, вероятно, это неправильно (здесь много патентованной терминологии). Назовите любую цель ваших фраз. Моя будет «получить-мне-какие-новости-fam».

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

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

«Talk to gopher news» - это фраза, которую пользователь должен сказать, чтобы запустить наше приложение.

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

Отправка данных в Google через веб-перехватчик

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

Для этого приложения я хотел использовать карусельный интерфейс Google. Поэтому мне нужно было смоделировать ответ JSON после того, что упоминалось в документации. Благодаря этому проекту я нашел классный сайт под названием JSON to Go, который позволяет вставлять JSON. Затем он возвращает структуры Go.

Поэтому вместо того, чтобы создавать каждую структуру вручную, я скопировал то, что было на сайте Google, ссылка на который приведена выше. Затем я вставил его в JSON to Go и вуаля: была вся структура, которая мне нужна для формирования полезной нагрузки JSON для отправки обратно в Google.

Создание веб-перехватчика

Мой любимый веб-фреймворк для Go - Gin, поэтому мы будем использовать его в качестве веб-сервера для отправки ответов в формате JSON обратно в Google.

Итак, вот основа того, как будет выглядеть наше приложение.

Здесь мы говорим, что Gin собирается запустить веб-сервер (по умолчанию он будет прослушивать порт 8080) и прослушивать маршрут /webhook для POST запросов.

Когда делается POST запрос к /webhook (Google сделает это), вызывается функция handleWebhook.

Затем функция handleWebhook будет полагаться на Gin, чтобы отправить обратно код состояния HTTP 200 и заголовок типа содержимого application/json. Затем он упорядочит структуру, возвращаемую buildFulfillment(), в JSON.

Создание ответа JSON, совместимого с Google

Чтобы обеспечить выполнение, нам нужно взять типы, которые мы получили из JSON to Go ранее, и поместить их в наш types.go файл. Обратите внимание, что мне пришлось добавить несколько omitempty в свои ключи структуры, чтобы гарантировать удаление лишних значений, если они отсутствуют - иначе Google это не понравится.

Теперь, когда у нас есть типы, мы можем построить ответ. Чтобы избежать черной магии, мы будем использовать статические данные для ответа. На самом деле, вы наверняка создадите данные динамически (это сделано в моем связанном репозитории ниже).

Теперь поясните: это будет довольно вложенная структура, но, надеюсь, она должна дать точную картину того, что мы пытаемся достичь.

Вот buildFulfillment():

Теперь, когда вы все это сложите, вы можете запустить сервер с помощью go run и попасть на веб-сервер с помощью curl.

curl -s -X POST http://localhost:8080/webhook

Ура! Теперь у нас есть полезная нагрузка, совместимая с Google.

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

Развертывание вашего приложения Go

Теперь есть миллион способов запустить приложение Go. Лично я для простоты развернул свой webhook на Heroku.

Как бы вы ни решили развернуть его, это выходит за рамки этой части, но убедитесь, что Google сможет это сделать. Для тестирования я предпочитаю использовать webhook.site для возврата статических данных. Когда вы впервые заходите на сайт, вы можете нажать кнопку редактирования в правом верхнем углу и дать ему статические данные для возврата, а также заголовок content-type.

Настройка действия Google для использования нашего веб-перехватчика

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

Здесь мы использовали ссылку webhook.site, которая возвращает статический JSON, потому что я не смогу контролировать развертывание вашего приложения. Но как только вы перевернете включенный переключатель вверху и введете URL-адрес своего веб-перехватчика, нажмите Сохранить внизу (это меня несколько раз укусило). После сохранения нажмите Посмотреть, как это работает в Google Ассистенте в правом верхнем углу.

Затем выберите интерфейс телефона в симуляторе, потому что карусель просмотра будет работать только на устройствах Google Assistant, у которых есть выходы на экран.

Теперь, если вы заметили в левом нижнем углу, вы сможете взаимодействовать с симулятором помощника, используя зарезервированную фразу «Поговорите с моим тестовым приложением».

Еще один полезный лакомый кусочек: когда этот экран открыт, вы можете протестировать Google Action на реальных устройствах с поддержкой Google Assistant, подключенных к вашей учетной записи Google, сказав: «Хорошо, Google. Поговорите с моим тестовым приложением ».

Вот что мы получаем после ввода специальной фразы «Поговорите с моим тестовым приложением».

Теперь у нас есть карусель просмотра. Конечно, он пришел не напрямую из нашего приложения Go, но, тем не менее, ответ JSON такой же.

Завершите свое приложение и разверните

Наконец, вы захотите вернуться в Консоль Google Actions и заполнить всю оставшуюся информацию о своем приложении.

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

После того, как вы закончите заполнение всей необходимой информации для соответствия требованиям Google, вы можете отправить в Google на рассмотрение и надеяться, что они одобрят. Это должно быть одобрено, если вы не собираете какие-либо личные данные, не нарушаете права другой компании и т. Д.

Полезные ресурсы

Я написал это, чтобы помочь заполнить пробелы в том, чего, по моему мнению, не хватало при поиске интеграции с Google Assistant в Go. Надеюсь, это сэкономит ваше время!