理解skill调用

本节来更详细的讨论alexa是如何确定调用哪个skill的。

参考:https://developer.amazon.com/zh/docs/custom-skills/understanding-how-users-invoke-custom-skills.html

明确调用(Specific Request (Intent))

用户在语音中明确的包含了要调用的skill的名字,云会给skill发送一个带有具体intent的 IntentRequest。用户可以有很多种表达方式来明确的调用skill,包括疑问句、祈使句等等,甚至不带具体的请求内容只是呼唤skill的名字。这些都由Alexa来自动处理。Alexa预设了一些调用的表达方式,例如

<some action> <connecting word> <invocation name> e.g.“give me my Taurus horoscope using Daily Horoscopes”

Ask <invocation name> <connecting word> <some action> e.g.“Ask Daily Horoscopes to give me the horoscope for Taurus”

Start <invocation name> and <some action> e.g.“Start Daily Horoscopes and give me the horoscope for Taurus”

这里主要潜在的安全问题就是skill的调用名称的处理了,恶意skill要与正常skill争夺谁被调用。

隐式调用(Name-free Interaction)(beta测试功能)

第二种比较有意思的是隐式调用,用户不需要明确说出想要调用的skill,由Alexa来自动寻找调用合适的skill。大体流程如下:

  1. 用户做出请求行为后,Alexa解析请求,并将请求发送给排名靠前的候选skill,向这些skill来发送CanFulfillIntentRequest 询问是否可以处理该intent。
  2. 如果skill实现了canFulfillIntent,skill此时不应该做出任何实际操作,包括开关灯、播放音乐等等。
  3. Alexa收集响应看哪个skill合适,选择后再发送IntentRequest给被选中的skill。
  4. 收到IntentRequest的skill再回复用户执行具体的操作。

所以,如果skill想要被隐式调用的话,就要实现CanFulfillIntentRequest 接口,userId不会在调用这个接口的时候就传入。这就相当于,Alexa会将用户的intent广播给所有注册了的skill,似乎发给恶意的skill会有一些隐私问题,虽然文档说canFulfillIntent时不应该做出实际操作,但是skill此时是否可以悄悄地发送用户的intent? 官网中的CanFulfillIntentRequest 请求例子如下

{
"request": {
"type": "CanFulfillIntentRequest",
"requestId": "...",
"intent": {
"name": "PlaySound",
"slots": {
"Sound": {
"name": "Sound",
"value": "crickets"
}
},
},
"locale": "en-US",
"timestamp": "..."
},
"context": {
"System": {
"application": {
"applicationId": "amzn1.ask.skill.<skill-id-value>"
},
"user": {
"userId": "<user-id-value>"
},
"device": {
"supportedInterfaces": {}
}
}
},
"version": "1.0"
}

skill需要使用canFulfillIntent 来响应Alexa发出的CanFulfillIntentRequest ,设置canFulfill = "YES"/"NO"/"MAYBE" 来表明本skill是否能处理这个用户的intent。 这个完全也是靠skill自己自觉来回应的,Alexa似乎还没有能力来进一步的确认skill是不是真的有能力?此外,skill的响应和Alexa系统的请求是如何认证保证不被伪造的?

一个intent响应的例子如下:

{
"version":"1.0",
"response":{
"canFulfillIntent": {
"canFulfill": "YES",
"slots":{
"slotName1": {
"canUnderstand": "YES",
"canFulfill": "YES"
},
"slotName2": {
"canUnderstand": "YES",
"canFulfill": "YES"
}
}
}
}
}

亚马逊文档其实在这里给出了答案。亚马逊发来的JSON里会携带一个Application ID,服务端skill的代码要自己检查发来的请求中的Application ID是否与自己Skill ID一样,如果一致才执行,不一致就回复一个HTTP的400 Bad Request。也就是说Skill的ID是个秘密(像这样amzn1.ask.skill.661ecf07-280b-41fe-8fe4-8c5fbCCCCCC)。因此,能否找到泄露的Skill ID,或者开发者是否忘记了检查Skill ID,就是能否伪造Alexa调用Skill请求的关键了。

