我希望Google代理上的操作能够跨调用存储和检索某些信息 - 比如cookie。我该怎么做?
答案 0 :(得分:17)
您可以根据自己的具体操作选择很多选项。虽然有相似之处,但它并不像网络cookie那样。
如果您想要一个会话cookie的等价物,单次对话期间保留的信息,那么您的选项是
app.data
对象中。如果您希望等效的持久cookie可以在会话之间保留信息,那么您的选项就是
app.userStorage
对象中。data.google.userStorage
下的JSON响应中字符串的一部分。有关这些
的更多信息会话ID
为您拥有的每个会话创建不同的会话ID。您可以通过检查sessionId
参数中发送到您的webhook的JSON来获取此会话ID。
然后,您可以在您管理的某种数据存储中查找它。
对话框流程
上下文是Dialogflow提供的强大工具。您将上下文作为履行webhook的一部分返回,并指明上下文的名称,其生命周期(将多少轮对话传递回您的webhook),以及与上下文关联的任何参数(字符串键/值)对)。
上下文对于帮助确定可能调用的意图特别有用。您可以指示哪些上下文必须处于活动状态才能被Dialogflow识别。
如果您正在使用actions-on-google node.js库,则可以使用以下内容设置上下文:
var contextParameters = {
foo: "Something foothy",
bar: "Your local bar."
};
app.setContext( "remember_this", 5, contextParameters );
您需要在致电app.ask()
或app.tell()
之前执行此操作。
或者您可以将JSON中的等效内容作为响应的contextOut
块的一部分
"contextOut": [
{
"name": "remember_this",
"lifespan": 5,
"parameters": {
"foo": "Something foothy",
"bar": "Your local bar."
}
}
]
下次调用webhook时,您可以通过查看result.contexts
数组或使用库中的app.getContext()
或app.getContextArgument()
方法来获取此上下文。
使用app.data
如果您正在使用该库,Google已经为您完成了一些工作。为您创建app.data
对象。您在对象中设置的任何值都可用于会话的生命周期 - 您只需在以后调用webhook时阅读它们。
(在幕后,谷歌使用了一个上下文,所以没有魔法。两者一起工作,你可以自由地做两件事。)
匿名用户ID
当用户首次使用您的操作时,会生成用户ID。此ID不允许您访问有关它们的任何特定信息,并且不会用于任何其他操作,但每次您看到它时,您都可以放心,它与使用它的用户相同前一次发生。然而,就像cookie一样,用户可以重置它,并为他们的动作生成一个新的ID。
您可以在originalRequest.user.userId
或使用app.getUser().userId
的JSON中获取此信息。获得后,您可以使用某种数据存储来存储和检索有关此用户的信息。
使用app.userStorage
与app.data
类似,还为每个用户创建了一个app.userStorage
对象。您对此对象所做的任何更改都会保存在您与此用户的对话之间。
与app.data
不同,它并不存储在上下文中。它有自己的存储方法。这导致......
以JSON格式存储
如果您未使用Google Play操作,则仍可通过响应访问userStorage
并直接请求JSON。您需要将其存储为字符串,但如果您需要存储更复杂的对象,则常见的方法是将其字符串化为JSON。
您可以在回复中将此值存储在data.google.userStorage
下,并可以在您的webhook收到的请求中的originalRequest.data.user.userStorage
下检索该值。
答案 1 :(得分:0)
您还可以使用Google {(3}}或BigQuery
等Google云数据库答案 2 :(得分:0)
听起来您可能想要结帐帐户关联:https://developers.google.com/actions/identity/account-linking。通过帐户关联,您可以通过提供唯一密钥来收集您与Google交换的最终用户信息。此唯一密钥成为您从Google收到的每个请求的一部分,因此当您获得该唯一密钥时,您将查找从最终用户收集的信息。在您的情况下,您将存储凭据或访问最终用户信息所需的任何密钥。在初始链接之后,您获得的任何新数据都可以与收集的原始信息一起存储,具体取决于在帐户链接期间获得的唯一密钥。
答案 3 :(得分:0)
您可以使用键值参数将信息保存在上下文中。
在上下文中保存值:
agent.set.Context({
name:'context-name',
lifespan: 5,
parameters:{
'parameter-name':'parameter-value'
}
});
从上下文中获取值
agent.getContext('context-name');
有关更多详细信息:https://dialogflow.com/docs/contexts/contexts-fulfillment
答案 4 :(得分:0)
为此,我只是为此做了一个节点模块,在api调用的外部json文件中,我需要存储并添加其他信息以供以后检索。我想您可以使用此模块做很多事情,存储对象,数组,json,值,导航历史记录?,返回上一页。 它的工作方式类似于localStorage或Cookies。 没有限制,您可以通过名称(键)一个值创建多个存储。它是新的,我现在正在我自己的项目中测试它的错误。
vStorage = require('virtual-storage');
vStorage.set('name', '{title:'Title 1', description:'Descriptions 1'}')
let getStorage_name = vStorage.get('name');
console.log(getStorage_name.title);
vStorage.get('name')