通过适用于 Google 助理的 Action 吸引用户

1. 概览

Google 助理是 Google 虚拟智能个人助理,借助 Actions on Google 开发者平台,您可以打造软件,从而为超过 10 亿台设备(包括智能音箱、手机、汽车、电视、头戴式耳机等)扩展 Google 助理的功能。用户可通过对话与 Google 助理互动,以这种方式处理各种事务,例如购买日用品或约车。(如需查看可执行操作的完整列表,请参阅操作目录。)作为开发者,您可以使用 Actions on Google 在用户和您的第三方服务之间轻松打造并管理愉悦、高效的对话体验。

本 Codelab 模块属于高级学习单元,适合在构建适用于 Google 助理的 Action 方面具备一些经验的用户。如果您之前没有任何 Actions on Google 开发经验,我们强烈建议您先学习我们的入门级 Codelab(第 1 级第 2 级第 3 级),以熟悉该平台。这些高级模块会逐步指导您学习一系列的功能,从而帮助您扩展 Action 的功能并扩大自己的受众群体。

衡量 Action 成功与否的一个重要方式是用户互动度,即 Action 在用户首次互动后吸引他们回访的有效程度。为了让用户更轻松地返回对话,您可以在 Action 中实现多项功能,为用户提供返回对话的途径。

此 Codelab 介绍了 Google 助理应用的提高用户互动度的功能和最佳实践。

a3fc0061bd01a75.png 961ef6e27dc73da2.png

构建内容

您将通过以下方式增强已构建的功能:

  • 向用户发送每日更新,用户可以点按该更新来与您的 Action 对话
  • 向用户发送可链接回您的 Action 的推送通知
  • 创建链接,以便用户通过移动网络浏览器访问您的 Action

学习内容

  • 什么是用户互动度,以及它对 Action 的成功有何重要意义
  • 如何修改 Action 以提高用户互动度
  • 在不同类型的操作中使用哪些用户互动功能
  • 如何使用 Actions API 通过 Google 助理发送通知

所需条件

您必须拥有以下工具:

  • 您选择的 IDE/文本编辑器,例如 WebStormAtomSublime
  • 已安装 Node.js、npm 和 git 的终端,用于运行 shell 命令
  • 网络浏览器,例如 Google Chrome
  • 使用 Firebase 命令行界面的本地开发环境
  • 已启用 Google 助理的移动设备(Android 或 iOS)(您必须使用与构建此项目时所用的 Google 账号相同的账号登录 Google 助理。)

我们还强烈建议(但不强制要求)您熟悉 JavaScript (ES6),以便理解 Webhook 代码。

2. 设置项目

本部分介绍如何向之前构建的完整操作添加用户互动功能。

了解示例

本 Codelab 的示例是一个简单的 Action,适用于一家名为“Action Gym”的虚构健身房。该操作会提供有关健身房的信息,包括每天轮换的课程列表。此类信息丰富的操作非常适合用于所有用户互动功能,因为轮换的课程列表每天都会提供不同的实用信息。

下图显示了 Action Gym 示例的对话流程:

e2d6e4ad98948cf3.png

您将对对话框进行细微修改,以更好地适应您添加的互动功能。不过,对话的总体设计不会有太大变化。

下载基础文件

运行以下命令,克隆 Codelab 的 GitHub 代码库:

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

设置项目和代理

如需设置 Actions 项目和 Dialogflow 代理,请完成以下步骤:

  1. 打开 Actions 控制台
  2. 点击 New project
  3. 输入 Project name,例如 engagement-codelab
  4. 点击创建项目
  5. 不要选择类别,而是向下滚动到更多选项部分,然后点击对话式卡片。
  6. 点击构建操作以展开选项,然后选择添加操作
  7. 点击添加您的第一个操作
  8. 创建操作对话框中,选择自定义 intent,然后点击构建以启动 Dialogflow 控制台。
  9. 在 Dialogflow 控制台的代理创建页面中,点击创建
  10. 点击左侧导航栏中的 6bf56243a8a11a3b.png(齿轮图标)。
  11. 依次点击导出和导入从 Zip 文件恢复
  12. 上传您之前下载的 /user-engagement-codelab-nodejs/start/ 目录中的 agent.zip 文件。
  13. 输入 RESTORE,然后点击恢复
  14. 点击完成

