- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 API.AI 和 Google 助理,我请求获取用户姓名和位置的权限。目的是我将能够请求一次许可,随后对我的 Action 的请求将不需要再次请求(因为每次用户与我的 Action 交谈时,这都会导致对话非常生硬)。
我发现我只获得了与 actions_intent_PERMISSION
相关的意图中的信息。 - 即使我已经授予权限,也不会在其他意图实现中发送信息。 (在下面的示例代码中 - 它最终重新请求所有其他意图的权限。)
我也没有看到在调用我的操作之间维护此权限。因此,每次触发 Action 时,都会(再次)询问他们是否授予 Action 权限。
这两种行为似乎都很奇怪。通常,应用程序模型不需要我在应用程序调用之间重新授权对资源的权限,甚至在应用程序“运行”时也不需要。甚至网页在 session 期间也会保留授权。我做错了什么,还是这是预期的行为?
正在执行的代码(这在 Google Cloud Functions 中运行,并且有一些额外的结构通过 Promise 进行这些调用 - 这只是代码的相关部分)。 res.send(200)
只是向 API.AI 表明它应该使用那里定义的响应,并且可以正常工作。 return Promise.resolve(null);
只是确保不执行其他后备/错误条件。
exports.process = function( req, res ){
var app = new ApiAiApp({request:req, response:res});
if( app.isPermissionGranted() ){
res.send( 200 );
return Promise.resolve( null );
} else {
return askPermission( req, res, app );
}
};
var askPermission = function( req, res, app ){
//app.tell('foo');
let namePermission = app.SupportedPermissions.NAME;
let preciseLocationPermission = app.SupportedPermissions.DEVICE_PRECISE_LOCATION;
// Ask for more than one permission. User can authorize all or none.
app.askForPermissions('To address you by name and know your location',
[namePermission, preciseLocationPermission]);
return Promise.resolve( null );
};
actions_intent_PERMISSION
的 API.AI Intent要求:
{
"originalRequest": {
"source": "google",
"version": "2",
"data": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
},
"inputs": [
{
"rawInputs": [
{
"query": "talk to my test app",
"inputType": "KEYBOARD"
}
],
"intent": "actions.intent.MAIN"
}
],
"user": {
"locale": "en-US",
"userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
},
"device": {},
"conversation": {
"conversationId": "1499807128489",
"type": "NEW"
}
}
},
"id": "7e301f85-4178-4be6-8b7c-408bad3ef62b",
"timestamp": "2017-07-11T21:05:28.504Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "GOOGLE_ASSISTANT_WELCOME",
"speech": "",
"action": "input.welcome",
"actionIncomplete": false,
"parameters": {},
"contexts": [
{
"name": "google_assistant_welcome",
"parameters": {},
"lifespan": 0
},
{
"name": "actions_capability_screen_output",
"parameters": {},
"lifespan": 0
},
{
"name": "actions_capability_audio_output",
"parameters": {},
"lifespan": 0
},
{
"name": "google_assistant_input_type_keyboard",
"parameters": {},
"lifespan": 0
}
],
"metadata": {
"intentId": "f31e371a-db9e-4e00-8002-546ec14d40a9",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"nluResponseTime": 2,
"intentName": "Default Welcome Intent"
},
"fulfillment": {
"speech": "I'm not sure, I'm a little confused.",
"messages": [
{
"type": 0,
"speech": "I'm not sure, I'm a little confused."
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1499807128489"
}
originalRequest.data.user
有名字和
originalRequest.data.device
现在有了位置。
{
"originalRequest": {
"source": "google",
"version": "2",
"data": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
},
"inputs": [
{
"rawInputs": [
{
"query": "yes",
"inputType": "KEYBOARD"
}
],
"arguments": [
{
"rawText": "yes",
"textValue": "true",
"name": "PERMISSION"
}
],
"intent": "actions.intent.PERMISSION"
}
],
"user": {
"profile": {
"displayName": "Allen Firstenberg",
"givenName": "Allen",
"familyName": "Firstenberg"
},
"locale": "en-US",
"userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
},
"device": {
"location": {
"coordinates": {
"latitude": 37.4219806,
"longitude": -122.0841979
}
}
},
"conversation": {
"conversationId": "1499807128489",
"type": "ACTIVE",
"conversationToken": "[\"_actions_on_google_\"]"
}
}
},
"id": "7a75593e-55d0-4962-ad91-564d47e5df13",
"timestamp": "2017-07-11T21:05:43.391Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "actions_intent_PERMISSION",
"speech": "",
"action": "",
"actionIncomplete": false,
"parameters": {},
"contexts": [
{
"name": "actions_capability_screen_output",
"parameters": {},
"lifespan": 0
},
{
"name": "_actions_on_google_",
"parameters": {},
"lifespan": 99
},
{
"name": "actions_intent_permission",
"parameters": {
"PERMISSION": "true"
},
"lifespan": 0
},
{
"name": "actions_capability_audio_output",
"parameters": {},
"lifespan": 0
},
{
"name": "google_assistant_input_type_keyboard",
"parameters": {},
"lifespan": 0
}
],
"metadata": {
"intentId": "5d154d71-63f1-43a9-9c18-70d78bfd700f",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"nluResponseTime": 1,
"intentName": "Location result"
},
"fulfillment": {
"speech": "you're allowed",
"messages": [
{
"type": 0,
"speech": "you're allowed"
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1499807128489"
}
{
"originalRequest": {
"source": "google",
"version": "2",
"data": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
},
"inputs": [
{
"rawInputs": [
{
"query": "simple test",
"inputType": "KEYBOARD"
}
],
"arguments": [
{
"rawText": "simple test",
"textValue": "simple test",
"name": "text"
}
],
"intent": "actions.intent.TEXT"
}
],
"user": {
"locale": "en-US",
"userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
},
"device": {},
"conversation": {
"conversationId": "1499807128489",
"type": "ACTIVE",
"conversationToken": "[\"_actions_on_google_\"]"
}
}
},
"id": "f1804e02-bafc-4656-8726-0955bfb4f75d",
"timestamp": "2017-07-11T21:05:55.001Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "simple test",
"speech": "",
"action": "",
"actionIncomplete": false,
"parameters": {},
"contexts": [
{
"name": "actions_capability_screen_output",
"parameters": {},
"lifespan": 0
},
{
"name": "_actions_on_google_",
"parameters": {},
"lifespan": 98
},
{
"name": "actions_capability_audio_output",
"parameters": {},
"lifespan": 0
},
{
"name": "google_assistant_input_type_keyboard",
"parameters": {},
"lifespan": 0
}
],
"metadata": {
"intentId": "48257e82-3615-4445-8ea2-be21980b7115",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"nluResponseTime": 4,
"intentName": "simple test"
},
"fulfillment": {
"speech": "",
"messages": [
{
"type": 0,
"speech": ""
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1499807128489"
}
最佳答案
这是预期的行为。现在,我们建议在您的终端上保留用户许可的数据,由用户 ID 键入。要了解我们可能会如何推荐这样做,请查看 Name Psychic样本。在该示例中,我们使用 Firebase Realtime DB跨意图/对话保留该用户的许可数据。
关于actions-on-google - 请求之间未存储 Google 助理位置权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45044623/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!