Привлекайте пользователей с помощью Action for Google Assistant

1. Обзор

Actions on Google — это платформа для разработчиков, позволяющая создавать программное обеспечение для расширения функциональности Google Assistant , виртуального личного помощника Google, на более чем миллиарде устройств, включая умные колонки, телефоны, автомобили, телевизоры, наушники и многое другое. Пользователи вовлекают Assistant в разговор, чтобы выполнить какие-либо задачи, например, купить продукты или заказать поездку. (Полный список возможностей см. в каталоге Actions .) Как разработчик, вы можете использовать Actions on Google для легкого создания и управления приятными и эффективными диалоговыми процессами между пользователями и вашим сторонним сервисом.

Это продвинутый модуль для практических занятий, предназначенный для читателей, уже имеющих опыт разработки Actions для Google Assistant. Если у вас нет опыта разработки с Actions on Google, мы настоятельно рекомендуем вам ознакомиться с платформой, выполнив наши вводные практические занятия ( Уровень 1 , Уровень 2 и Уровень 3 ). Эти продвинутые модули познакомят вас с рядом функций, которые помогут расширить функциональность Actions и расширить аудиторию.

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

В практической работе рассматриваются функции взаимодействия с пользователями и передовой опыт использования Actions on Google.

a3fc0061bd01a75.png961ef6e27dc73da2.png

Что вы построите

Вы улучшите уже существующую функцию, включив в нее следующие возможности:

  • Отправляйте пользователям ежедневные обновления, нажав на которые, они смогут связаться с вашим приложением.
  • Отправляйте пользователям push-уведомления, которые ссылаются на ваше действие
  • Создайте ссылку, которая перенаправит пользователей на ваше действие из мобильного веб-браузера.

Чему вы научитесь

  • Что такое вовлеченность пользователей и почему она важна для успеха действия
  • Как изменить действие, чтобы повысить вовлеченность пользователей
  • Какие функции взаимодействия с пользователем использовать в разных типах действий
  • Как использовать Actions API для отправки уведомлений через Assistant

Что вам понадобится

Вам необходимо иметь следующие инструменты:

  • IDE/текстовый редактор по вашему выбору, например WebStorm , Atom или Sublime
  • Терминал для запуска команд оболочки с установленными Node.js, npm и git
  • Веб-браузер, например Google Chrome
  • Локальная среда разработки с интерфейсом командной строки Firebase
  • Мобильное устройство (Android или iOS) с Ассистентом (вам необходимо войти в Ассистента, используя ту же учетную запись Google, которую вы будете использовать для создания этого проекта).

Также настоятельно рекомендуется, хотя и не обязательно, знание JavaScript (ES6) для понимания кода веб-перехватчика.

2. Настройте свой проект

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

Понять образец

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

На следующей диаграмме показан ход беседы в примере Action Gym:

e2d6e4ad98948cf3.png

Вы внесёте небольшие изменения в диалог, чтобы он лучше соответствовал добавленным функциям взаимодействия. Однако общий дизайн беседы не сильно изменится.

Загрузите ваши базовые файлы

Выполните следующую команду, чтобы клонировать репозиторий GitHub для данной кодовой лаборатории:

git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs

Настройте свой проект и агента

Чтобы настроить проект Actions и агент Dialogflow, выполните следующие действия:

  1. Откройте консоль действий .
  2. Нажмите «Новый проект» .
  3. Введите название проекта , например engagement-codelab .
  4. Нажмите «Создать проект» .
  5. Вместо того чтобы выбирать категорию, прокрутите вниз до раздела «Дополнительные параметры» и нажмите на карточку «Разговор» .
  6. Нажмите «Создать свое действие» , чтобы развернуть параметры, и выберите «Добавить действие(я)» .
  7. Нажмите «Добавить первое действие» .
  8. В диалоговом окне «Создать действие» выберите «Пользовательское намерение», а затем нажмите «Создать» , чтобы запустить консоль Dialogflow.
  9. На странице создания агента консоли Dialogflow нажмите кнопку Создать .
  10. Нажмите на 6bf56243a8a11a3b.png (значок шестеренки) на левой навигационной панели.
  11. Нажмите «Экспорт и импорт» , затем «Восстановить из Zip» .
  12. Загрузите файл agent.zip из каталога /user-engagement-codelab-nodejs/start/ вы скачали ранее.
  13. Введите RESTORE и нажмите Восстановить .
  14. Нажмите Готово .

Разверните свое выполнение

Теперь, когда ваш проект Actions и агент Dialogflow готовы, разверните локальный файл index.js с помощью Firebase Functions CLI.

Из каталога /user-engagement-codelab-nodejs/start/functions/ клона базовых файлов выполните следующие команды:

firebase use <PROJECT_ID>
npm install
firebase deploy

Через несколько минут вы должны увидеть сообщение « Развертывание завершено! », которое означает, что вы успешно развернули свой веб-перехватчик в Firebase.

Получить URL-адрес развертывания

Вам необходимо предоставить Dialogflow URL-адрес облачной функции. Чтобы получить этот URL-адрес, выполните следующие действия:

  1. Откройте консоль Firebase .
  2. Выберите свой проект Actions из списка вариантов.
  3. Перейдите в раздел «Разработка» > «Функции» на левой панели навигации. Если вам будет предложено выбрать параметры совместного доступа к данным, вы можете проигнорировать этот вариант, нажав «Сделать это позже ».
  4. На вкладке «Панель управления» вы увидите запись «Выполнение» с URL-адресом в поле «Триггер» . Сохраните этот URL-адрес; его нужно будет скопировать в Dialogflow в следующем разделе.

1741a329947975db.png

Установите URL-адрес веб-перехватчика в Dialogflow

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

  1. Откройте консоль Dialogflow (при желании консоль Firebase можно закрыть).
  2. Нажмите «Выполнение» на левой навигационной панели.
  3. Включить Webhook .
  4. Вставьте URL-адрес, скопированный с панели управления Firebase, если он еще не появился.
  5. Нажмите «Сохранить» .

Убедитесь, что ваш проект правильно настроен

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

Чтобы протестировать свое действие в симуляторе действий:

  1. В левой навигационной панели консоли Dialogflow нажмите Интеграции > Google Assistant .
  2. Убедитесь, что функция автоматического предварительного просмотра изменений включена, и нажмите кнопку «Тест» , чтобы обновить проект действий.
  3. Симулятор действий загрузит ваш проект действий. Чтобы протестировать действие, введите Talk to my test app в поле ввода и нажмите Enter.
  4. Вы увидите приветственный ответ от Action Gym. Следуйте подсказкам, чтобы продолжить диалог, и убедитесь, что на каждый ваш запрос есть ответ.

60acf1ff87b1a87f.png

3. Добавьте подписку на ежедневные обновления.

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

На этом этапе вы узнаете о подписках на ежедневные обновления и добавите их в намерение «Список классов» вашего действия. После выполнения этих инструкций диалог вашего действия будет выглядеть следующим образом:

f48891c8118f7436.png

Как это привлечет пользователей?

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

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

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

Включить ежедневные обновления

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

Выполните следующие шаги, чтобы включить ежедневные обновления для намерения « Список классов» :

  1. В консоли «Действия» откройте вкладку «Разработка» и выберите «Действия» на левой панели навигации.
  2. Нажмите «Список классов» под списком «Действия» .
  3. В разделе «Вовлеченность пользователей» включите опцию «Хотите ли вы предлагать пользователям ежедневные обновления?» .
  4. Задайте описательный заголовок контента , описывающий ежедневные обновления. Контекст будет таким: «Во сколько вы хотите, чтобы я отправлял вам ежедневные новости?», поэтому убедитесь, что заголовок описательный и правильно произносится вслух. В этом примере задайте заголовок контента « list of upcoming Action Gym classes .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

c00885cc30e14d68.png

Настройка Dialogflow

Выполните следующие действия в консоли Dialogflow, чтобы создать намерения для потока подписки на ежедневные обновления:

Предложить пользователю подписаться

  1. Создайте новое намерение для обработки запроса пользователя на подписку на ежедневные обновления. В консоли Dialogflow нажмите кнопку «+» рядом с разделом «Намерения» в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Setup Updates .
  3. В разделе «Фразы обучения» добавьте следующие пользовательские выражения :
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  2. Нажмите кнопку «Сохранить» в верхней части страницы.

5c70faa02151da0.png

Обрабатывать решение пользователя

  1. Создайте новое намерение для обработки ответа пользователя на запрос подписки на ежедневные обновления. Нажмите кнопку «+» рядом с разделом «Намерения» в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Confirm Updates .
  3. В разделе «События» добавьте actions_intent_REGISTER_UPDATE . Это событие Dialogflow будет инициировано пользователем, завершившим подписку на ежедневные обновления, независимо от того, оформил ли он подписку или нет.
  4. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

b871c2bdadac8abc.png

Реализовать выполнение

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

Зависимости загрузки

b2f84ff91b0e1396.png В файле index.js обновите функцию require() , чтобы добавить пакет RegisterUpdate из пакета actions-on-google , чтобы ваш импорт выглядел следующим образом:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
} = require('actions-on-google');

Обновление фишек предложений

b2f84ff91b0e1396.png В файле index.js добавьте запись DAILY в список заголовков чипов предложений, чтобы определение Suggestion выглядело следующим образом:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
};

Добавьте реализацию новых намерений

Когда пользователь захочет подписаться, запустите процесс подписки на ежедневные обновления, вызвав вспомогательный метод RegisterUpdate с указанием целевого намерения обновления ( Class List ) и типа ( DAILY ). После завершения процесса подписки Помощник активирует событие actions_intent_REGISTER_UPDATE с аргументом status , который описывает, была ли подписка успешной или нет. Предлагайте пользователю подсказки для дальнейших действий, которые меняются в зависимости от статуса подписки.

b2f84ff91b0e1396.png В файл index.js добавьте следующий код:

index.js

// Start opt-in flow for daily updates
app.intent('Setup Updates', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'Class List',
    frequency: 'DAILY',
  }));
});

// Confirm outcome of opt-in for daily updates
app.intent('Confirm Updates', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
     conv.ask(`Gotcha, I'll send you an update everyday with the ` +
     'list of classes. Can I help you with anything else?');
  } else {
    conv.ask(` I won't send you daily reminders. Can I help you with anything else?`);
  }
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS, Suggestion.CLASSES]));
  }
});

Предлагайте альтернативные подсказки для пользователя

В конце вашего ответа на Class List будет предложена подписка на ежедневные обновления, но это создаёт проблему. Поскольку этот же ответ будет срабатывать при нажатии пользователем на уведомление о ежедневном обновлении, пользователю всё равно будет предложено подписаться на ежедневные обновления, даже если он только что получил одно из них. Как сделать так, чтобы пользователь не думал, что ему нужно подписаться снова?

