Расширьте возможности своего 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. Надеюсь, это сэкономит ваше время!