部署执行方式

现在,您的 Actions 项目和 Dialogflow 代理已准备就绪,接下来请使用 Firebase Functions CLI 部署本地 index.js 文件。

从基础文件克隆的 /user-engagement-codelab-nodejs/start/functions/ 目录中,运行以下命令:

firebase use <PROJECT_ID>
npm install
firebase deploy

几分钟后,您应该会看到“Deploy complete!”,这表示您已成功将网络钩子部署到 Firebase。

检索部署网址

您需要向 Dialogflow 提供云函数的网址。如需检索此网址,请按以下步骤操作:

  1. 打开 Firebase 控制台
  2. 从选项列表中选择您的 Actions 项目。
  3. 在左侧导航栏中,依次前往开发 > 函数。如果系统提示您“选择数据共享设置”,您可以点击稍后执行此操作来忽略此选项。
  4. 信息中心标签页中,您应该会看到“fulfillment”条目,其触发器下有一个网址。保存此网址;在下一部分中,您需要将其复制到 Dialogflow 中。

1741a329947975db.png

在 Dialogflow 中设置 webhook 网址

现在,您需要更新 Dialogflow 代理,以使用您的 webhook 进行 fulfillment。为此,请按以下步骤操作:

  1. 打开 Dialogflow 控制台(您可以根据需要关闭 Firebase 控制台)。
  2. 点击左侧导航栏中的 Fulfillment
  3. 启用 Webhook
  4. 粘贴您从 Firebase 控制台中复制的网址(如果该网址尚未显示)。
  5. 点击保存

验证您的项目是否已正确设置

用户应能够调用您的 Action 来获取有关 Action Gym 的信息,包括包含营业时间的硬编码文本响应,以及列出每周每天的课程表的文本响应。

如需在 Actions 模拟器中测试您的 Action,请执行以下操作:

  1. 在 Dialogflow 控制台左侧导航栏中,依次点击集成 > Google 助理
  2. 确保已启用自动预览更改,然后点击测试以更新您的操作项目。
  3. Actions 模拟器会加载您的 Actions 项目。如需测试您的 Action,请在 Input 字段中输入 Talk to my test app,然后按 Enter 键。
  4. 您应该会看到一条欢迎您加入 Action Gym 的响应。尝试按照提示继续对话,同时确保您的履单操作针对每项输入都有相应的回答。

60acf1ff87b1a87f.png

3. 添加每日动态订阅

吸引用户的常用方法是在最合适的时间向他们提供信息。为此,您可以为用户提供订阅某个 intent 的每日更新的选项,这样系统就会向用户发送 Google 助理通知,其中包含指向该 intent 执行方式的直接链接。

在此步骤中,您将了解每日更新订阅,并将其添加到操作的 Class List intent 中。按照这些说明操作后,Action 的对话将如下图所示:

f48891c8118f7436.png

这会如何吸引用户?

智能手机用户可能很熟悉推送通知,该功能可提供特定于应用的信息和更新。每日更新订阅是一种简单的方式,可在 Google 助理之外触达移动设备上的用户,前提是您发送更新所针对的意图每天都能继续为用户提供价值。

每日更新可以作为一种有效的互动工具,但不一定需要纳入每个操作中。在决定是否向 Action 添加每日更新订阅时,请考虑以下提示:

  • 确保每日更新能让用户每天看到不同的实用信息。如果每次点按每日更新后都出现相同的提示,用户可能会在几天后取消订阅。
  • 确保您的对话框在用户直接跳转到每日更新 intent 时对用户有意义。用户不一定会从对话的开头开始,因此不应期望他们了解太多背景信息。
  • 在提示用户订阅每日更新之前,先向用户展示您的 Action 的优势。当用户看到订阅选项时,应该会想“我每天都想看到这些内容”。
  • 不要反复建议用户订阅,以免让用户感到无所适从。在向用户展示订阅内容后,立即提供每日更新订阅,避免在其他地方反复询问用户是否订阅。
  • 在触发更新 intent 后,保持对话简短。大多数每日更新应仅包含单个回答,然后关闭,而无需用户输入。