К счастью, аргументы вашего conv -объекта содержат информацию о том, где пользователь начал диалог. Вы можете проверить аргументы conv на наличие раздела UPDATES , указывающего на то, что пользователь начал диалог с уведомления о ежедневном обновлении, и соответствующим образом изменить ответ. Вы также можете использовать эту ветку диалога, чтобы закрыть диалог сразу после предоставления списка классов, что соответствует нашей рекомендации — делать ежедневное обновление коротким.

b2f84ff91b0e1396.png В файле index.js замените следующий код:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  const classesMessage =
  `On ${day} we offer the following classes: ${classes}. ` +
  `Can I help you with anything else?`;
  conv.ask(classesMessage);
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS]));
  }
});

с этим:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

Тестируйте ежедневные обновления

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

firebase deploy

Чтобы протестировать пользовательскую подсказку в симуляторе действий, выполните следующие действия:

  1. В консоли действий перейдите к пункту Тест .
  2. Введите Talk to my test app в поле ввода и нажмите Enter.
  3. Введите Learn about classes и нажмите Enter. Теперь ответ вашего действия должен предлагать ежедневную отправку напоминаний.
  4. Введите Send daily reminders и нажмите Enter.
  5. Введите время, когда вы хотели бы увидеть обновление, и нажмите Enter. Для проверки попробуйте ответить на 3–5 минут позже текущего времени.

83a15ecac8c71787.png

На вашем мобильном устройстве вы получите уведомление от Ассистента примерно в указанное вами время для обновления. Обратите внимание, что это уведомление может появиться через несколько минут. Нажмите на уведомление, и оно перенаправит вас на намерение «Список занятий» в Ассистенте, где будет представлен список предстоящих занятий:

8582482eafc67d5b.png

4. Добавьте push-уведомления

Ещё один способ взаимодействия с пользователями за пределами вашего действия — использовать API действий для отправки push-уведомлений . В отличие от ежедневных обновлений, эти уведомления не планируются Ассистентом автоматически, поэтому вы можете отправлять их по своему усмотрению.

На этом этапе вы узнаете, как реализовать push-уведомления в вашем действии, добавив новое намерение «Класс отменен» и отправив пользователям уведомления об отмене курса. Вы также настроите следующие три компонента, необходимые для отправки уведомлений:

  • Учетная запись API действий . Вы отправляете уведомления пользователю, отправляя запрос POST к API, поэтому вам потребуется настроить учетную запись службы и учетные данные для взаимодействия с этим API.
  • Помощник по работе с разрешениями — вам необходимо разрешение пользователя на доступ к идентификатору, необходимому для отправки push-уведомлений. В этом примере вы используете функцию клиентской библиотеки для вызова помощника по работе с разрешениями и запроса этого идентификатора.
  • Хранилище . Чтобы отправлять push-уведомления пользователю вне чата, необходимо хранить идентификаторы пользователей в месте, откуда их можно будет легко вызвать. В этом примере мы настроим базу данных Firestore для хранения информации о каждом пользователе.

После выполнения этих инструкций вы добавите следующий диалог в беседу вашего Действия:

7c9d4b633c547823.png

Как это привлечет пользователей?

Пользователи смартфонов, вероятно, знакомы с push-уведомлениями, которые предоставляют информацию и обновления, относящиеся к приложениям. Push-уведомления — это гибкий способ доступа к пользователям мобильных устройств за пределами Ассистента, при условии, что у пользователей есть веская причина включить их. При ежедневных обновлениях пользователи уже знают, что будут получать уведомления ежедневно. Однако при использовании push-уведомлений пользователи не знают, соглашаются ли они получать уведомления редко или будут получать их по несколько раз в день.

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

  • Запланируйте несколько примеров расписания push-уведомлений. Если вы планируете отправлять только одно push-уведомление в день, рассмотрите возможность использования ежедневных обновлений.
  • Убедитесь, что ваши push-уведомления будут предоставлять полезную информацию при каждом получении. Уведомления также могут ссылаться на одно из намерений вашего действия, поэтому убедитесь, что намерение полезно и релевантно.
  • Просите пользователя подписаться на push-уведомления, давая ему чёткую информацию. Он должен понимать, чего ожидать от каждого push-уведомления, и иметь представление о частоте их отправки.

Включить API действий

  1. Откройте консоль Google Cloud и выберите название своего проекта Actions в раскрывающемся списке.

d015c1515b99e3db.png

  1. В навигационном меню ( ☰) перейдите в раздел API и службы > Библиотека.
  2. Найдите Actions API и нажмите Включить .

6d464f49c88e70b4.png

Создать учетную запись службы

API Actions требует аутентификации, поэтому для отправки запросов необходимо создать учётную запись службы. Чтобы создать и установить ключ учётной записи службы для API Actions, выполните следующие действия:

  1. В навигационном меню Google Cloud Console (☰) перейдите в раздел API и службы > Учетные данные .
  2. Нажмите Создать учетные данные > Ключ учетной записи службы .
  3. В раскрывающемся меню Учетная запись службы выберите Новая учетная запись службы.
  4. Заполните следующую информацию:
  • Имя учетной записи службы : service-account
  • Роль : Проект > Владелец
  • Идентификатор учетной записи службы: service-account (всегда сопровождается @<project_id>.iam.gserviceaccount.com)
  • Тип ключа : JSON
  1. Нажмите «Создать».
  2. Переместите загруженный JSON-файл в каталог /user-engagement-codelab/start/functions/ вашего проекта.
  3. Переименуйте JSON-файл в service-account.json .

d9bd79d35691de3a.png

Включить Firestore

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

Чтобы создать базу данных Firestore для вашего действия, выполните следующие действия:

  1. В консоли Firebase выберите имя вашего проекта Actions.
  2. В левой навигационной панели выберите Разработка > База данных и нажмите Создать базу данных .
  3. Выберите Запустить в тестовом режиме .
  4. Нажмите «Включить» .

6dfc386413954caa.png

Настройка Dialogflow

Чтобы создать процесс подписки на push-уведомления, выполните следующие действия в консоли Dialogflow:

Предложить пользователю подписаться

  1. Создайте новое намерение для обработки запроса пользователя на подписку на push-уведомления об отменённых занятиях. В консоли Dialogflow нажмите кнопку «+» рядом с разделом «Намерения» в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Setup Push Notifications .
  3. В разделе «Фразы обучения» добавьте следующие пользовательские выражения :
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  2. Нажмите кнопку «Сохранить» в верхней части страницы.

3d99bc41d0492552.png

Обрабатывать решение пользователя

  1. Настройте новое намерение для обработки ответа пользователя на запрос подписки на push-уведомления. Нажмите кнопку «+» рядом с разделом «Намерения» в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Confirm Push Notifications .
  3. В разделе «События» добавьте actions_intent_PERMISSION . Это событие Dialogflow будет вызвано, когда пользователь завершит процесс подписки на push-уведомления, независимо от того, оформил ли он подписку или нет.
  4. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

d37f550c5e07cb73.png

Обработка push-уведомлений

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

Выполните следующие действия, чтобы добавить намерение, которое будет активироваться при нажатии пользователем push-уведомления:

  1. В консоли Dialogflow нажмите кнопку + рядом с пунктом Намерения в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Class Canceled .
  3. В разделе Фразы обучения добавьте Cancelations как пользовательское выражение .
  4. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

940379556f559631.png

Отправлять тестовые уведомления во время разговора

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

Чтобы создать намерение для тестирования push-уведомлений, выполните следующие действия:

  1. Для тестирования и отладки создайте новое намерение, позволяющее отправлять push-уведомления подписчикам. В консоли Dialogflow нажмите кнопку «+» рядом с разделом «Намерения» в левой навигационной панели, чтобы создать новое намерение.
  2. Назовите это новое намерение Test Notification .
  3. В разделе Фразы обучения добавьте Test notification как выражение пользователя .
  4. В разделе «Выполнение» включите опцию Включить вызов веб-перехватчика для этого намерения .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

6967f5a997643eb8.png

Включить push-уведомления

Выполните следующие действия, чтобы включить push-уведомления для намерения «Класс отменен» :

  1. В консоли Dialogflow перейдите в раздел Интеграции на панели навигации.
  2. На карточке Google Ассистента нажмите Настройки интеграции .
  3. Добавьте «Класс отменен» в качестве неявного намерения вызова . Этот шаг необходим для того, чтобы Dialogflow распознавал, что пользователи могут начать диалог с намерением « Класс отменен» (нажав на push-уведомление).
  4. Нажмите «Закрыть» .

1ac725231ed279a1.png

  1. В консоли «Действия» откройте вкладку «Разработка» и выберите «Действия» на левой панели навигации.
  2. Нажмите «Занятие отменено» под списком действий .
  3. В разделе «Взаимодействие с пользователями» включите опцию « Хотите ли вы отправлять push-уведомления?» .
  4. Задайте описательный заголовок контента , описывающий push-уведомление. Контекст будет таким: «Можно ли отправлять push-уведомления для ?», поэтому убедитесь, что заголовок описательный и правильно произносится вслух. В этом примере задайте заголовок контента « class cancelations .
  5. Нажмите кнопку «Сохранить» в верхней части страницы.

4304c7cd575f6de3.png

Реализовать выполнение

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

Зависимости загрузки

b2f84ff91b0e1396.png В файле index.js обновите функцию require() , чтобы добавить пакет UpdatePermission из пакета actions-on-google , чтобы ваш импорт выглядел следующим образом:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
  UpdatePermission,
} = require('actions-on-google');

Обновление фишек предложений

b2f84ff91b0e1396.png В файле index.js добавьте запись NOTIFICATIONS в список заголовков чипов предложений, чтобы определение Suggestion выглядело следующим образом:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
  NOTIFICATIONS: 'Get notifications',
};

Настройте новый импорт

Чтобы подключиться к базе данных Firestore, добавьте пакет firebase-admin и константы для полей, хранящихся в базе данных. Также импортируйте пакеты google-auth-library и request для обработки аутентификации и запросов к Actions API.

b2f84ff91b0e1396.png В файле index.js добавьте следующий код к вашим импортам:

index.js

// Firebase admin import
const admin = require('firebase-admin');

// Initialize Firestore
admin.initializeApp();
const db = admin.firestore();

// Firestore constants
const FirestoreNames = {
 INTENT: 'intent',
 USER_ID: 'userId',
 USERS: 'users',
};

// Actions API authentication imports
const {auth} = require('google-auth-library');
const request = require('request');

Предложение настроить уведомления об отмене занятий

b2f84ff91b0e1396.png В файле index.js замените следующий код:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

с этим:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like to receive daily reminders of upcoming classes, subscribe to notifications about cancelations, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.NOTIFICATIONS,
Suggestion.HOURS]));
    };
  };
});

Добавьте реализацию новых намерений

Когда пользователь хочет подписаться на push-уведомления, вызовите вспомогательный метод UpdatePermission , чтобы запросить разрешение. В случае успеха аргумент PERMISSION будет добавлен к аргументам объекта conv , которые можно проверить, чтобы изменить ход обсуждения.

