見出し画像

アレクサに喋らせる情報をオープンデータから取得する

 アレクサに喋らせる情報をオープンデータから取得したい場合にどうするか。
Googleで検索しても意外と実装例が見つからなかったので紹介します。
(AlexaスキルのエンドポイントはAWSのLambdaでNode.js)

'use strict';
const Alexa = require('alexa-sdk');
const http = require("https");
const URL = 'https://OpenDataServer.com/getData.php';	// オープンデータAPI
const APP_ID = 'amzn1.ask.skill.******************';

//===== 起動 =====
const newSessionHandlers = {
 'LaunchRequest': function () {
  var responseString = '';
  var mythis = this;  // コールバック後に使えるように保存
       
  http.get(URL, (res) => {
   console.log('statusCode:', res.statusCode);
   console.log('headers:', res.headers);
   
   res.on('data', (d) => {
    responseString += d;
   });
   
   res.on('end', function(res) {
    var obj = JSON.parse(responseString);	// responseStringがJSONの時の例
    var speechText = obj.message;		// JSON内のmessageキーの値を取得して喋らせる
    mythis.emit(':tell', speechText);
   });
  }).on('error', (e) => {
   console.error(e);
  });
 },
};
exports.handler = function (event, context, callback) {
 const alexa = Alexa.handler(event, context, callback);
 alexa.APP_ID = APP_ID;
 alexa.registerHandlers(newSessionHandlers);
 alexa.execute();
};

httpは非同期なのでコールバックを使っています。
httpコール時のthisをmythisにコピー保存しておいて、レスポンス取得後にmythisを使ってemitしているところがミソです。
(説明に不要なハンドラは省略しています)

#alexa #skill #lambda #opendata #callback #http #https

いいなと思ったら応援しよう!