Привлекайте пользователей своим действием для Google Assistant

1. Обзор

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

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

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

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

a3fc0061bd01a75.png961ef6e27dc73da2.png

Что вы будете строить

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

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

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

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

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

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

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

В /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 Ассистент ».
  2. Убедитесь, что автоматический предварительный просмотр изменений включен, и нажмите « Тест» , чтобы обновить проект Actions.
  3. Симулятор действий загружает ваш проект действий. Чтобы протестировать действие, введите Talk to my test app в поле ввода и нажмите клавишу ввода.
  4. Вы должны увидеть ответ, приветствующий вас в Action Gym. Попробуйте следовать подсказкам, чтобы продолжить разговор, убедившись, что у вашего выполнения есть ответ на каждый вход.

60acf1ff87b1a87f.png

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

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

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

f48891c8118f7436.png

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

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

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

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

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

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

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

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

c00885cc30e14d68.png

Настройка диалогового потока

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

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

  1. Настройте новое намерение для обработки запроса пользователя на подписку на ежедневные обновления. В консоли Dialogflow нажмите кнопку + рядом с Intents в левой панели навигации, чтобы создать новое намерение.
  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 из пакета action 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. В консоли Actions перейдите к Test .
  2. Введите Talk to my test app в поле ввода и нажмите Enter.
  3. Введите Learn about classes и нажмите Enter. Ответ вашего действия теперь должен предлагать отправлять ежедневные напоминания.
  4. Введите « Send daily reminders и нажмите «Ввод».
  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. Найдите API действий и нажмите « Включить ».

6d464f49c88e70b4.png

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

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

  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-уведомления:

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

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

940379556f559631.png

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

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

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

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

6967f5a997643eb8.png

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

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

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

1ac725231ed279a1.png

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

4304c7cd575f6de3.png

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

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

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

b2f84ff91b0e1396.png В файле index.js обновите функцию require() , чтобы добавить пакет UpdatePermission из пакета action 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 и сохраните его в своей базе данных. Позже вы отправите этот идентификатор пользователя в 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 в 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 и нажмите клавишу ввода.
  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». Нажав на это уведомление, вы перейдете к намерению Class Canceled вашего действия.

33cbde513c10122e.png

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

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

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

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

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

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

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

Congratulations!

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!