Получив разрешение пользователя, извлеките его идентификатор из аргументов объекта conv и сохраните его в базе данных. Позже вы отправите этот идентификатор в Actions API, и именно по нему Помощник определит, кто получает уведомление.

Наконец, добавьте выполнение для намерения Class Canceled , которое активируется при нажатии на push-уведомление. В этом примере ваш ответ представляет собой строку-заполнитель, хотя в версии этого действия, готовой к использованию, ваш скрипт уведомления будет предоставлять более динамичную информацию об отменённом классе.

b2f84ff91b0e1396.png В файл index.js добавьте следующий код:

index.js

// Call the User Information helper for permission to send push notifications
app.intent('Setup Push Notifications', (conv) => {
 conv.ask('Update permission for setting up push notifications');
 conv.ask(new UpdatePermission({intent: 'Class Canceled'}));
});

// Handle opt-in or rejection of push notifications
app.intent('Confirm Push Notifications', (conv) => {
 if (conv.arguments.get('PERMISSION')) {
   let userId = conv.arguments.get('UPDATES_USER_ID');
   if (!userId) {
     userId = conv.request.conversation.conversationId;
   }
   // Add the current conversation ID and the notification's
   // target intent to the Firestore database.
   return db.collection(FirestoreNames.USERS)
   .add({
     [FirestoreNames.INTENT]: 'Class Canceled',
     [FirestoreNames.USER_ID]: userId,
   })
   .then(() => {
     conv.ask(`Great, I'll notify you whenever there's a class cancelation. ` +
     'Can I help you with anything else?');
   });
 } else {
   conv.ask(`Okay, I won't send you notifications about class cancelations. ` +
     'Can I help you with anything else?');
 }
 if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.CLASSES, Suggestion.HOURS]));
  }
});

// Intent triggered by tapping the push notification
app.intent('Class Canceled', (conv) => {
 conv.ask('Classname at classtime has been canceled.');
});

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

Чтобы отправить пользователю push-уведомление, отправьте POST запрос к Actions API с идентификатором пользователя, заголовком уведомления и целевым намерением. В этом примере запуск намерения «Тестовое уведомление» пройдёт по базе данных Firestore и отправит push-уведомления всем пользователям, подписанным на уведомления.

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

b2f84ff91b0e1396.png В файл index.js добавьте следующий код:

index.js

// Debug intent to trigger a test push notification
app.intent('Test Notification', (conv) => {
 // Use the Actions API to send a Google Assistant push notification.
 let client = auth.fromJSON(require('./service-account.json'));
 client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
 let notification = {
   userNotification: {
     title: 'Test Notification from Action Gym',
   },
   target: {},
 };
 client.authorize((err, tokens) => {
   if (err) {
     throw new Error(`Auth error: ${err}`);
   }
   // Iterate through Firestore and send push notifications to every user
   // who's currently opted in to canceled class notifications.
   db.collection(FirestoreNames.USERS)
       .where(FirestoreNames.INTENT, '==', 'Class Canceled')
       .get()
       .then((querySnapshot) => {
         querySnapshot.forEach((user) => {
           notification.target = {
             userId: user.get(FirestoreNames.USER_ID),
             intent: user.get(FirestoreNames.INTENT),
           };
           request.post('https://actions.googleapis.com/v2/conversations:send', {
             'auth': {
               'bearer': tokens.access_token,
             },
             'json': true,
             'body': {'customPushMessage': notification, 'isInSandbox': true},
           }, (err, httpResponse, body) => {
             if (err) {
               throw new Error(`API request error: ${err}`);
             }
             console.log(`${httpResponse.statusCode}: ` +
               `${httpResponse.statusMessage}`);
             console.log(JSON.stringify(body));
           });
         });
       })
       .catch((error) => {
         throw new Error(`Firestore query error: ${error}`);
       });
 });
 conv.ask('A notification has been sent to all subscribed users.');
});

Протестируйте свои push-уведомления

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

firebase deploy

Чтобы протестировать уведомления в симуляторе действий, выполните следующие действия:

  1. В консоли Действия перейдите на вкладку Тест .
  2. Введите Talk to my test app в поле ввода и нажмите Enter.
  3. Введите Learn about classes и нажмите Enter.
  4. Введите Get notifications и нажмите Enter.
  5. Если вы еще не предоставили своему приложению разрешение на отправку вам push-уведомлений, введите yes и нажмите Enter.
  6. Введите yes и нажмите Enter. Теперь ваш аккаунт Google должен быть подписан на push-уведомления для этого действия.

3a8704bdc0bcbb17.png

  1. Введите no и нажмите Enter, чтобы выйти.
  2. Введите Talk to my test app и нажмите Enter, чтобы начать новый разговор.
  3. Введите Test notification и нажмите Enter.

634dfcb0be8dfdec.png

В течение нескольких минут вы получите push-уведомление от помощника Action Gym «Тестовое уведомление от Action Gym» на своё мобильное устройство. Нажатие на это уведомление перенаправит вас к намерению «Занятие отменено» вашего действия.

33cbde513c10122e.png

5. Создайте ссылку на помощника

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

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

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

Как это привлечет пользователей?

Привлечение пользователей к вашему действию в первый раз может быть сложной задачей, особенно если им нужно явно вызвать его в Ассистенте. Ссылка на Ассистента устраняет эту проблему, предоставляя пользователям прямую ссылку на ваше действие. Когда пользователь переходит по ссылке на Ассистенте на устройстве с поддержкой Ассистента, он сразу попадает на ваше действие. Когда пользователь открывает вашу ссылку на стационарном устройстве или любом другом устройстве, не поддерживающем Ассистента, он всё равно попадает на страницу каталога действий (если она опубликована), поэтому ссылка может рекламировать ваше действие этим пользователям.

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

  • Помощники ссылок работают только после публикации ваших действий. В то время как ваш проект находится в проекте штата, ссылка будет работать только на ваших собственных устройствах. Любой другой будет доставлен на страницу 404 в каталоге действий.
  • Вы можете позволить пользователям тестировать помощник ссылки до публикации, выпустив ваше действие в альфа -или бета -среде . Обратите внимание, что только пользователи, которые участвуют в вашей альфа или бета -версии, смогут проверить вашу ссылку «Помощник».
  • Убедитесь, что намерение пункта назначения для вашей ассистентной ссылки производит хорошее первое впечатление с новыми пользователями. Ваше приветственное намерение - пункт назначения по умолчанию для ассистентной ссылки, потому что она уже должна хорошо представить ваше действие

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

  1. В консоли «Действия» нажмите на вкладку «Разработать» и выберите «Действия» в левой навигационной панели.
  2. Нажмите на actions.intent.main в списке действий .
  3. В разделе «Ссылки» переключите бы, что вы хотели бы включить URL для этой опции действия .
  4. Установите название описательной ссылки , которое описывает ваше действие. Сделайте свой заголовок простой парой глаголов, которая описывает то, что пользователь может достичь с помощью вашего действия. Для этого примера установите заголовок ссылки , чтобы learn about Action Gym .
  5. Скопируйте фрагмент HTML от нижней части этой страницы и сохраните его на потом.
  6. Нажмите Сохранить в верхней части страницы.

55341b8102b71eab.png

Развернуть тестовый веб -сайт

Чтобы проверить свою ссылку «Помощник», вы можете использовать инструменты Firebase для развертывания тестового веб -сайта вместе с вашим выполнением. Мы уже создали простой тестовый веб -сайт для этого примера, вам просто нужно добавить свою ссылку «Помощник».

Перейдите к вашему исполнению /user-engagement-codelab-nodejs/start/public/ Directory и откройте файл index.html в текстовом редакторе.

b2f84ff91b0e1396.png В файле index.html вставьте фрагмент HTML вашей помощника ссылки в элемент кузова. Файл должен в конечном итоге выглядеть как фрагмент ниже:

index.html

<body>
    <p>
     <a href="https://assistant.google.com/services/invoke/uid/000000efb5f2fd97">🅖 Ask my test app to learn about Action Gym
     </a>
    </p>
</body>

В терминале запустите следующую команду для развертывания вашего тестового веб -сайта в Firebase:

firebase deploy

Как только команда развертывания завершится запуска, обратите внимание на URL -адрес хостинга в выводе.

B01E8D322FB5D623.png

Перейдите к этому URL -адресу в веб -браузере вашего мобильного устройства, и вы должны увидеть ссылку «Помощник» на вашем тестовом веб -сайте. Нажатие по этой ссылке на вашем мобильном устройстве должно перенести вас к принужденному намерению вашего действия в Assistant.

599845d647f5b624.png

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

6. Следующие шаги

Поздравляю!

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

Дополнительные учебные ресурсы

Изучите эти ресурсы, чтобы узнать больше о вовлечении пользователей для ваших действий:

Следите за нами в Twitter @Actchongoogle, чтобы следить за обновлениями на наши последние объявления, и твитнуть #AogDevs , чтобы поделиться тем, что вы создали!

Опрос обратной связи

Прежде чем уйти, пожалуйста, заполните эту форму, чтобы сообщить нам, как у нас дела!

,

1. Обзор

Действия на Google - это платформа разработчиков, которая позволяет создавать программное обеспечение для расширения функциональности Google Assistant , виртуального личного помощника Google, на более чем 1 миллиардах устройств, включая умные динамики, телефоны, автомобили, телевизоры, наушники и многое другое. Пользователи вовлекают помощника в разговор, чтобы добиться успеха, например, покупка продуктов или бронирование поездки. (Полный список того, что возможно, см. Справочник по действию .) Как разработчик, вы можете использовать действия в Google, чтобы легко создавать и управлять восхитительным и эффективным опытом разговора между пользователями и вашей сторонней службой.

Это расширенный модуль CodeLab, предназначенный для читателей, у которых уже есть некоторые опыт построения построения для помощника Google. Если у вас нет предварительного опыта разработки с действиями в Google, мы настоятельно рекомендуем вам ознакомиться с платформой, следуя нашим вступительным CodeLabs ( уровень 1 , уровень 2 и уровень 3 ). Эти передовые модули помогут вам через серию функций, которые помогут вам расширить функциональность ваших действий и расширить вашу аудиторию.

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

CodeLab освещает функции пользователя и лучшие практики для действий в Google.

A3FC0061BD01A75.PNG961EF6E27DC73DA2.png

Что вы построите

Вы улучшите функцию, которая уже была создана, позволяя ей:

  • Отправляйте пользователям ежедневное обновление, которое они могут нажать, чтобы поговорить с вашим действием
  • Отправить пользователям толкайте уведомления, которые ссылаются на ваше действие
  • Создайте ссылку, которая приводит пользователей на ваше действие из мобильного веб -браузера

Чему вы научитесь

  • Что такое вовлечение пользователей и почему это важно для успеха действия
  • Как изменить действие для увеличения вовлечения пользователей
  • Какие функции взаимодействия с пользователем использовать в разных видах действий
  • Как использовать API действий для отправки уведомлений через помощника

Что вам понадобится