深入理解Amazon Alexa Skill(二)的更多相关文章

  1. 深入理解Amazon Alexa Skill(三)

    本节来讨论Alexa Skill中涉及到的授权问题. Alexa内功能的授权 Alexa会发给skill用户的token,然后skill代码使用这个token来访问Web API访问用户的Alexa内 ...

  2. 深入理解Amazon Alexa Skill(四)

    本节利用三星Smartthings Classic物联网平台的web service smartapp,实现了一个Alexa智能家居skill的例子,由此来了解Alexa是如何控制其他云的智能家居设备 ...

  3. 深入理解Amazon Alexa Skill(一)

    语音助手(Virtual Personal Assistants, VPA)是物联网智能家居中很火的一个领域,用户可以通过语言作为入口来控制家里各种各样的设备,而亚马逊的Alexa(echo,echo ...

  4. Amazon Alexa登录授权(Android)

    访问Alexa的API,必须要携带AccessToken,也就是必须要登录授权,本文主要记录Amazon Alexa在Android平台上的登录授权过程. 一.在亚马逊开发者平台注册应用 进入亚马逊开 ...

  5. 深入理解C指针之二:C内存管理

    原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...

  6. 深入理解Spring AOP之二代理对象生成

    深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...

  7. 理解JavaScript继承(二)

    理解JavaScript继承(二) 5.寄生式继承 function object(o) { function F() {} F.prototype = o; return new F(); } fu ...

  8. 我理解的数据结构(二)—— 栈(Stack)

    我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构 ...

  9. 深入理解Java AIO(二)—— AIO源码解析

    深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...

随机推荐

  1. CSDN站点CODE配置记录

    为了出门写代码方便.决定还是开个项目.因此才有了这次经历. 原来有在windows下用过git,只是使用方法跟svn一样.尽管曾经也在souceforge或者git上看一些代码,可是对操作一直没有了解 ...

  2. Hudson版本控制 (备注)

    http://www.ttlsa.com/tools/install-hudson-on-linux/

  3. AJAX代码格式

    var request; //XMLHttpRequest的创建 function createRequest(url){ if(window.XMLHttpRequest){ request = n ...

  4. 实践-Task

    实践-Task 上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Li ...

  5. HDU 1244 Max Sum Plus Plus Plus - dp

    传送门 题目大意: 给一个序列,要求将序列分成m段,从左至右每一段分别长l1,l2,...lm,求最大的和是多少. 题目分析: 和最大m段子段和相似,先枚举\(i \in [1,m]\),然后$j \ ...

  6. C#连接Sqlserver代码

    刚开始把数据库的密码搞错了,硬是连不上... //数据库连接类 SqlConnection conn = new SqlConnection("server=.;database=test; ...

  7. [GeekBand] STL 仿函数入门详解

    本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite. ...

  8. Winform中GridView分组排序实现功能

    由于客户最近要扩充公司的业务,之前基于Winform+web开发混合式的系统已经不能满足他们的需求,需要从新对系统进行分区处理. 考虑到系统模块里面用到的GridView视图比较多,我就结合了DevE ...

  9. jquery大事-resize()办法

    为了形成用于电流大小的缩放对象构造监控事件. JQuery提供resize大事.在每一个匹配元素的resize函数到事件绑定,让我们适应窗口大小.对齐等.,档窗体改变大小时触发 这里有两种监听方式,一 ...

  10. 零基础WINDOWS

    课前准备 我们将会从零基础带领大家一步一步的学习Web前端技术,这个零基础是什么概念呢?你只要具备以下技能就可以学习: 一.个人学习条件(必备) 会开关电脑,手机.(哇塞,任老师你逗我们吧!). 会打 ...