开启每日动态

您可以向欢迎意图添加每日更新订阅,以便将用户置于对话的开头,也可以添加更具体的意图,以便将用户深层链接到对话中的某个位置。对于此 Codelab,课程列表 intent 最有意义,因为对话每天都会变化,用户可能会觉得提醒他们有哪些课程可用很有用。

请按照以下步骤为 Class List intent 启用每日更新:

  1. 在 Actions 控制台中,点击 Develop 标签页,然后选择左侧导航栏中的 Actions
  2. 点击操作列表下的课程列表
  3. 用户互动部分下,切换您是否希望向用户提供每日更新选项。
  4. 设置一个描述每日更新的描述性内容标题。上下文将是“你希望我在什么时间向你发送每日”,因此请确保您的标题具有描述性,并且在朗读时听起来正确无误。在此示例中,将内容标题设置为 list of upcoming Action Gym classes
  5. 点击页面顶部的保存

c00885cc30e14d68.png

设置 Dialogflow

在 Dialogflow 控制台中,按以下步骤操作,为每日更新订阅流程创建 intent:

提示用户订阅

  1. 设置一个新 intent 来处理用户要求订阅每日更新的请求。在 Dialogflow 控制台中,点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Setup Updates
  3. 训练短语部分下,添加以下用户表达
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  2. 点击页面顶部的保存

5c70faa02151da0.png

处理用户的决定

  1. 设置一个新 intent,用于处理用户对每日更新订阅提示的响应。点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Confirm Updates
  3. 活动部分下,添加 actions_intent_REGISTER_UPDATE。无论用户最终是否订阅,只要他们完成每日更新订阅流程,就会触发此 Dialogflow 事件。
  4. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  5. 点击页面顶部的保存

b871c2bdadac8abc.png

实现履单

如需在网络钩子中实现执行方式,请完成以下步骤:

加载依赖项

b2f84ff91b0e1396.pngindex.js 文件中,更新 require() 函数以添加 actions-on-google 软件包中的 RegisterUpdate 软件包,使您的导入看起来像这样:

index.js

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

更新建议芯片

b2f84ff91b0e1396.pngindex.js 文件中,向建议芯片标题列表添加一个 DAILY 条目,使您的 Suggestion 定义如下所示:

index.js

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

为新意图添加实现

当用户表示想要订阅时,请调用 RegisterUpdate 辅助函数,并提供更新的目标 intent (Class List) 和类型 (DAILY),以启动每日更新订阅流程。订阅流程结束后,Google 助理会触发 actions_intent_REGISTER_UPDATE 事件,并提供一个 status 实参来描述订阅是否成功。向用户提供后续提示,这些提示会根据订阅状态而变化。

b2f84ff91b0e1396.pngindex.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.pngindex.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

如需在 Actions 模拟器中测试自定义重新提示,请按以下步骤操作:

  1. 在 Actions 控制台中,前往 Test
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. 输入 Learn about classes,然后按 Enter 键。现在,您的 Action 的回答应该会建议发送每日提醒。
  4. 输入 Send daily reminders,然后按 Enter 键。
  5. 输入您希望看到更新的时间,然后按 Enter 键。出于测试目的,请尝试在当前时间 3-5 分钟后回复。

83a15ecac8c71787.png

在移动设备上,您应该会在指定的时间前后收到 Google 助理发来的通知,提示您更新信息。请注意,此通知可能需要几分钟才能显示。点按通知,系统应会直接深层链接到 Google 助理中的课程列表 intent,从而为您提供即将开设的课程列表:

8582482eafc67d5b.png

4. 添加推送通知

除了在您的 Action 之外与用户互动之外,您还可以调用 Actions API 向用户发送推送通知。与每日更新不同,这些通知不会由 Google 助理自动安排,因此您可以随时发送。

在此步骤中,您将学习如何通过添加新的 Class Canceled intent 并在用户取消课程时向其发送通知,在您的 Action 中实现推送通知。您还需要设置以下三个发送通知所需的组件:

  • Actions API 账号 - 您可以通过向 API 发送 POST 请求来向用户发送通知,因此您需要设置服务账号和凭据才能与此 API 进行交互。
  • 权限帮助程序 - 您需要获得用户许可才能访问发送推送通知所需的用户 ID。在此示例中,您将使用客户端库函数来调用权限辅助函数并请求此 ID。
  • 存储 - 为了向对话之外的用户发送推送通知,您需要将用户 ID 存储在可以随时调用的位置。在此示例中,您将设置一个 Firestore 数据库来存储每个用户的信息。