У вас должны быть следующие инструменты:

  • IDE/Text Editor по вашему выбору, такой как Webstorm , Atom или Sublime
  • Терминал для запуска команд оболочки с установленными node.js, npm и git
  • Веб -браузер, такой как Google Chrome
  • Местная среда разработки с интерфейсом командной строки Firebase
  • Мобильное устройство (Android или iOS) с помощником (вы должны быть подписаны для помощника с той же учетной записью Google, что вы используете для создания этого проекта.)

Знакомство с JavaScript (ES6) также настоятельно рекомендуется, хотя и не требуется, чтобы понять код WebHook.

2. Настройте свой проект

В этом разделе показано, как добавить функции взаимодействия с пользователями в полное, ранее созданное действие.

Понять выборку

Образец для этого CodeLab - это простое действие для вымышленного спортзала под названием «Action Gym». Действие предоставляет информацию о спортзале, включая список классов, которые вращаются каждый день. Такое информативное действие, как это, является хорошим кандидатом на все функции использования пользователя, поскольку в списке вращающихся классов каждый день дает различную полезную информацию.

На следующей диаграмме показывается разговорной поток образца для тренажерного зала:

e2d6e4ad98948cf3.png

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

Загрузите базовые файлы

Запустите следующую команду, чтобы клонировать репозиторий GitHub для CodeLab:

git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs

Настройте свой проект и агент

Чтобы настроить проект и агент Dialogflow, выполните следующие шаги:

  1. Откройте консоль действий .
  2. Нажмите на новый проект .
  3. Введите название проекта , например engagement-codelab .
  4. Нажмите «Создать проект» .
  5. Вместо того, чтобы выбирать категорию, прокрутите вниз в раздел «Больше параметров» и нажмите на разговорную карту.
  6. Нажмите «Создать свое действие» , чтобы расширить параметры и выберите «Добавить действия» .
  7. Нажмите Добавить свое первое действие .
  8. В диалоговом окне «Создать действие» выберите «Пользовательские намерения», а затем нажмите «Создать» , чтобы запустить консоли диалога.
  9. На странице создания агента консоли диалога, нажмите «Создать» .
  10. Нажмите 6BF56243A8A11A3B.PNG (Значок передачи) На левой навигации.
  11. Нажмите «Экспорт и импорт» , затем восстановите из Zip .
  12. Загрузите файл agent.zip из /user-engagement-codelab-nodejs/start/ каталог, который вы скачаете ранее.
  13. Введите RESTORE и нажмите «Восстановить» .
  14. Нажмите Готово .

Развернуть свое выполнение

Теперь, когда ваши действия Project и Agent Dialogflow готовы, разверните свой локальный файл index.js , используя CLI функций Firebase.

Из /user-engagement-codelab-nodejs/start/functions/ Directory вашего базового файла клона, запустите следующие команды:

firebase use <PROJECT_ID>
npm install
firebase deploy

Через несколько минут вы должны увидеть « развернуть полное! », Что указывает на то, что вы успешно развернули свой веб -крюк в Firebase.

Получить URL -адрес

Вам необходимо предоставить Dialogflow с URL для облачной функции. Чтобы получить этот URL, следуйте этим шагам:

  1. Откройте консоли Firebase .
  2. Выберите свой проект «Действия» из списка параметров.
  3. Перейдите к разработке> функций в левой навигационной панели. Если вам предложено «выбрать параметры обмена данными», вы можете игнорировать эту опцию, нажав на это позже .
  4. Под вкладкой Dashboard вы должны увидеть запись для «удовлетворения» с URL -адресом под триггером . Сохранить этот URL; Вам нужно будет скопировать его в Dialogflow в следующем разделе.

1741a329947975db.png

Установите URL -адрес webhook в Dialogflow

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

  1. Откройте консоль диалога (вы можете закрыть консоль Firebase, если хотите).
  2. Нажмите на выполнение на левой навигации.
  3. Включить веб -крюк .
  4. Вставьте URL, который вы скопировали с панели панели Firebase, если он еще не появится.
  5. Нажмите Сохранить .

Убедитесь, что ваш проект правильно настроен

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

Чтобы проверить ваше действие в симуляторе действий:

  1. В левой навигации «Консоль диалога» нажмите на интеграции > Google Assistant .
  2. Убедитесь, что автоматические изменения включены и нажмите «Тест» , чтобы обновить свой проект действий.
  3. Симулятор действий загружает проект вашего действия. Чтобы проверить свое действие, введите Talk to my test app в поле ввода и нажмите Enter.
  4. Вы должны увидеть ответ, который приветствует вас в тренажерном зале. Попробуйте следить за поступками, чтобы продолжить разговор, чтобы убедиться, что ваше выполнение имеет ответ для каждого ввода.

60ACF1FF87B1A87F.PNG

3. Добавить подписки на ежедневное обновление

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

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

F48891C8118F7436.png

Как это привлечет пользователей?

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

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

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

Включите ежедневные обновления

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

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

  1. В консоли «Действия» нажмите на вкладку «Разработать» и выберите «Действия» в левой навигационной панели.
  2. Нажмите на список классов в списке действий .
  3. В разделе «Вовлечение пользователей» переключите, вы хотели бы предлагать ежедневные обновления для пользователей .
  4. Установите название описательного контента , которое описывает ежедневное обновление. Контекст будет: «В какое время вы хотели бы, чтобы я отправил свой день», поэтому убедитесь, что ваше название является и описательным, и звучит правильно, когда говорится вслух. Для этого примера установите заголовок контента в list of upcoming Action Gym classes .
  5. Нажмите Сохранить в верхней части страницы.

C00885CC30E14D68.PNG

Установите диалог

Следуйте этим шагам в консоли Dialogflow, чтобы создать намерения для ежедневного потока подписки:

Позвольте пользователю подписаться

  1. Установите новое намерение обрабатывать пользователя с просьбой подписаться на ежедневные обновления. В консоли Dialogflow нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите эти новые Setup Updates .
  3. В разделе «Обучающие фразы» добавьте следующие выражения пользователя :
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  2. Нажмите Сохранить в верхней части страницы.

5C70FAA02151DA0.png

Обрабатывать решение пользователя

  1. Установите новое намерение обработать ответ пользователя на подсказку Daily Updates. Нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите это новое намерение Confirm Updates .
  3. В разделе «События» добавьте actions_intent_REGISTER_UPDATE . Это событие Dialogflow будет вызвано пользователем, заканчивающим поток подписки Daily Update, независимо от того, были ли они в конечном итоге подписаться или нет.
  4. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  5. Нажмите Сохранить в верхней части страницы.

B871C2BDADAC8ABC.PNG

Реализовать выполнение

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

Зависимости нагрузки

b2f84ff91b0e1396.png В файле index.js обновите функцию require() , чтобы добавить пакет RegisterUpdate из пакета actions-on-google , так что ваш импорт выглядел следующим образом:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
} = require('actions-on-google');

Обновление чипов предложений

b2f84ff91b0e1396.png В файле index.js добавьте DAILY запись в список названий чипов предложений, поэтому ваше определение Suggestion выглядит следующим образом:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
};

Добавьте удовлетворение для новых намерений

Когда пользователь говорит, что они хотят подписаться, запустите поток подписки Daily Updates, позвонив RegisterUpdate вспомогательному вспомогательному намерению обновления ( список классов ) и типом ( DAILY ). После того, как поток подписки завершен, помощник запускает событие actions_intent_REGISTER_UPDATE с аргументом status , в котором описывается, была ли подписка успешной или нет. Предлагайте последующие подсказки пользователю, которые изменяются в зависимости от статуса подписки.

b2f84ff91b0e1396.png В файле index.js добавьте следующий код:

index.js

// Start opt-in flow for daily updates
app.intent('Setup Updates', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'Class List',
    frequency: 'DAILY',
  }));
});

// Confirm outcome of opt-in for daily updates
app.intent('Confirm Updates', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
     conv.ask(`Gotcha, I'll send you an update everyday with the ` +
     'list of classes. Can I help you with anything else?');
  } else {
    conv.ask(` I won't send you daily reminders. Can I help you with anything else?`);
  }
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS, Suggestion.CLASSES]));
  }
});

Предложите альтернативные подсказки для пользователя

Ваш ответ списка классов предложит подписку Daily Update в конце, но это представляет проблему. Поскольку этот же ответ будет запускаться, когда пользователь нажимает на уведомление о ежедневном обновлении, им все равно будет предложено подписаться на ежедневные обновления, даже если они просто приходили из одного. Как вы можете помешать пользователю думать, что ему нужно повторно подписаться?

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

b2f84ff91b0e1396.png В файле index.js замените следующий код:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  const classesMessage =
  `On ${day} we offer the following classes: ${classes}. ` +
  `Can I help you with anything else?`;
  conv.ask(classesMessage);
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS]));
  }
});

С этим:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

Проверьте свои ежедневные обновления

В терминале запустите следующую команду, чтобы развернуть ваш обновленный код Webhook для Firebase:

firebase deploy

Чтобы проверить свой пользовательский воспроизведение в симуляторе действий, выполните следующие действия:

  1. В консоли действий перейдите к тестированию .
  2. Введите Talk to my test app в поле ввода и нажмите Enter.
  3. Тип Learn about classes и нажмите Enter. Ответ вашего действия теперь должен предложить ежедневные напоминания.
  4. Введите Send daily reminders и нажмите Enter.
  5. Введите время, которое вы хотели бы увидеть обновление и нажмите Enter. В целях тестирования попробуйте ответить за 3-5 минут позже, чем текущее время.

83a15ecac8c71787.png

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

85824822eafc67d5b.png

4. Добавить push -уведомления

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

На этом этапе вы узнаете, как реализовать Push -уведомления в ваших действиях, добавив новый класс отменен и отправив уведомления пользователям, которые уведомляют их о отмене класса. Вы также настроите следующие три компонента, необходимые для отправки уведомлений:

  • Аккаунт API API - вы отправляете уведомления пользователю, отправив запрос POST в API, поэтому вам необходимо настроить учетную запись службы и учетные данные для взаимодействия с этим API.
  • Помощник разрешения - вам нужно разрешение пользователя доступа к идентификатору пользователя, необходимому для отправки им push -уведомлений. В этом примере вы используете функцию клиентской библиотеки, чтобы вызвать помощника разрешения и запросить этот идентификатор.
  • Хранение - Чтобы отправить push -уведомления пользователю вне разговора, вам нужно хранить идентификаторы пользователей, где можно вспомнить по -желания. В этом примере вы настроите базу данных Firestore для хранения информации для каждого пользователя.

После выполнения этих инструкций вы добавите следующий диалог в разговор вашего действия:

7c9d4b633c547823.png

Как это привлечет пользователей?

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

