【问题标题】:How do I create an Alexa Skill that gets data from an HTTP/HTTPS API (using "Alexa Skills Kit" for Node.js on AWS Lambda)如何创建从 HTTP/HTTPS API 获取数据的 Alexa 技能(在 AWS Lambda 上为 Node.js 使用“Alexa Skills Kit”)
【发布时间】:2017-07-14 10:58:59
【问题描述】:

我想为 Amazon Alexa 创建一项技能 - 当由语音命令触发时 - 通过 HTTPS 请求从 API 获取一些信息,并将结果用作对 Alexa 用户的口头回答。

由于 node.js 的事件驱动概念和 Alexa Skills Kit for Node.js 的内部结构,这里有一点挑战(尤其是对于 node.js 新手)。而且从用户那里获得参数也不是那么容易。

有人可以提供一些示例代码吗?

【问题讨论】:

    标签: node.js http lambda https alexa-skills-kit


    【解决方案1】:

    预赛

    • 要开始使用,您需要一个 Amazon 帐户,并且您必须为该帐户启用 AWS。
    • 然后在亚马逊网站上有一个很好的分步指南:https://developer.amazon.com/edw/home.html#/skills
    • 它将逐步引导您完成创建“技能”的过程。技能是 Alexa 用自然语言回答问题的能力。 在此过程中,您还创建了一个 Lambda 函数(选择创建一个演示脚本应用程序,您将自动获取所有必需的库)
    • 然后您可以在 AWS 控制台的 WebUI 中编辑代码)。
    • “技能”会在您的所有个人 Alexa 设备上自动启用,例如我家中的 Amazon Echo dot。
    • 请记住,您可以在 AWS 控制台的 AWS Cloudwatch 部分查看控制台输出。

    我必须理解的两件事(其他人也可能遇到)

    当我创建我的第一个 Alexa Skill 时,我是新的 node.js、Lambda 和 Alexa Skills SDK。所以我遇到了一些问题。我想在此处记录下一个遇到相同问题的人的解决方案。

    1. 当您使用 https.get() 在 node.js 中发出 http get 请求时,您需要为结束回调提供一个处理程序,例如 res.on('end', function (res) {});
    2. 当您调用 this.emit(':tell', 'blabla'); 时,答案会从 Lambda 脚本发送回 Alexa 服务(这是来自AWS)。但是在最终处理程序中,“this”不再是正确的“this”,您需要事先存储句柄(我正在使用 mythis 做这件事有点歪,我相信有更聪明的解决方案,但它有效)。

    如果我有以下代码 sn-p,我可以轻松节省两个小时的调试时间。 :-)

    代码

    我的示例 lambda 脚本已经从 API 获取了预格式化的文本。如果您调用 XML/JSON 或任何 API,您需要更多地处理答案。

    'use strict';
    
    const Alexa = require('alexa-sdk');
    var https = require('https');
    
    const APP_ID = ''; // TODO replace with your app ID (OPTIONAL).
    
    const handlers = {
    
      'functionwithoutdata': function() {
        var responseString = '';
        var mythis = this;
        https.get('**YOURURL**?**yourparameters**', (res) => {
          console.log('statusCode:', res.statusCode);
          console.log('headers:', res.headers);
    
          res.on('data', (d) => {
            responseString += d;
          });
    
          res.on('end', function(res) {
            const speechOutput = responseString;
            console.log('==> Answering: ', speechOutput);
            mythis.emit(':tell', 'The answer is'+speechOutput);
          });
        }).on('error', (e) => {
          console.error(e);
        });
      },
    
      'functionwithdata': function() {
        var mydata = this.event.request.intent.slots.mydata.value;
        console.log('mydata:', mydata);
        var responseString = '';
        var mythis = this;
        https.get('**YOURURL**?**yourparameters**&mydata=' + mydata, (res) => {
          console.log('statusCode:', res.statusCode);
          console.log('headers:', res.headers);
    
          res.on('data', (d) => {
            responseString += d;
          });
    
          res.on('end', function(res) {
            const speechOutput = responseString;
            console.log('==> Answering: ', speechOutput);
            mythis.emit(':tell', 'The answer is'+speechOutput);
          });
        }).on('error', (e) => {
          console.error(e);
        });
      }
    
    };
    
    exports.handler = (event, context) => {
      const alexa = Alexa.handler(event, context);
      alexa.APP_ID = APP_ID;
      alexa.registerHandlers(handlers);
      alexa.execute();
    };

    【讨论】:

      【解决方案2】:

      How to create an Amazon Alexa bot from scratch?

      如果您正在寻找一种方法来创建支持 Alexa 语音的机器人,那么您来对地方了!

      让我们使用在本地主机上运行并通过 ngrok 建立隧道的节点服务器从头开始创建一个 Amazon Alexa 机器人。

      • 注册一个亚马逊开发者账户(如果您没有)

      • 转到 Alexa 开发者页面

      • 转到 Alexa 控制台

      • 点击创建技能

      • 给技能起个名字,我已经命名了我的TestSkill,然后点击下一步

      • 选择一个模型来增加你的技能,我已经为我的实验选择了自定义

      • 点击创建技能

      这样您就可以访问 Alexa 技能仪表板

      • 提供一个调用名称,我将其命名为“给我披萨”,然后点击保存模型

      • 点击端点

      现在,我们需要向 Alexa 控制台提供端点,但首先我们需要设置一个端点。

      创建节点服务器

      创建一个可以在默认位置(即“/”)接受 POST 请求的服务器。

      创建服务器的技术有很多,我个人更喜欢node。

      我假设你已经安装了 node、npm 和 Visual Studio 代码

      针对本教程的具体要求,我们将按照以下步骤创建一个 Hello World 节点应用:

      • 在终端上运行 npm init 并在询问包名称 Alexa 时运行
      • 按照终端向导进行操作
      • 运行cd Alexa
      • package.json 文件中
      • 运行npm i express http -save,这将在package.json文件中添加以下条目:

        “依赖”:{ “快递”:“4.16.3”, “http”:“0.0.0” }

      • index.js的值设置为package.json文件中的主键

      • 在同一级别添加文件index.js
      • -将以下代码添加到 index.js 文件中:

        const express = require('express'); 常量应用程序 = 快递(); app.post('/', (req, res) => res.send({ 版本:'1.0', 回复: { 应该结束会话:假, 输出语音:{ 类型:“SSML”, 文本:'Hello World!', ssml:“你好,世界!” } } })); app.listen(8080, () => console.log('Example app listener on port 8080!'));

      • scripts的值设置为{ “start”: “node index.js” }

      • 在终端上运行npm start

      隧道你的本地主机

      按照以下步骤使用 ngrok 在 PORT 8080 上运行节点服务器上的 localhost 添加隧道:

      • 下载并安装 ngrok(如果尚未完成)
      • 在终端上运行ngrok http 8080
      • 复制启用 SSL 的转发链接,在我的例子中 https://6d0d6e60.ngrok.io 是 SSL 链接
      • 在输入 URL 链接中提供链接
      • 选择 HTTPS,然后在 SSL 证书类型下拉列表中选择第二个选项:

      我的开发端点是具有来自证书颁发机构的通配符证书的域的子域

      • 点击保存端点

      • 点击 JSON 编辑器并提供以下模型:

      { "interactionModel": { "languageModel": { "invocationName": "get me pizza", "intents": [ { "name": "PizzaOrderIntent", "slots": [], "samples": [ "Give me a pizza" ] }, { "name": "AMAZON.FallbackIntent", "samples": [ "I didn't understand" ] }, { "name": "AMAZON.CancelIntent", "samples": [ "cancel plz" ] }, { "name": "AMAZON.HelpIntent", "samples": [ "help" ] }, { "name": "AMAZON.StopIntent", "samples": [ "stop" ] } ], "types": [] } } }
      • 点击保存模型,然后点击构建模型

      一旦构建了技能模型 - 我们需要对其进行测试。单击“测试”选项卡并打开“已为此技能启用测试”。

      就是这样,您已经创建了一个连接到本地运行的节点项目的 Alexa 机器人。

      问题?注释?请通过 info@nordible.com 与我联系

      Read the full article

      【讨论】:

        【解决方案3】:

        这是一个示例代码(不是我的),它使用了不需要使用 awsLambda 的 alexa sdk,并且只适用于 express、纯 nodejs 服务器

        https://github.com/Glogo/alexa-skill-sample-nodejs-express

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-05
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          • 2016-12-25
          • 2021-06-25
          • 2016-07-28
          相关资源
          最近更新 更多