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

Dir*_*ler 6 https lambda http node.js alexa-skills-kit

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

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

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

Dir*_*ler 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',function(res){})等结束回调提供处理程序;
  2. 当你调用this.emit(':tell','blabla')时,答案将从Lambda脚本发送回Alexa服务; (这是来自AWS的样本中使用的内容).但是在最终处理程序中"这个"不再是正确的"这个",你需要预先存储句柄(我使用mythis做一点歪曲,我相信有更聪明的解决方案,但它确实有效).

如果我有以下代码片段,我会轻松保存两个小时的调试.:-)

代码

我的示例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();
};
Run Code Online (Sandbox Code Playgroud)