Push -уведомления могут быть полезным инструментом взаимодействия, но не обязательно должны быть включены в каждое действие. Рассмотрим эти советы при принятии решения о том, добавлять ли Push -уведомления в действие:

  • Запланируйте несколько примеров графиков для ваших push -уведомлений. Если вы планируете отправлять только одно push -уведомление в день, вместо этого рассмотрите возможность использования ежедневных обновлений.
  • Убедитесь, что ваши push -уведомления будут предоставлять полезную информацию каждый раз, когда они принимаются. Ваши уведомления также могут глубоко связаны с одним из намерений вашего действия, поэтому убедитесь, что намерение полезно и актуально.
  • Будьте явными при просьбе пользователя подписаться на то, чтобы выдвигать уведомления. Они должны понимать, чего ожидать при каждом уведомлении о толчке, и иметь некоторое представление о том, как часто отправляются уведомления.

Включить действия API

  1. Откройте Google Cloud Console и выберите имя проекта вашего действия в раскрывающемся списке.

D015C1515B99E3DB.PNG

  1. В меню навигации ( ☰) перейдите в APIS & Services> Library.
  2. Ищите API API и нажмите «Включить» .

6d464f49c88e70b4.png

Создать учетную запись службы

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

  1. В меню навигации Google Cloud Console (☰) перейдите в APIS & Services> Учетные данные .
  2. Нажмите «Создать учетные данные»> «Ключ учетной записи службы» .
  3. В раскрывающемся меню учетной записи службы выберите New Service Account.
  4. Заполните следующую информацию:
  • Название учетной записи службы : service-account
  • Роль : Проект> Владелец
  • Идентификатор учетной записи службы: service-account (всегда за ним следует @<project_id> .iam.gserviceaccount.com)
  • Тип ключа : json
  1. Нажмите «Создать».
  2. Переместите загруженный файл JSON в /пользовательский инженер-Codelab/Start/Functions/ Directory вашего проекта.
  3. Переименовать файл JSON в service-account.json .

D9BD79D35691DE3A.PNG

Включить Firestore

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

Следуйте этим шагам, чтобы создать базу данных Firestore для вашего действия:

  1. В консоли Firebase выберите название проекта своих действий.
  2. В левой навигации перейдите, чтобы разработать> базу данных и нажмите «Создать базу данных» .
  3. Выберите «Начать в тестовом режиме» .
  4. Нажмите Enable .

6DFC3864139544CAA.PNG

Установите диалог

Следуйте этим шагам в консоли Dialogflow, чтобы создать уведомления push oct-in flow:

Позвольте пользователю подписаться

  1. Установите новое намерение обрабатывать пользователя, который просит подписаться на то, чтобы выдвинуть уведомления о отмененных классах. В консоли Dialogflow нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите эти новые Setup Push Notifications .
  3. В разделе «Обучающие фразы» добавьте следующие выражения пользователя :
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  2. Нажмите Сохранить в верхней части страницы.

3d99bc41d0492552.png

Обрабатывать решение пользователя

  1. Установите новое намерение обработать ответ пользователя на подсказку подписки на Push Push. Нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите это новое намерение Confirm Push Notifications .
  3. В разделе «События» добавьте actions_intent_PERMISSION . Это событие диалога будет вызвано пользователем, заканчивающим поток подписки на Push Push, независимо от того, были ли они подписаны или нет.
  4. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  5. Нажмите Сохранить в верхней части страницы.

D37F550C5E07CB73.png

Обрабатывать уведомление

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

Следуйте этим шагам, чтобы добавить намерение запустить пользователь, поступив по поводу push -уведомления:

  1. В консоли Dialogflow нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите этот новый Class Canceled .
  3. В разделе «Обучающие фразы» добавьте Cancelations в качестве пользовательского выражения .
  4. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  5. Нажмите Сохранить в верхней части страницы.

940379556F559631.png

Отправить тестовые уведомления в середине конвертации

В производстве у вас должен быть сценарий отдельно от вашего кода выполнения действий, который отправляет push -уведомления. Для этого примера создайте намерение, которое вы можете вызвать, чтобы отправить push -уведомление во время разговора с вашим действием. Это намерение только для целей отладки; На практике Push -уведомления не должны рассматриваться вашим исполнением или иным образом, иным образом вызваны как часть разговора вашего действия.

Следуйте этим шагам, чтобы создать намерение для тестирования уведомлений о push:

  1. В целях тестирования и отладки настройте новое намерение, которое позволяет отправлять push -уведомления подписанным пользователям. В консоли Dialogflow нажмите кнопку + рядом с намерениями в левой навигации, чтобы создать новое намерение.
  2. Назовите это новое Test Notification намерения.
  3. В разделе «Обучающие фразы» добавьте Test notification как пользовательское выражение .
  4. В разделе «Выполнение» переключите вызов Webhook для этого намерения .
  5. Нажмите Сохранить в верхней части страницы.

6967F5A997643EB8.PNG

Включить уведомления

Следуйте этим шагам, чтобы включить push -уведомления о отмене намерения класса :

  1. В консоли Dialogflow перейдите к интеграции в панели навигации.
  2. На карте Google Assistant нажмите «Настройки интеграции» .
  3. Добавьте класс, отменен как неявное намерение вызовов . Этот шаг необходим для Dialogflow, чтобы признать, что пользователи могут начать ваш разговор с отмененного намерения класса (нажав уведомление о push).
  4. Нажмите «Закрыть» .

1AC725231ED279A1.PNG

  1. В консоли «Действия» нажмите на вкладку «Разработать» и выберите «Действия» в левой навигационной панели.
  2. Нажмите на класс, отменен в списке действий .
  3. В разделе «Объединение пользователей» переключите, вы хотели бы отправить push -уведомления? вариант
  4. Установите название описательного контента , которое описывает уведомление Push. Контекст будет «в порядке, если я отправлю push -уведомления?», Поэтому убедитесь, что ваш заголовок как описательный, так и звучит правильно, когда говорится вслух. Для этого примера установите заголовок контента на class cancelations .
  5. Нажмите Сохранить в верхней части страницы.

4304c7cd575f6de3.png

Реализовать выполнение

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

Зависимости нагрузки

b2f84ff91b0e1396.png В файле index.js обновите функцию require() для добавления пакета UpdatePermission в пакете actions-on-google , так что ваш импорт выглядел следующим образом:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
  UpdatePermission,
} = require('actions-on-google');

Обновление чипов предложений

b2f84ff91b0e1396.png В файле index.js добавьте запись NOTIFICATIONS в список названий чипов предложений, поэтому ваше определение Suggestion выглядит следующим образом:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
  NOTIFICATIONS: 'Get notifications',
};

Настроить новый импорт

Чтобы подключиться к вашей базе данных Firestore, добавьте пакет firebase-admin и добавьте константы для полей, хранящихся в базе данных. Кроме того, импортируйте пакеты google-auth-library и request для обработки аутентификации и запросов API ACTI.

b2f84ff91b0e1396.png В файле index.js добавьте следующий код в свой импорт:

index.js

// Firebase admin import
const admin = require('firebase-admin');

// Initialize Firestore
admin.initializeApp();
const db = admin.firestore();

// Firestore constants
const FirestoreNames = {
 INTENT: 'intent',
 USER_ID: 'userId',
 USERS: 'users',
};

// Actions API authentication imports
const {auth} = require('google-auth-library');
const request = require('request');

Предложение настроить уведомления о отмене класса

b2f84ff91b0e1396.png В файле index.js замените следующий код:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

С этим:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like to receive daily reminders of upcoming classes, subscribe to notifications about cancelations, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.NOTIFICATIONS,
Suggestion.HOURS]));
    };
  };
});

Добавьте удовлетворение для новых намерений

Когда пользователь говорит, что он хочет подписаться на то, чтобы выдвигать уведомления, позвоните вспомогательному UpdatePermission , чтобы запросить разрешение у пользователя. Если это успешно, аргумент PERMISSION будет добавлен в аргументы объекта conv , которые вы можете проверить, чтобы разобраться в разговоре.

После того, как у вас есть разрешение пользователя, возьмите идентификатор пользователя из аргументов объекта conv и сохраните его в вашей базе данных. Позже вы отправите этот идентификатор пользователя в API ACTI, как помощник определяет, кто получает уведомление.

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

b2f84ff91b0e1396.png В файле index.js добавьте следующий код:

index.js

// Call the User Information helper for permission to send push notifications
app.intent('Setup Push Notifications', (conv) => {
 conv.ask('Update permission for setting up push notifications');
 conv.ask(new UpdatePermission({intent: 'Class Canceled'}));
});

// Handle opt-in or rejection of push notifications
app.intent('Confirm Push Notifications', (conv) => {
 if (conv.arguments.get('PERMISSION')) {
   let userId = conv.arguments.get('UPDATES_USER_ID');
   if (!userId) {
     userId = conv.request.conversation.conversationId;
   }
   // Add the current conversation ID and the notification's
   // target intent to the Firestore database.
   return db.collection(FirestoreNames.USERS)
   .add({
     [FirestoreNames.INTENT]: 'Class Canceled',
     [FirestoreNames.USER_ID]: userId,
   })
   .then(() => {
     conv.ask(`Great, I'll notify you whenever there's a class cancelation. ` +
     'Can I help you with anything else?');
   });
 } else {
   conv.ask(`Okay, I won't send you notifications about class cancelations. ` +
     'Can I help you with anything else?');
 }
 if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.CLASSES, Suggestion.HOURS]));
  }
});

// Intent triggered by tapping the push notification
app.intent('Class Canceled', (conv) => {
 conv.ask('Classname at classtime has been canceled.');
});

Add test notifications

To send a push notification to a user, send a POST request to the Actions API with the user ID, the notification's title, and the target intent. In this example, triggering the Test Notification intent will iterate through your Firestore database and send push notifications to every user who's subscribed to notifications.

Remember that, in this example, you're including the code that sends the push notification in your webhook fulfillment and triggering that code by invoking a test intent in your conversation. In Actions that you intent to publish, your push notification code should exist in a script separate from your fulfillment.

b2f84ff91b0e1396.png In the index.js file, add the following code:

index.js

// Debug intent to trigger a test push notification
app.intent('Test Notification', (conv) => {
 // Use the Actions API to send a Google Assistant push notification.
 let client = auth.fromJSON(require('./service-account.json'));
 client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
 let notification = {
   userNotification: {
     title: 'Test Notification from Action Gym',
   },
   target: {},
 };
 client.authorize((err, tokens) => {
   if (err) {
     throw new Error(`Auth error: ${err}`);
   }
   // Iterate through Firestore and send push notifications to every user
   // who's currently opted in to canceled class notifications.
   db.collection(FirestoreNames.USERS)
       .where(FirestoreNames.INTENT, '==', 'Class Canceled')
       .get()
       .then((querySnapshot) => {
         querySnapshot.forEach((user) => {
           notification.target = {
             userId: user.get(FirestoreNames.USER_ID),
             intent: user.get(FirestoreNames.INTENT),
           };
           request.post('https://actions.googleapis.com/v2/conversations:send', {
             'auth': {
               'bearer': tokens.access_token,
             },
             'json': true,
             'body': {'customPushMessage': notification, 'isInSandbox': true},
           }, (err, httpResponse, body) => {
             if (err) {
               throw new Error(`API request error: ${err}`);
             }
             console.log(`${httpResponse.statusCode}: ` +
               `${httpResponse.statusMessage}`);
             console.log(JSON.stringify(body));
           });
         });
       })
       .catch((error) => {
         throw new Error(`Firestore query error: ${error}`);
       });
 });
 conv.ask('A notification has been sent to all subscribed users.');
});

