如何创建从 HTTP/HTTPS API 获取数据的 Alexa Skill(在 AWS Lambda 上使用适用于 Node.js 的“Alexa Skills Kit”)

2023-11-21

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

由于 Node.js 的事件驱动概念以及 Node.js 的内部结构,这里存在一些挑战(尤其是对于 Node.js 新手)Node.js 的 Alexa 技能套件。从用户那里获取参数也不是那么容易。

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


预赛

  • 首先,您需要一个 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. 当您在 node.js 中使用以下命令发出 http get 请求时https.get()您需要为结束回调提供一个处理程序,例如res.on('end', function(res) {});
  2. 当您调用时,答案将从 Lambda 脚本发送回 Alexa 服务this.emit(':tell', 'blabla');(这是 AWS 示例中使用的内容)。但在最终处理程序中,“this”不再是正确的“this”,您需要事先存储句柄(我使用 mythis 这样做有点歪,我确信有更智能的解决方案,但它有效)。

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

The code

我的示例中,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();
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建从 HTTP/HTTPS API 获取数据的 Alexa Skill(在 AWS Lambda 上使用适用于 Node.js 的“Alexa Skills Kit”) 的相关文章

随机推荐