按照这些说明操作后,您将在 Action 的对话中添加以下对话:

7c9d4b633c547823.png

这会如何吸引用户?

智能手机用户可能很熟悉推送通知,该功能可提供特定于应用的信息和更新。推送通知是一种灵活的方式,可在用户不在使用 Google 助理时通过移动设备触达用户,前提是用户有充分的理由启用推送通知。如果选择每日更新,用户已经知道他们会每天收到通知。不过,对于推送通知,用户不知道他们选择接收的是不频繁的通知,还是每天会收到多条通知。

推送通知是一种实用的互动工具,但不一定需要纳入每个操作中。在决定是否向 Action 添加推送通知时,请考虑以下提示:

  • 为推送通知规划一些示例时间表。如果您计划每天只发送一条推送通知,请考虑改用每日更新。
  • 确保每次收到推送通知时,都能从中获取实用信息。通知还可以深层链接到某个操作的 intent,因此请确保该 intent 有用且相关。
  • 在请求用户订阅推送通知时,请明确说明。他们应了解每次推送通知的预期内容,并大致了解通知的发送频率。

启用 Actions 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
  • 角色:项目 > 所有者
  • 服务账号 ID: service-account(始终后跟 @<project_id>.iam.gserviceaccount.com)
  • 密钥类型:JSON
  1. 点击创建
  2. 将下载的 JSON 文件移动到项目的 /user-engagement-codelab/start/functions/ 目录。
  3. 将 JSON 文件重命名为 service-account.json

d9bd79d35691de3a.png

启用 Firestore

为了在对话之外发送通知,您需要一种存储用户 ID 的方式,以便从通知代码中引用这些 ID。在此示例中,我们使用 Firestore 数据库来存储订阅用户的用户 ID。

请按照以下步骤为您的操作创建 Firestore 数据库:

  1. Firebase 控制台中,选择您的 Actions 项目名称。
  2. 在左侧导航栏中,依次前往开发 > 数据库,然后点击创建数据库
  3. 选择以测试模式开始
  4. 点击启用

6dfc386413954caa.png

设置 Dialogflow

在 Dialogflow 控制台中,按以下步骤操作,创建推送通知选择启用流程:

提示用户订阅

  1. 设置一个新 intent,以处理用户要求订阅已取消课程的推送通知。在 Dialogflow 控制台中,点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Setup Push Notifications
  3. 训练短语部分下,添加以下用户表达
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  2. 点击页面顶部的保存

3d99bc41d0492552.png

处理用户的决定

  1. 设置新的 intent 以处理用户对推送通知订阅提示的响应。点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Confirm Push Notifications
  3. 活动部分下,添加 actions_intent_PERMISSION。无论用户最终是否订阅,只要他们完成推送通知订阅流程,就会触发此 Dialogflow 事件。
  4. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  5. 点击页面顶部的保存

d37f550c5e07cb73.png

处理推送通知

您可以将推送通知关联到特定 intent,这样一来,点按推送通知的用户就会通过深层链接直接跳转到您 Action 中的相应 intent。在此示例中,添加了一个新的推送通知 intent,用于提供有关已取消课程的详细信息。

如需添加在用户点按推送通知时触发的 intent,请按以下步骤操作:

  1. 在 Dialogflow 控制台中,点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Class Canceled
  3. 训练短语 (Training phrases) 部分下,添加 Cancelations 作为用户表达
  4. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  5. 点击页面顶部的保存

940379556f559631.png

在对话中发送测试通知

在生产环境中,您应该有一个与操作执行代码分开的脚本来发送推送通知。在此示例中,创建一个可在与您的操作对话时调用以发送推送通知的 intent。此意图仅用于调试目的;实际上,推送通知不应由您的 fulfillment 处理,也不应作为 Action 对话的一部分触发。