Test your push notifications

In the terminal, run the following command to deploy your updated webhook code to Firebase:

firebase deploy

To test out notifications in the Actions simulator, follow these steps:

  1. In the Actions console, go to the Test tab.
  2. Type Talk to my test app into the Input field and press enter.
  3. Type Learn about classes and press enter.
  4. Type Get notifications and press enter.
  5. If you haven't already granted your Action permission to send you push notifications, type yes and press enter.
  6. Type yes and press enter. Your Google account should now be subscribed to push notifications for this Action.

3a8704bdc0bcbb17.png

  1. Type no and press enter to exit.
  2. Type Talk to my test app and press enter to start a new conversation.
  3. Type Test notification and press enter.

634dfcb0be8dfdec.png

Within a few minutes you should receive a "Test Notification from Action Gym" Assistant push notification on your mobile device. Tapping this notification will deep link you to the Class Canceled intent of your Action.

33cbde513c10122e.png

5. Create an Assistant link

So far we've discussed engagement features that you can implement to keep users coming back to your Action, but those are predicated on having users who discover and use your Action.

You can create an Assistant link that will link users on mobile devices directly to your Action on Assistant. Since an Assistant link is a standard hyperlink, you can add it to a website or any web marketing materials like a blog or social media post.

In this step, you'll learn about what an Assistant link is, how to create one for your Action's welcome intent, and how to add it to a simple website for testing.

How will this engage users?

Drawing users to your Action for the first time can be challenging, especially when they need to explicitly invoke your Action on Assistant. An Assistant link alleviates this friction by giving users a direct link to your Action. When a user follows your Assistant link on an Assistant-enabled device, they're taken directly to your Action. When a user opens your link on a non-mobile device or any other device that doesn't support Assistant, they'll still be taken to your Actions directory listing (if it's been published) so the link can still market your Action to those users.

Assistant links can be a useful engagement tool, so you should create one if you're planning on advertising your Action through your website or social media. Just be aware of the following tips before you create and distribute an Assistant link:

  • Assistant links only work once your Action is published. While your project is in a draft state, the link will only work on your own devices. Anyone else will be taken to a 404 page in the Actions directory.
  • You can let users test an Assistant link prior to publishing by releasing your Action in an alpha or beta environment . Note that only users who participate in your alpha or beta will be able to test your Assistant link.
  • Make sure the destination intent for your Assistant link makes a good first impression with new users. Your welcome intent is the default destination for an Assistant link because it should already do a good job of introducing your Action

Follow these steps to create an Assistant link for the welcome intent:

  1. In the Actions console, click the Develop tab, and choose Actions in the left navigation bar.
  2. Click on actions.intent.MAIN under the Actions list.
  3. Under the Links section, toggle the Would you like enable a URL for this Action option.
  4. Set a descriptive Link title that describes your Action. Make your title a simple verb-noun pair that describes what the user can accomplish with your Action. For this example, set the Link title to learn about Action Gym .
  5. Copy the HTML snippet from the bottom of this page and save it for later.
  6. Click Save at the top of the page.

55341b8102b71eab.png

Deploy a test website

To test your Assistant link, you can use Firebase tools to deploy a test website alongside your fulfillment. We've already built a simple test website for this example, you just need to add your Assistant link.

Go to your fulfillment's /user-engagement-codelab-nodejs/start/public/ directory and open the index.html file in a text editor.

b2f84ff91b0e1396.png In the index.html file, paste your Assistant link's HTML snippet into the body element. The file should end up looking like the snippet below:

index.html

<body>
    <p>
     <a href="https://assistant.google.com/services/invoke/uid/000000efb5f2fd97">🅖 Ask my test app to learn about Action Gym
     </a>
    </p>
</body>

In the terminal, run the following command to deploy your test website to Firebase:

firebase deploy

Once the deploy command finishes running, take note of the Hosting URL in the output.

b01e8d322fb5d623.png

Go to this URL on your mobile device's web browser and you should see the Assistant link on your test website. Clicking this link on your mobile device should take you to your Action's welcome intent in Assistant.

599845d647f5b624.png

You can also try going to the Hosting URL on a desktop browser, which should take you to a 404 page in the Assistant directory since your Action isn't published.

6. Next steps

Поздравляю!

You've now learned about the importance of user engagement when developing an Action, what user engagement features are available on the platform, and how to add each feature to an Action.

Additional learning resources

Explore these resources to learn more about user engagement for your Action:

Follow us on Twitter @ActionsOnGoogle to stay tuned to our latest announcements, and tweet to #AoGDevs to share what you have built!

Feedback survey

Before you go, please fill out this form to let us know how we're doing!

,

1. Обзор

Actions on Google is a developer platform that lets you create software to extend the functionality of Google Assistant , Google's virtual personal assistant, across more than 1 billion devices, including smart speakers, phones, cars, TVs, headphones, and more. Users engage Assistant in conversation to get things done, like buying groceries or booking a ride. (For a complete list of what's possible, see the Actions directory .) As a developer, you can use Actions on Google to easily create and manage delightful and effective conversational experiences between users and your third-party service.

This is an advanced codelab module, intended for readers who already have some experience building Actions for the Google Assistant. If you don't have any prior development experience with Actions on Google, we strongly recommend that you familiarize yourself with the platform by following our introductory codelabs ( Level 1 , Level 2 , and Level 3 ). These advanced modules will guide you through a series of features that can help you expand your Action's functionality and grow your audience.

One important way to measure an Action's success is user engagement or how effective the Action is at bringing users back after their first interaction. To help make that easier, you can implement several features in your Action that give users paths back into your conversation.

The codelab covers user-engagement features and best practices for Actions on Google.

a3fc0061bd01a75.png961ef6e27dc73da2.png

Что вы построите

You'll enhance a feature that's already been built by enabling it to:

  • Send users a daily update that they can tap to talk to your Action
  • Send users push notifications that link back to your Action
  • Create a link that takes users to your Action from a mobile web browser

Чему вы научитесь

  • What is user engagement and why it's important for an Action's success
  • How to modify an Action to increase user engagement
  • Which user engagement features to use in different kinds of Actions
  • How to use the Actions API to send notifications through Assistant

Что вам понадобится

You must have the following tools:

  • An IDE/text editor of your choice, such as WebStorm , Atom , or Sublime
  • A terminal to run shell commands with Node.js, npm, and git installed
  • A web browser, such as Google Chrome
  • A local development environment with the Firebase command-line interface
  • A mobile device (Android or iOS) with Assistant (You must be signed-in to Assistant with the same Google Account that you'll use to build this project.)

Familiarity with JavaScript (ES6) is also strongly recommended, although not required, to understand the webhook code.

2. Set up your project

This section shows you how to add user engagement features to a complete, previously built Action.

Understand the sample

The sample for this codelab is a simple Action for a fictional gym named "Action Gym." The Action provides information about the gym, including a list of classes that rotate each day. An informative Action such as this is a good candidate for all user-engagement features because the rotating class list gives different useful information each day.

The following diagram shows the Action Gym sample's conversational flow:

e2d6e4ad98948cf3.png

You'll make minor modifications to the dialog to better suit the engagement features you add. However, the general design of the conversation won't change much.

Download your base files

Run the following command to clone the GitHub repository for the codelab:

git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs

Set up your project and agent

To set up your Actions project and Dialogflow agent, complete the following steps:

  1. Open the Actions console .
  2. Click New project .
  3. Type in a Project name , like engagement-codelab .
  4. Click Create Project .
  5. Rather than pick a category, scroll down to the More options section and click the Conversational card.
  6. Click Build your Action to expand the options and select Add Action(s) .
  7. Click Add Your First Action .
  8. On the Create Action dialog, select Custom Intent, and then click Build to launch the Dialogflow console.
  9. In the Dialogflow console's agent creation page, click Create .
  10. Click the 6bf56243a8a11a3b.png (gear icon) on the left navigation.
  11. Click Export and Import , then Restore From Zip .
  12. Upload the agent.zip file from the /user-engagement-codelab-nodejs/start/ directory you downloaded earlier.
  13. Type RESTORE and click Restore .
  14. Нажмите Готово .

Deploy your fulfillment

Now that your Actions project and Dialogflow agent are ready, deploy your local index.js file using the Firebase Functions CLI.

From the /user-engagement-codelab-nodejs/start/functions/ directory of your base files clone, run the following commands:

firebase use <PROJECT_ID>
npm install
firebase deploy

After a few minutes, you should see " Deploy complete! ", which indicates that you've successfully deployed your webhook to Firebase.

Retrieve the deployment URL

You need to provide Dialogflow with the URL to the cloud function. To retrieve this URL, follow these steps:

  1. Open the Firebase Console .
  2. Select your Actions project from the list of options.
  3. Navigate to Develop > Functions on the left navigation bar. If you're prompted to "Choose data sharing settings", you can ignore this option by clicking Do this later .
  4. Under the Dashboard tab, you should see an entry for "fulfillment" with a URL under Trigger . Save this URL; you'll need to copy it into Dialogflow in the next section.

1741a329947975db.png

Set the webhook URL in Dialogflow

Now you need to update your Dialogflow agent to use your webhook for fulfillment. To do this, follow these steps:

  1. Open the Dialogflow console (you can close the Firebase console if you'd like).
  2. Click Fulfillment on the left navigation.
  3. Enable Webhook .
  4. Paste the URL you copied from the Firebase dashboard if it doesn't already appear.
  5. Click Save .

Verify your project is correctly set up

Users should be able to invoke your Action for information about Action Gym, including a hard-coded text response with business hours and a text response that lists the class schedule for each day of the week.

To test out your Action in the Actions simulator:

  1. In the Dialogflow console left navigation, click on Integrations > Google Assistant .
  2. Make sure Auto-preview changes is enabled and click Test to update your Actions project.
  3. The Actions simulator loads your Actions project. To test your Action, type Talk to my test app into the Input field and press enter.
  4. You should see a response welcoming you to Action Gym. Try following the prompts to continue the conversation while making sure that your fulfillment has a response for each input.

60acf1ff87b1a87f.png

3. Add daily update subscriptions

A common way to engage users is to offer information to them when it's most useful. This is accomplished by offering users the option to subscribe to daily updates for an intent, which sends them an Assistant notification that links directly to that intent's fulfillment.

In this step, you'll learn about daily update subscriptions and add them to your Action's Class List intent. After following these instructions, your Action's conversation will look like the following diagram:

f48891c8118f7436.png

How will this engage users?

Smartphone users are probably familiar with push notifications, which provide app-specific information and updates. Daily update subscriptions are a simple way to access users on mobile devices outside of Assistant, provided that the intent you're sending updates for continues to provide value to the user on a daily basis.

Daily updates can be a useful engagement tool but should not necessarily be incorporated in every Action. Consider these tips when deciding whether to add daily update subscriptions to an Action:

  • Make sure the daily updates will result in the user seeing different, useful information every day. If tapping a daily update results in the same prompt every time, the user will probably unsubscribe after a couple days.
  • Make sure your dialog makes sense to your user if they jump straight to your daily update's intent. Your user won't necessarily start from the beginning of the conversation, so they shouldn't be expected to have much context.
  • Show your user the benefit of your Action before prompting them to subscribe to daily updates. Your user should be thinking "I want this content every day" when they are given the option to subscribe.
  • Don't overwhelm the user with repeated suggestions to subscribe. Offer a daily update subscription right after showing the user what they'd subscribe to, and avoid pestering them about it elsewhere.
  • Keep the conversation short after the update intent is triggered. Most daily updates should only consist of a single response then close without requiring user input.

Turn on daily updates

Daily update subscriptions can be added to the welcome intent which puts the user at the start of your conversation, or a more specific intent in order to deep link them to somewhere within the conversation. For this codelab, the Class List intent makes the most sense because the dialogue will change every day, and users may find it useful to be reminded what classes are available.

Follow these steps to enable daily updates for the Class List intent:

  1. In the Actions console, click the Develop tab, and choose Actions in the left navigation bar.
  2. Click on Class List under the Actions list.
  3. Under the User engagement section, toggle the Would you like to offer daily updates to users option.
  4. Set a descriptive Content title that describes the daily update. The context will be "What time would you like me to send your daily ", so make sure your title is both descriptive and sounds correct when spoken aloud. For this example, set the Content title to list of upcoming Action Gym classes .
  5. Click Save at the top of the page.

c00885cc30e14d68.png

Set up Dialogflow

Follow these steps in the Dialogflow console to create intents for the daily update subscription flow:

Prompt the user to subscribe

  1. Set up a new intent to handle the user asking to subscribe to daily updates. In the Dialogflow console, click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Setup Updates .
  3. Under the Training phrases section, add the following user expressions :
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  2. Click Save at the top of the page.

5c70faa02151da0.png

Handle the user's decision

  1. Set up a new intent to handle the user's response to the daily updates subscription prompt. Click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Confirm Updates .
  3. Under the Events section, add actions_intent_REGISTER_UPDATE . This Dialogflow event will be triggered by the user finishing the daily update subscription flow, whether they ended up subscribing or not.
  4. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  5. Click Save at the top of the page.

b871c2bdadac8abc.png

Implement the fulfillment

To implement the fulfillment in your webhook, complete the following steps:

Load dependencies

b2f84ff91b0e1396.png In the index.js file, update the require() function to add the RegisterUpdate package from the actions-on-google package, so your imports look like this:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
} = require('actions-on-google');

Update suggestion chips

b2f84ff91b0e1396.png In the index.js file, add a DAILY entry to the list of suggestion chip titles, so your Suggestion definition looks like this:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
};

