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

1. Обзор

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

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

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

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

a3fc0061bd01a75.png961ef6e27dc73da2.png

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

Включение этой функции позволит улучшить уже существующую:

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

Что вы узнаете

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

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

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

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

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

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

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

Разберитесь в образце.

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

На следующей диаграмме показана последовательность диалогов в примере 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 с помощью CLI Firebase Functions.

Из каталога /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. Включить веб-перехватчик .
  4. Вставьте URL-адрес, скопированный с панели управления Firebase, если он еще не отображается.
  5. Нажмите « Сохранить ».

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

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

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

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

60acf1ff87b1a87f.png

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

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

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

f48891c8118f7436.png

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

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

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

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

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

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

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

  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 ). После завершения процесса подписки Assistant запускает событие 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]));
  }
});

Предложите пользователю альтернативные варианты ответов.

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

К счастью, аргументы вашего объекта 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-уведомления в вашем Action, добавив новый Intent "Занятие отменено" и отправляя пользователям уведомления об отмене занятия. Вы также настроите следующие три компонента, необходимые для отправки уведомлений:

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

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

7c9d4b633c547823.png

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

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

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

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

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

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

d015c1515b99e3db.png

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

6d464f49c88e70b4.png

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

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

  1. В навигационном меню консоли Google Cloud (☰) перейдите в раздел 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. Создайте новый Intent для обработки запроса пользователя на подписку на push-уведомления об отмененных занятиях. В консоли Dialogflow нажмите кнопку «+» рядом с пунктом «Intents» в левой панели навигации, чтобы создать новый Intent.
  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-уведомлений, которое предоставляет подробную информацию об отмененных занятиях.

Выполните следующие шаги, чтобы добавить намерение, которое будет запускаться при нажатии пользователем на 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. Добавьте Class Canceled в качестве неявного интента. Этот шаг необходим для того, чтобы Dialogflow распознал, что пользователи могут начать ваш диалог с помощью интента Class Canceled (нажав на 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 добавьте следующий код в раздел 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');

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

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 и сохраните его в базе данных. Позже вы отправите этот идентификатор пользователя в API Actions, с помощью которого Assistant определит, кто получит уведомление.

Наконец, добавьте обработку запроса для намерения 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 запрос к API Actions, указав идентификатор пользователя, заголовок уведомления и целевой интент. В этом примере запуск интента «Тестовое уведомление» будет выполнять итерацию по вашей базе данных 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» на своем мобильном устройстве. Нажатие на это уведомление перенаправит вас к намерению «Занятие отменено » вашего действия.

33cbde513c10122e.png

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

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

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

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

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

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

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

  • Ссылки в ассистенте начинают работать только после публикации вашего действия. Пока ваш проект находится в состоянии черновика, ссылка будет работать только на ваших устройствах. Все остальные будут перенаправлены на страницу 404 в каталоге действий.
  • 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. Дальнейшие шаги

Поздравляем!

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!

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

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