ごめんなさ、いろいろと間違ってたり古かったりしたので修正します。
ask sdkがv2になっていたので、githubに乗っていたのを自分用にまとめる。
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/wiki
とりあえずインストール
$ mkdir SampleV2
$ cd SampleV2
$ npm init
$ npm install --save ask-sdk
とりあえずLounchRequestの処理まで
LaunchRequest
とは、特別なインテントなしでスキル名を呼ばれたときに発動される処理
$ vi index.js
'use strict';
const Alexa = require('ask-sdk');
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
handle(handlerInput) {
const speechText = 'こんにちわー';
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.withSimpleCard('これはカード', speechText)
.getResponse();
}
};
// LaunchRequestHnadlerより後に書く必要あり
exports.handler = Alexa.SkillBuilders.standard()
.addRequestHandlers(LaunchRequestHandler)
.lambda();
とりあえず、これで起動名を呼べば返答がくる
俺:「アレクサ、○○を開いて」
アレクサ:「こんにちわー」
...会話は続く...
自分で定義したインテントを設定する
以下を追加
sampleIntent
が自分で定義したインテント名
const sampleIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'sampleIntent';
},
handle(handlerInput) {
const speechText = 'これは自分で設定したインテントです';
return handlerInput.responseBuilder
.speak(speechText)
.withSimpleCard('自分で設定したインテントのカード', speechText)
.getResponse();
}
};
以下を修正
exports.handler = Alexa.SkillBuilders.standard()
.addRequestHandlers(LaunchRequestHandler, sampleIntentHandler) // sampleIntentHandlerを追加
.lambda();
に修正。sampleIntentHandler
を追加しただけ
エラー処理(unhandled)
v1でのunhandled
の代わりのやつ
以下を追加
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
return handlerInput.responseBuilder
.speak('もう一度おねがい(ハート)')
.getResponse();
},
};
以下を修正
exports.handler = Alexa.SkillBuilders.standard()
.addRequestHandlers(LaunchRequestHandler, sampleIntentHandler)
.addErrorHandlers(ErrorHandler) // これを追加
.lambda();
sessionの保持
v1の時にthis.attributes["sample"];
とかってやってたやつ
保存
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
sessionAttributes.sample = 'sampleは保存したい名前';
取得
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
console.log(sessionAttributes.sample); //sampleは保存したい名前
dynamodbに保存
以下を追加
let skill;
exports.handler = async function (event, context) {
if (!skill) {
skill = Alexa.SkillBuilders.standard() // <= standard()
.addRequestHandlers(
LaunchRequestHandler)
.withTableName("sampleTableName") // これを追加(テーブル名)
.withAutoCreateTable(true) //テーブル作成もスキルから行う場合は、これも追加
.create();
}
return skill.invoke(event);
}
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
async handle(handlerInput) {
// 取得。awaitで取得するまで待つ
var attributes = await handlerInput.attributesManager.getPersistentAttributes()
// 保存。awaitで保存できるまで待つ
// attributes = {
// "key": "value"
// }
handlerInput.attributesManager.setPersistentAttributes(attributes); // セット
await handlerInput.attributesManager.savePersistentAttributes(); // 保存
var msg = "お返事";
return handlerInput.responseBuilder.speak(msg).reprompt(msg).getResponse();
}
};