请按照以下步骤创建用于测试推送通知的 intent:

  1. 出于测试和调试目的,请设置一项新 intent,以便您向订阅用户发送推送通知。在 Dialogflow 控制台中,点击左侧导航栏中意图旁边的 + 按钮,以创建新的意图。
  2. 将此新 intent 命名为 Test Notification
  3. 训练短语 (Training phrases) 部分下,添加 Test notification 作为用户表达
  4. Fulfillment 部分下方,切换为此意图启用 Webhook 调用 (Enable webhook call for this intent) 选项。
  5. 点击页面顶部的保存

6967f5a997643eb8.png

开启推送通知

请按以下步骤操作,为课程取消 intent 启用推送通知:

  1. 在 Dialogflow 控制台中,前往导航栏中的集成
  2. Google 助理卡片上,点击集成设置
  3. 添加 Class Canceled 作为隐式调用 intent。此步骤是必需的,因为只有这样,Dialogflow 才能识别出用户可以通过 Class Canceled 意图(通过点按推送通知)开始对话。
  4. 点击关闭

1ac725231ed279a1.png

  1. 在 Actions 控制台中,点击 Develop 标签页,然后选择左侧导航栏中的 Actions
  2. 操作列表中,点击课程已取消
  3. 用户互动部分下,切换您是否要发送推送通知?选项。
  4. 设置描述推送通知的描述性内容标题。上下文将是“我能向你发送有关的推送通知吗?”,因此请确保您的标题既具有描述性,又在朗读时听起来正确无误。在此示例中,将内容标题设置为 class cancelations
  5. 点击页面顶部的保存

4304c7cd575f6de3.png

实现履单

如需在网络钩子中实现执行方式,请完成以下步骤:

加载依赖项

b2f84ff91b0e1396.pngindex.js 文件中,更新 require() 函数以添加 actions-on-google 软件包中的 UpdatePermission 软件包,使您的导入看起来像这样:

index.js

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

更新建议芯片

b2f84ff91b0e1396.pngindex.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-libraryrequest 软件包,以处理对 Actions API 的身份验证和请求。

b2f84ff91b0e1396.pngindex.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.pngindex.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 对象的实参中获取用户 ID,并将其保存在数据库中。您稍后会将此用户 ID 发送到 Actions API,以便 Google 助理确定谁会收到通知。

最后,为通过点按推送通知触发的 Class Canceled intent 添加执行方式。在此示例中,您的回答是一个占位字符串,但在可用于正式版操作的版本中,您的通知脚本会提供有关已取消课程的更动态的信息。

b2f84ff91b0e1396.pngindex.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.');
});

添加测试通知

如需向用户发送推送通知,请向 Actions API 发送 POST 请求,其中包含用户 ID、通知标题和目标 intent。在此示例中,触发“测试通知”intent 将遍历您的 Firestore 数据库,并向订阅了通知的每位用户发送推送通知。

请注意,在此示例中,您在 Webhook 实现中添加了用于发送推送通知的代码,并通过在对话中调用测试 intent 来触发该代码。在您打算发布的 Action 中,推送通知代码应位于与履行业务不同的脚本中。

b2f84ff91b0e1396.pngindex.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.');
});

测试推送通知

在终端中,运行以下命令,将更新后的 Webhook 代码部署到 Firebase:

firebase deploy

如需在 Actions 模拟器中测试通知,请按以下步骤操作:

  1. 在 Actions 控制台中,前往测试标签页。
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. 输入 Learn about classes,然后按 Enter 键。
  4. 输入 Get notifications,然后按 Enter 键。
  5. 如果您尚未向 Action 授予向您发送推送通知的权限,请键入 yes 并按 Enter 键。
  6. 输入 yes,然后按 Enter 键。您的 Google 账号现在应该已订阅此 Action 的推送通知。

3a8704bdc0bcbb17.png

  1. 输入 no 并按 Enter 键退出。
  2. 输入 Talk to my test app 并按 Enter 键即可开始新对话。
  3. 输入 Test notification,然后按 Enter 键。

634dfcb0be8dfdec.png

几分钟内,您应该会在移动设备上收到“来自 Action Gym 的测试通知”Google 助理推送通知。点按此通知会将您深层链接到操作的 Class Canceled intent。