Add fulfillment for new intents

When the user says they want to subscribe, start the daily updates subscription flow by calling the RegisterUpdate helper with the update's target intent ( Class List ) and type ( DAILY ). After the subscription flow is finished, Assistant triggers the actions_intent_REGISTER_UPDATE event with a status argument which describes whether the subscription was successful or not. Offer follow-up prompts to the user that change depending on the subscription status.

b2f84ff91b0e1396.png In the index.js file, add the following code:

index.js

// Start opt-in flow for daily updates
app.intent('Setup Updates', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'Class List',
    frequency: 'DAILY',
  }));
});

// Confirm outcome of opt-in for daily updates
app.intent('Confirm Updates', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
     conv.ask(`Gotcha, I'll send you an update everyday with the ` +
     'list of classes. Can I help you with anything else?');
  } else {
    conv.ask(` I won't send you daily reminders. Can I help you with anything else?`);
  }
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS, Suggestion.CLASSES]));
  }
});

Offer alternative prompts for the user

Your Class List response will offer the daily update subscription at the end, but this presents a problem. Since this same response will be triggered when the user taps the daily update notification, they'll still be asked to subscribe to daily updates even though they just came from one. How can you keep the user from thinking they need to re-subscribe?

Thankfully, your conv object's arguments include information about where the user started the conversation. You can check the conv arguments to see if they contain an UPDATES section, which indicates the user started the conversation from a daily update notification, and change the response accordingly. You can also use this conversation branch to close the dialog immediately after providing the list of classes, which follows our best practice of keeping the daily update short.

b2f84ff91b0e1396.png In the index.js file, replace the following code:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  const classesMessage =
  `On ${day} we offer the following classes: ${classes}. ` +
  `Can I help you with anything else?`;
  conv.ask(classesMessage);
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS]));
  }
});

with this:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

Test your daily updates

In the terminal, run the following command to deploy your updated webhook code to Firebase:

firebase deploy

To test out your custom reprompt in the Actions simulator, follow these steps:

  1. In the Actions console, navigate to Test .
  2. Type Talk to my test app into the Input field and press enter.
  3. Type Learn about classes and press enter. Your Action's response should now offer to send daily reminders.
  4. Type Send daily reminders and press enter.
  5. Type in a time that you'd like to see the update and press enter. For testing purposes, try responding with 3-5 minutes later than the current time.

83a15ecac8c71787.png

On your mobile device, you should receive a notification from Assistant around the time that you specified for updates. Note that this notification may take a couple minutes to appear. Tap on the notification and it should deep-link directly to the Class List intent in Assistant, giving you a list of upcoming classes:

8582482eafc67d5b.png

4. Add push notifications

As another option to engage users outside of your Action, you can call the Actions API to send push notifications to users. Unlike daily updates, these notifications aren't automatically scheduled by Assistant so you can send them at-will.

In this step, you'll learn how to implement push notifications in your Action by adding a new Class Canceled intent and sending notifications to users that notify them about a class cancellation. You'll also set up the following three components needed to send notifications:

  • Actions API account - You send notifications to the user by sending a POST request to an API, so you'll need to set up a service account and credentials to interface with this API.
  • Permission helper - You need the user's permission to access the user ID needed to send them push notifications. In this example, you'll use a client library function to call the permission helper and request this ID.
  • Storage - In order to send push notifications to a user outside of a conversation, you need to store user IDs somewhere that can be recalled at-will. In this example, you'll set up a Firestore database to store information for each user.

After following these instructions, you'll add the following dialog to your Action's conversation:

7c9d4b633c547823.png

How will this engage users?

Smartphone users are probably familiar with push notifications, which provide app-specific information and updates. Push notifications are a flexible way to access users on mobile devices outside of Assistant, provided that users are given a good reason to enable them. With daily updates, users are already aware that they'll be notified on a daily basis. With push notifications, however, users don't know whether they're opting in to receive infrequent notifications or will be pestered with multiple notifications per day.

Push notifications can be a useful engagement tool but should not necessarily be incorporated in every Action. Consider these tips when deciding whether to add push notifications to an Action:

  • Plan some example schedules for your push notifications. If you plan on only sending one push notification per day, consider using daily updates instead.
  • Make sure your push notifications will provide useful information every time they're received. Your notifications can also deep link to one of your Action's intents, so make sure the intent is useful and relevant.
  • Be explicit when asking a user to subscribe to push notifications. They should understand what to expect with each push notification, and have some idea of how often the notifications are sent.

Enable the Actions API

  1. Open the Google Cloud console and select your Actions project name in the dropdown.

d015c1515b99e3db.png

  1. In the navigation menu ( ☰) , go to APIs & Services > Library.
  2. Search for the Actions API , and click Enable .

6d464f49c88e70b4.png

Create a service account

The Actions API requires authentication so you need to create a service account to send requests. Follow these steps to create and install a service account key for the Actions API:

  1. In the Google Cloud Console's navigation menu (☰) , go to APIs & Services > Credentials .
  2. Click on Create credentials > Service account key .
  3. In the Service account drop-down menu, select New Service Account.
  4. Fill in the following information:
  • Service account name : service-account
  • Role : Project > Owner
  • Service account ID: service-account (always followed by @<project_id>.iam.gserviceaccount.com)
  • Key type : JSON
  1. Click Create.
  2. Move the downloaded JSON file to the /user-engagement-codelab/start/functions/ directory of your project.
  3. Rename the JSON file to service-account.json .

d9bd79d35691de3a.png

Enable Firestore

In order to send notifications outside of the conversation, you need a way to store user IDs that can be referenced from your notification code. For this example, we're using a Firestore database to store the user IDs of subscribed users.

Follow these steps to create a Firestore database for your Action:

  1. In the Firebase console , select your Actions project name.
  2. In the left navigation, go to Develop > Database and click Create database .
  3. Select Start in test mode .
  4. Click Enable .

6dfc386413954caa.png

Set up Dialogflow

Follow these steps in the Dialogflow console to create the push notifications opt-in flow:

Prompt the user to subscribe

  1. Set up a new intent to handle the user asking to subscribe to push notifications for cancelled classes. In the Dialogflow console, click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Setup Push Notifications .
  3. Under the Training phrases section, add the following user expressions :
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  2. Click Save at the top of the page.

3d99bc41d0492552.png

Handle the user's decision

  1. Set up a new intent to handle the user's response to the push notifications subscription prompt. Click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Confirm Push Notifications .
  3. Under the Events section, add actions_intent_PERMISSION . This Dialogflow event will be triggered by the user finishing the push notifications subscription flow, whether they ended up subscribing or not.
  4. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  5. Click Save at the top of the page.

d37f550c5e07cb73.png

Handle the push notification

You can link your push notifications to a specific intent, so users who tap on the push notification are deep linked directly to that intent in your Action. In this example, add a new intent for push notifications that provides details about cancelled classes.

Follow these steps to add an intent to be triggered by the user tapping a push notification:

  1. In the Dialogflow console, click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Class Canceled .
  3. Under the Training phrases section, add Cancelations as a user expression .
  4. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  5. Click Save at the top of the page.

940379556f559631.png

Send test notifications mid-conversation

In production, you should have a script separate from your Action fulfillment code that sends push notifications. For this example, create an intent that you can invoke to send a push notification while talking to your Action. This intent is only for debug purposes; in practice, push notifications shouldn't be handled by your fulfillment or otherwise triggered as part of your Action's conversation.

Follow these steps to create an intent for testing push notifications:

  1. For testing and debugging purposes, set up a new intent that allows you to send push notifications to subscribed users. In the Dialogflow console, click the + button next to Intents in the left navigation to create a new intent.
  2. Name this new intent Test Notification .
  3. Under the Training phrases section, add Test notification as a user expression .
  4. Under the Fulfillment section, toggle the Enable webhook call for this intent option.
  5. Click Save at the top of the page.

