如何创建从HTTP / HTTPS API获取数据的Alexa技能(使用" Alexa Skills Kit"用于AWS Lambda上的Node.js)

时间:2017-02-23 19:34:11

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

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

由于node.js的事件驱动概念和Alexa Skills Kit for Node.js的内部结构,这里有一点挑战(特别是对于node.js新手)。从用户手中获取参数并不容易。

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

3 个答案:

答案 0 :(得分:13)

预赛

  • 要开始使用,您需要一个亚马逊帐户,并且必须为该帐户启用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& #39;,function(res){});
  2. 当您致电 this.emit(':告诉',' blabla')时,答案会从Lambda脚本发回给Alexa服务; (这是来自AWS的样本中使用的内容)。但在最终处理程序"这"不是正确的"这个"你需要预先存放手柄(我使用mythis做的有点弯曲,我相信有更智能的解决方案,但它确实有效)。
  3. 如果我有以下代码片段,我会轻松保存两个小时的调试。 : - )

    代码

    我的示例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();
    };
    
    
    

答案 1 :(得分:3)

How to create an Amazon Alexa bot from scratch?

如果您正在寻找一种方法来创建一个支持Alexa语音的机器人,那么您就在正确的位置!

让我们使用在我们的localhost上运行的节点服务器从头开始创建一个Amazon Alexa bot,并通过ngrok进行隧道传输。

  • 如果您没有

  • ,请注册亚马逊开发者帐户
  • 转到Alexa开发者页面

  • 转到Alexa控制台

  • 点击创建技能

  • 为技能命名,我将其命名为TestSkill并点击Next

  • 选择要添加到您技能的模型,我为实验选择了自定义

  • 点击创建技能

通过这种方式,您可以访问Alexa技能信息中心

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

  • 点击端点

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

创建节点服务器

创建一个可以在默认位置接受POST请求的服务器,即“/".

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

我假设你已经安装了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'); const app = express(); app.post('/',(req,res)=>     res.send({         版本:'1.0',         回复:{         shouldEndSession:false,         outputSpeech:{             类型:'SSML',             文字:'Hello World!',             ssml:'Hello World!'             }         }     })); app.listen(8080,()=> console.log('示例应用程序侦听端口8080!');

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

  • 在终端上运行npm start

隧道您的localhost

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

  • 下载并安装ngrok(如果尚未完成)
  • 在终端上运行ngrok http 8080
  • 复制启用SSL的转发链接,在我的情况下https://6d0d6e60.ngrok.io是SSL链接
  • 在“输入网址”链接中提供链接
  • 选择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": []
            }
        }
    }

  • 单击Save Model并单击Build Model

一旦构建技能模型 - 我们需要测试它。单击“测试”选项卡并切换“为此技能启用测试”。

就是这样,你创建了一个连接到你本地运行的节点项目的Alexa僵尸程序。

有问题吗?评论?请通过info@nordible.com与我联系

Read the full article

答案 2 :(得分:0)

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

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