33cbde513c10122e.png

5. 创建助理链接

到目前为止,我们讨论了您可以实现哪些互动功能来吸引用户再次使用您的 Action,但前提是用户会发现并使用您的 Action。

您可以创建 Google 助理链接,将移动设备上的用户直接链接到 Google 助理上的 Action。由于 Google 助理链接是标准超链接,因此您可以将其添加到网站或任何网络营销材料中,例如博客或社交媒体帖子。

在此步骤中,您将了解什么是 Google 助理链接、如何为操作的欢迎意图创建 Google 助理链接,以及如何将其添加到简单网站以进行测试。

这会如何吸引用户?

吸引用户首次使用您的 Action 可能是一项挑战,尤其是当用户需要在 Google 助理上显式调用您的 Action 时。Google 助理链接可为用户提供指向您的操作的直接链接,从而缓解这种摩擦。当用户在支持 Google 助理的设备上访问您的 Google 助理链接时,系统会直接将他们转到您的 Action。当用户在非移动设备或任何其他不支持 Google 助理的设备上打开您的链接时,系统仍会将他们引导至您的操作目录商品详情(如果已发布),以便您仍可向这些用户宣传您的操作。

Google 助理链接是一种实用的互动工具,因此如果您打算通过网站或社交媒体宣传您的 Action,就应该创建一个。在创建和分发 Google 助理链接之前,请注意以下提示:

  • 只有在发布操作后,Google 助理链接才会生效。在项目处于草稿状态时,该链接仅适用于您自己的设备。其他用户会被引导至操作目录中的 404 页面。
  • 您可以在 Alpha 版或 Beta 版环境中发布 Action,让用户在发布之前测试 Google 助理链接。请注意,只有参与 Alpha 版或 Beta 版测试的用户才能测试您的 Google 助理链接。
  • 请确保您的 Google 助理链接的目标 intent 能给新用户留下良好的第一印象。欢迎意图是助理链接的默认目的地,因为它应该已经能够很好地介绍您的操作

请按照以下步骤为欢迎意图创建 Google 助理链接:

  1. 在 Actions 控制台中,点击 Develop 标签页,然后选择左侧导航栏中的 Actions
  2. Actions 列表下点击 actions.intent.MAIN
  3. 链接部分下,切换您是否要为此操作启用网址选项。
  4. 设置一个描述性链接标题,用于描述您的操作。将您的 Action 的标题设为简单的动词-名词对,以描述用户可以通过您的 Action 完成哪些操作。在此示例中,将链接标题设置为 learn about Action Gym
  5. 复制此页面底部的 HTML 代码段,并将其保存以备后用。
  6. 点击页面顶部的保存

55341b8102b71eab.png

部署测试网站

如需测试您的 Google 助理链接,您可以使用 Firebase 工具部署一个测试网站以及您的履单。我们已为此示例构建了一个简单的测试网站,您只需添加 Google 助理链接即可。

前往履单的 /user-engagement-codelab-nodejs/start/public/ 目录,然后在文本编辑器中打开 index.html 文件。

b2f84ff91b0e1396.pngindex.html 文件中,将 Google 助理链接的 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

部署命令运行完毕后,记下输出中的 Hosting 网址

b01e8d322fb5d623.png

在移动设备的网络浏览器中前往此网址,您应该会在测试网站上看到助理链接。在移动设备上点击此链接后,您应该会进入 Google 助理中的操作欢迎意图。

599845d647f5b624.png

您还可以尝试在桌面浏览器中前往托管网址,由于您的 Action 未发布,因此系统应会将您带到助理目录中的 404 页面。

6. 后续步骤

恭喜!

您现在已经了解了在开发 Action 时用户互动的重要性、平台上的用户互动功能,以及如何将每项功能添加到 Action 中。

其他学习资源

如需详细了解如何提高 Action 的用户互动度,请浏览以下资源:

欢迎关注我们的 Twitter 账号 @ActionsOnGoogle,及时了解我们的最新公告,还可以使用标签 #AoGDevs 发布 Twitter 微博,分享您构建的成果!

反馈调查问卷

在您离开本页面前,请填写此表单,告诉我们您认为我们做得如何!