如何创build一个从HTTP / HTTPS API获取数据的Alexa Skill(在AWS Lambda上使用Node.js的“Alexa技能工具包”)

我想创build一个亚马逊Alexa的技术 – 当被语音命令触发时 – 通过HTTPS请求从API获取一些信息,并将结果用作对Alexa用户的口头答复。

由于node.js的事件驱动的概念和Node.js的Alexa技能工具包的内部,这里有一个小小的挑战(特别是对于node.js新手)。 而从用户那里获取参数也不是那么容易。

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

预赛

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

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

当我创build我的第一个Alexa技能时,我是新的node.js,Lambda和Alexa技能SDK。 所以我遇到了一些问题。 我想为下一个出现同样问题的人logging解决scheme。

  1. 当您使用https.get()在node.js中创build http请求时,您需要为res.on('end',function(res){});
  2. 当您调用this.emit(':tell','blabla')时,答案会从Lambda脚本发回到Alexa服务 (这是来自AWS的样本中使用的)。 但最终处理程序“this”不是正确的“this”了,你需要预先存储句柄(我用这个mythis有点歪曲,我相信有更聪明的解决scheme,但它的工作原理)。

如果我有下面的代码片段,我可以轻松地保存两个小时的debugging。 🙂

代码

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