アレクサに喋らせる情報をオープンデータから取得する
アレクサに喋らせる情報をオープンデータから取得したい場合にどうするか。
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しているところがミソです。
(説明に不要なハンドラは省略しています)