随着智能音箱的普及,如何使用技能与 Alexa 互动成为了一个重要的任务。这里介绍一个 npm 包——@broid/alexa,它能够帮助我们更方便地开发与 Alexa 通讯的技能。
安装
使用 npm 即可安装:
npm install @broid/alexa
使用方法
创建技能
使用 @broid/alexa 前,需要先创建一个技能。在Amazon Developer注册开发者账号后,可以创建新的技能。不在本文的讨论范围内,这里不再进行具体介绍。
引入包
引入 @broid/alexa 并创建 Alexa 对象:
const { Alexa } = require("@broid/alexa"); const alexa = new Alexa(options);
其中 options
表示一些配置信息,比如技能 ID 和对应的处理函数。具体细节可以查看官方文档。
处理请求
Alexa 处理请求的流程如下:
- Alexa 发送一个 HTTP POST 请求到我们设置的 Webhook URL。
- 服务器接收请求并且验证请求的签名。
- 服务器解析请求体,并且根据请求体中的意图调用相应的处理函数并且返回正确格式的响应。
因此,我们需要在服务器上设置相应的路由来处理来自 Alexa 的请求。以 Express 为例:
-- -------------------- ---- ------- ------------- ----- ---- -- - ----- ------- - --------- -- ------------------------------- - -------------------- ------- - -------------------------------------------- -- - ------------------- --- ---
其中验证签名很重要,因此可以在处理请求之前进行此操作。由于 @broid/alexa 封装了很多底层细节,因此处理请求的部分是比较简单的。
处理意图
在技能中,意图是指用户与 Alexa 交互时想要执行的操作。处理意图的流程看起来比较复杂,但 @broid/alexa 将其封装成了一个简单的 API,如下所示:
alexa.interact("intent_name", (ctx) => { // 处理意图的代码 });
其中 "intent_name"
表示要处理的意图名称。我们可以在技能开发者中心设置。
ctx
是一个上下文对象,其中包含了请求、响应、用户信息等等。
下面是一个简单的例子,演示了如何处理一个叫做 “HelloWorldIntent” 的意图:
alexa.interact("HelloWorldIntent", (ctx) => { const speechText = "你好,世界!"; const response = ctx.response; response.say(speechText); response.card({ title: "Hello World", content: speechText }); });
上面的代码首先定义了一个字符串 speechText
,表示 Alexa 要说的话。然后使用 response.say(speechText)
将其添加到响应中。如果需要将卡片信息返回到 Alexa App 上,则可以使用 response.card()
方法。
需要注意的是,response
是一个 AlexaResponse
对象。我们通过 ctx.response
来获取它。
返回响应
当我们处理完请求后,需要返回相应的数据给 Alexa。@broid/alexa 将响应封装成了一个 AlexaResponse
对象。我们可以使用该对象中提供的方法向 Alexa 返回数据。
在前面的例子中,我们已经使用 response.say(speechText)
和 response.card()
方法返回了相应的数据。最后,我们需要将响应对象转换成一个符合 Alexa 标准的 JSON 格式。可以使用 alexa.formatResponse()
方法来完成这个过程:
alexa.handleRequest(payload).then((response) => { res.json(alexa.formatResponse(response)); });
总结
本文介绍了 @broid/alexa 包的使用方法,以及如何处理意图和返回响应。使用 @broid/alexa 可以大大简化与 Alexa 通讯的过程,更加专注于技能的开发。欢迎大家去试试看!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600560d081e8991b448df136