在 Dialogflow 中探索
点击继续,将我们的“保存数据”示例导入 Dialogflow 中。然后,按照 部署和测试示例的步骤如下:
- 输入代理名称并为示例创建新的 Dialogflow 代理。
- 代理导入完成后,点击转到代理 (Go to agent)。
- 在主导航菜单中,前往 Fulfillment。
- 启用内嵌编辑器,然后点击部署。编辑器包含示例 代码。
- 在主导航菜单中,前往 Integrations(集成),然后点击 Google Google 助理。
- 在显示的模态窗口中,启用 Auto-preview changes(自动预览更改),然后点击 Test(测试) 打开 Actions 模拟器。
- 在模拟器中,输入
Talk to my test app
以测试该示例!
提供出色用户体验的一部分往往是能够节省流量 。 如果您要在单个对话中提供有用的提示, 保存不同会话中的游戏得分,或者记住少量信息 。
根据是否需要在单个文件夹内保存数据,相关要求会略有不同
或跨会话进行共享如要在对话中保存数据,您可以执行以下操作:
使用 AppResponse
对象的 conversationToken
字段。
如要保存不同对话的数据,请改为按以下步骤操作:
- 确定用户是经过验证的用户还是访客。
- 使用
userStorage
字段存储或访问用户数据 您的AppResponse
对象。
在各轮对话之间保存数据
conversationToken
字段是一个字符串,其中包含一个不透明令牌,
会在每轮对话中重新循环到相应 Action。例如,如果您将
第 1 轮中,您在AppResponse
中将值设为 "count=1"
对话,即你的 Action 在第二轮收到的AppRequest
的 conversationToken
中包含 "count=1"
。
令牌始终在
对话。如果您使用
Actions on Google Node.js 客户端库,
使用 conv.data
将对话令牌作为 JSON 对象进行接口处理,其中
conv
是您的 Conversation
实例。
以下示例展示了如何在 conversationToken
中保存计数器
AppResponse
字段中:
Node.js
conv.data.firstNum = firstNum; conv.ask(`Got it, the first number is ${firstNum}.`); conv.ask(`What's the second number?`);
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getConversationData().put("firstNum", firstNum); responseBuilder.add("Got it, the first number is " + firstNum + "."); responseBuilder.add("What's the second number?"); return responseBuilder.build();
JSON
请注意,下面的 JSON 描述的是 webhook 响应,该响应使用
outputContexts
,而非 conversationToken
。
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Got it, the first number is 23." } }, { "simpleResponse": { "textToSpeech": "What's the second number?" } } ] } } }, "outputContexts": [ { "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google", "lifespanCount": 99, "parameters": { "data": "{\"firstNum\":23}" } } ] }
JSON
请注意,下面的 JSON 描述的是 webhook 响应。
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TEXT" } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "Got it, the first number is 23." } }, { "simpleResponse": { "textToSpeech": "What's the second number?" } } ] } } } ], "conversationToken": "{\"data\":{\"firstNum\":23}}" }
请参阅我们的提供有用的重新提示,并优雅地表示未通过 获取实际使用示例的最佳实践指南。
跨对话保存数据
AppResponse
对象的 userStorage
字段是一个字符串,
包含由 Action 提供的不透明令牌,
特定用户的会话。例如,游戏可以
userStorage
中用户的评分,并在欢迎消息中使用其值
当用户发起新对话时触发。
确定和处理用户验证状态
用户的验证状态可能为 GUEST
或 VERIFIED
。在
开始,Actions on Google 会将用户的验证
根据各种指示显示对话状态。合并为一个
例如,某位用户在移动设备上登录 Google 助理后,
VERIFIED
的验证状态。
导致用户处于验证状态的原因可能有以下几种
GUEST
:
- 用户关闭了个人信息相关结果功能。
- 用户停用了自己的网页和应用活动。请注意,有些用户 您可能在网域级别停用了此设置。
- 如果设备启用了 Voice Match,但匹配失败或用户调用 直接使用 Google 助理,例如长按 Google 助理 首页)。
- 用户未登录。
使用
userStorage
,或者启动账号关联流程以阻止访客用户
与某项功能交互将会失败。
如果您使用的是适用于 Node.js 的 Actions On Google 客户端库,
您可以使用
conv.user.storage
,其中 conv
是您的 Conversation
实例。通过
以下示例展示了如何在userStorage
AppResponse
:
Node.js
app.intent('Save Sum', (conv) => { if (conv.user.verification === 'VERIFIED') { conv.user.storage.sum = conv.data.sum; conv.close(`Alright, I'll store that for next time. See you then.`); } else { conv.close(`I can't save that right now, but we can add ` + `new numbers next time!`); } });
Java
@ForIntent("Save Sum") public ActionResponse saveSum(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Integer sum = ((Double) request.getConversationData().get("sum")).intValue(); String verificationStatus = request.getUser().getUserVerificationStatus(); if (verificationStatus.equals("VERIFIED")) { responseBuilder.getUserStorage().put("sum", sum); responseBuilder.add("Alright, I'll store that for next time. See you then."); } else { responseBuilder.add("I can't save that right now, but we can add new numbers next time!"); } responseBuilder.endConversation(); return responseBuilder.build(); }
Node.js
if (conv.user.verification === 'VERIFIED') { conv.user.storage.sum = conv.data.sum; conv.close(`Alright, I'll store that for next time. See you then.`); } else { conv.close(`I can't save that right now, but we can add ` + `new numbers next time!`); }
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); Integer sum = ((Double) request.getConversationData().get("sum")).intValue(); String verificationStatus = request.getUser().getUserVerificationStatus(); if (verificationStatus.equals("VERIFIED")) { responseBuilder.getUserStorage().put("sum", sum); responseBuilder.add("Alright, I'll store that for next time. See you then."); } else { responseBuilder.add("I can't save that right now, but we can add new numbers next time!"); } responseBuilder.endConversation(); return responseBuilder.build();
JSON
请注意,下面的 JSON 描述的是 webhook 响应。
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I'll store that for next time. See you then." } } ] }, "userStorage": "{\"data\":{\"sum\":68}}" } } }
JSON
请注意,下面的 JSON 描述的是 webhook 响应。
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I'll store that for next time. See you then." } } ] } }, "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}", "userStorage": "{\"data\":{\"sum\":68}}" }
请参阅我们的根据用户偏好打造个性化对话 获取实际使用示例的最佳实践指南。
法律声明:在访问 userStorage
之前先征得用户同意。
部分国家/地区的法规要求开发者必须征得
或者保存某些信息(如
userStorage
中的文档。如果您在这些国家/地区开展业务
或将此类信息保存在
userStorage
,则必须使用
要询问的确认帮助程序
并征得用户同意后,才能开始存储
userStorage
中的信息。
用户存储空间过期
当 Google 助理可以将某个身份与用户匹配时,
userStorage
永不过期,只有用户或 Action 本身可以清除它。
当 Google 助理无法将某个身份与用户匹配时,
对话结束后userStorage
将清除。以下是一些示例
在 Google 助理无法将某个身份与用户匹配的情况下:
- Voice Match 已设置,没有匹配项。
- 用户已停用个人数据。
清除 userStorage 字段的内容
您可以通过以下方式清除 Action 的 userStorage
字段内容:
将 AppResponse
的 resetUserStorage
字段设为 true。如果
您需要将 userStorage
的值设置为空字符串,即
userStorage
在下个对话中保持不变。这样,您就可以
避免在内容不该出现的情况下依次发回整个 userStorage
更改。
如果您使用的是适用于 Node.js 的 Actions On Google 客户端库,
只需将 conv.user.storage
的值设置为 {}
(空对象)即可。
Node.js
app.intent('Forget Number', (conv) => { conv.user.storage = {}; conv.ask(`Alright, I forgot your last result.`); conv.ask(`Let's add two new numbers. What is the first number?`); });
Java
@ForIntent("Forget Number") public ActionResponse forgetNumber(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getUserStorage().clear(); responseBuilder.add("Alright, I forgot your last result."); responseBuilder.add("Let's add two new numbers. What is the first number?"); return responseBuilder.build(); }
Node.js
conv.user.storage = {}; conv.ask(`Alright, I forgot your last result.`); conv.ask(`Let's add two new numbers. What is the first number?`);
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getUserStorage().clear(); responseBuilder.add("Alright, I forgot your last result."); responseBuilder.add("Let's add two new numbers. What is the first number?"); return responseBuilder.build();
JSON
请注意,下面的 JSON 描述的是 webhook 响应。
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I forgot your last result." } }, { "simpleResponse": { "textToSpeech": "Let's add two new numbers. What is the first number?" } } ] }, "userStorage": "{\"data\":{}}" } } }
JSON
请注意,下面的 JSON 描述的是 webhook 响应。
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TEXT" } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I forgot your last result." } }, { "simpleResponse": { "textToSpeech": "Let's add two new numbers. What is the first number?" } } ] } } } ], "userStorage": "{\"data\":{}}" }
作为用户,你可以在自己创建的 Action 中查看 userStorage
字段的内容,
调用。您还可以从该特定 Action 中移除您存储的用户数据
来阻止该服务记住你
- 打开手机上的 Google 助理应用。
- 点按抽屉式导航栏图标。
- 在 Explore 标签页中,找到您要查看的 Action 或清除用户的 Action 轻击存储空间,打开详细信息页。
- 滚动到页面底部。
- 如需查看
userStorage
字段的内容,请点按 [查看存储的数据]。 - 如要移除存储的用户数据,请点按不再允许 $action 记住我。
- 如需查看