6967f5a997643eb8.png

Turn on push notifications

Follow these steps to enable push notifications for the Class Canceled intent:

  1. In the Dialogflow console, go to Integrations in the navigation bar.
  2. On the Google Assistant card, click Integration Settings .
  3. Add Class Canceled as an Implicit invocation intent. This step is necessary for Dialogflow to recognize that users can start your conversation with the Class Canceled intent (by tapping a push notification).
  4. Click Close .

1ac725231ed279a1.png

  1. In the Actions console, click the Develop tab, and choose Actions in the left navigation bar.
  2. Click on Class Canceled under the Actions list.
  3. Under the User engagement section, toggle the Would you like to send push notifications? option.
  4. Set a descriptive Content title that describes the push notification. The context will be "Is it ok if I send push notifications for ?", so make sure your title is both descriptive and sounds correct when spoken aloud. For this example, set the Content title to class cancelations .
  5. Click Save at the top of the page.

4304c7cd575f6de3.png

Implement the fulfillment

To implement the fulfillment in your webhook, complete the following steps:

Load dependencies

b2f84ff91b0e1396.png In the index.js file, update the require() function to add the UpdatePermission package from the actions-on-google package, so your imports look like this:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
  UpdatePermission,
} = require('actions-on-google');

Update suggestion chips

b2f84ff91b0e1396.png In the index.js file, add a NOTIFICATIONS entry to the list of suggestion chip titles, so your Suggestion definition looks like this:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
  NOTIFICATIONS: 'Get notifications',
};

Set up new imports

In order to connect to your Firestore database, add the firebase-admin package and add constants for the fields stored in the database. Also, import the google-auth-library and request packages to handle authentication and requests to the Actions API.

b2f84ff91b0e1396.png In the index.js file, add the following code to your imports:

index.js

// Firebase admin import
const admin = require('firebase-admin');

// Initialize Firestore
admin.initializeApp();
const db = admin.firestore();

// Firestore constants
const FirestoreNames = {
 INTENT: 'intent',
 USER_ID: 'userId',
 USERS: 'users',
};

// Actions API authentication imports
const {auth} = require('google-auth-library');
const request = require('request');

Offer to set up class cancelation notifications

b2f84ff91b0e1396.png In the index.js file, replace the following code:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

with this:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like to receive daily reminders of upcoming classes, subscribe to notifications about cancelations, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.NOTIFICATIONS,
Suggestion.HOURS]));
    };
  };
});

Add fulfillment for new intents

When the user says they want to subscribe to push notifications, call the UpdatePermission helper to request permission from the user. If that's successful, the PERMISSION argument will be added to the conv object's arguments which you can check to pivot the conversation.

Once you have the user's permission, take the user ID from the conv object's arguments and save that in your database. You'll later send this user ID to the Actions API, which is how Assistant determines who receives the notification.

Lastly, add fulfillment for the Class Canceled intent that's triggered by tapping the push notification. In this example your response is a placeholder string, though in a production-ready version of this Action your notification script would provide more dynamic information about which class has been canceled.

b2f84ff91b0e1396.png In the index.js file, add the following code:

index.js

// Call the User Information helper for permission to send push notifications
app.intent('Setup Push Notifications', (conv) => {
 conv.ask('Update permission for setting up push notifications');
 conv.ask(new UpdatePermission({intent: 'Class Canceled'}));
});

// Handle opt-in or rejection of push notifications
app.intent('Confirm Push Notifications', (conv) => {
 if (conv.arguments.get('PERMISSION')) {
   let userId = conv.arguments.get('UPDATES_USER_ID');
   if (!userId) {
     userId = conv.request.conversation.conversationId;
   }
   // Add the current conversation ID and the notification's
   // target intent to the Firestore database.
   return db.collection(FirestoreNames.USERS)
   .add({
     [FirestoreNames.INTENT]: 'Class Canceled',
     [FirestoreNames.USER_ID]: userId,
   })
   .then(() => {
     conv.ask(`Great, I'll notify you whenever there's a class cancelation. ` +
     'Can I help you with anything else?');
   });
 } else {
   conv.ask(`Okay, I won't send you notifications about class cancelations. ` +
     'Can I help you with anything else?');
 }
 if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.CLASSES, Suggestion.HOURS]));
  }
});

// Intent triggered by tapping the push notification
app.intent('Class Canceled', (conv) => {
 conv.ask('Classname at classtime has been canceled.');
});

Add test notifications

To send a push notification to a user, send a POST request to the Actions API with the user ID, the notification's title, and the target intent. In this example, triggering the Test Notification intent will iterate through your Firestore database and send push notifications to every user who's subscribed to notifications.

Remember that, in this example, you're including the code that sends the push notification in your webhook fulfillment and triggering that code by invoking a test intent in your conversation. In Actions that you intent to publish, your push notification code should exist in a script separate from your fulfillment.

b2f84ff91b0e1396.png In the index.js file, add the following code:

index.js

// Debug intent to trigger a test push notification
app.intent('Test Notification', (conv) => {
 // Use the Actions API to send a Google Assistant push notification.
 let client = auth.fromJSON(require('./service-account.json'));
 client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
 let notification = {
   userNotification: {
     title: 'Test Notification from Action Gym',
   },
   target: {},
 };
 client.authorize((err, tokens) => {
   if (err) {
     throw new Error(`Auth error: ${err}`);
   }
   // Iterate through Firestore and send push notifications to every user
   // who's currently opted in to canceled class notifications.
   db.collection(FirestoreNames.USERS)
       .where(FirestoreNames.INTENT, '==', 'Class Canceled')
       .get()
       .then((querySnapshot) => {
         querySnapshot.forEach((user) => {
           notification.target = {
             userId: user.get(FirestoreNames.USER_ID),
             intent: user.get(FirestoreNames.INTENT),
           };
           request.post('https://actions.googleapis.com/v2/conversations:send', {
             'auth': {
               'bearer': tokens.access_token,
             },
             'json': true,
             'body': {'customPushMessage': notification, 'isInSandbox': true},
           }, (err, httpResponse, body) => {
             if (err) {
               throw new Error(`API request error: ${err}`);
             }
             console.log(`${httpResponse.statusCode}: ` +
               `${httpResponse.statusMessage}`);
             console.log(JSON.stringify(body));
           });
         });
       })
       .catch((error) => {
         throw new Error(`Firestore query error: ${error}`);
       });
 });
 conv.ask('A notification has been sent to all subscribed users.');
});

Test your push notifications

In the terminal, run the following command to deploy your updated webhook code to Firebase:

firebase deploy

To test out notifications in the Actions simulator, follow these steps:

  1. In the Actions console, go to the Test tab.
  2. Type Talk to my test app into the Input field and press enter.
  3. Type Learn about classes and press enter.
  4. Type Get notifications and press enter.
  5. If you haven't already granted your Action permission to send you push notifications, type yes and press enter.
  6. Type yes and press enter. Your Google account should now be subscribed to push notifications for this Action.

3a8704bdc0bcbb17.png

  1. Type no and press enter to exit.
  2. Type Talk to my test app and press enter to start a new conversation.
  3. Type Test notification and press enter.

634dfcb0be8dfdec.png

Within a few minutes you should receive a "Test Notification from Action Gym" Assistant push notification on your mobile device. Tapping this notification will deep link you to the Class Canceled intent of your Action.

33cbde513c10122e.png

5. Create an Assistant link

So far we've discussed engagement features that you can implement to keep users coming back to your Action, but those are predicated on having users who discover and use your Action.

You can create an Assistant link that will link users on mobile devices directly to your Action on Assistant. Since an Assistant link is a standard hyperlink, you can add it to a website or any web marketing materials like a blog or social media post.

In this step, you'll learn about what an Assistant link is, how to create one for your Action's welcome intent, and how to add it to a simple website for testing.

How will this engage users?

Drawing users to your Action for the first time can be challenging, especially when they need to explicitly invoke your Action on Assistant. An Assistant link alleviates this friction by giving users a direct link to your Action. When a user follows your Assistant link on an Assistant-enabled device, they're taken directly to your Action. When a user opens your link on a non-mobile device or any other device that doesn't support Assistant, they'll still be taken to your Actions directory listing (if it's been published) so the link can still market your Action to those users.

Assistant links can be a useful engagement tool, so you should create one if you're planning on advertising your Action through your website or social media. Just be aware of the following tips before you create and distribute an Assistant link:

  • Assistant links only work once your Action is published. While your project is in a draft state, the link will only work on your own devices. Anyone else will be taken to a 404 page in the Actions directory.
  • You can let users test an Assistant link prior to publishing by releasing your Action in an alpha or beta environment . Note that only users who participate in your alpha or beta will be able to test your Assistant link.
  • Make sure the destination intent for your Assistant link makes a good first impression with new users. Your welcome intent is the default destination for an Assistant link because it should already do a good job of introducing your Action

Follow these steps to create an Assistant link for the welcome intent:

  1. In the Actions console, click the Develop tab, and choose Actions in the left navigation bar.
  2. Click on actions.intent.MAIN under the Actions list.
  3. Under the Links section, toggle the Would you like enable a URL for this Action option.
  4. Set a descriptive Link title that describes your Action. Make your title a simple verb-noun pair that describes what the user can accomplish with your Action. For this example, set the Link title to learn about Action Gym .
  5. Copy the HTML snippet from the bottom of this page and save it for later.
  6. Click Save at the top of the page.

55341b8102b71eab.png

Deploy a test website

To test your Assistant link, you can use Firebase tools to deploy a test website alongside your fulfillment. We've already built a simple test website for this example, you just need to add your Assistant link.

Go to your fulfillment's /user-engagement-codelab-nodejs/start/public/ directory and open the index.html file in a text editor.

b2f84ff91b0e1396.png In the index.html file, paste your Assistant link's HTML snippet into the body element. The file should end up looking like the snippet below:

index.html

<body>
    <p>
     <a href="https://assistant.google.com/services/invoke/uid/000000efb5f2fd97">🅖 Ask my test app to learn about Action Gym
     </a>
    </p>
</body>

In the terminal, run the following command to deploy your test website to Firebase:

firebase deploy

Once the deploy command finishes running, take note of the Hosting URL in the output.

b01e8d322fb5d623.png

Go to this URL on your mobile device's web browser and you should see the Assistant link on your test website. Clicking this link on your mobile device should take you to your Action's welcome intent in Assistant.

599845d647f5b624.png

You can also try going to the Hosting URL on a desktop browser, which should take you to a 404 page in the Assistant directory since your Action isn't published.

6. Next steps

Поздравляю!

You've now learned about the importance of user engagement when developing an Action, what user engagement features are available on the platform, and how to add each feature to an Action.

Additional learning resources

Explore these resources to learn more about user engagement for your Action:

Follow us on Twitter @ActionsOnGoogle to stay tuned to our latest announcements, and tweet to #AoGDevs to share what you have built!

Feedback survey

Before you go, please fill out this form to let us know how we're doing!