Node.js
ask
Alexa
AlexaSkillsKit
ask-sdk

ask-sdk V2 になってたのでまとめた

ごめんなさ、いろいろと間違ってたり古かったりしたので修正します。

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();
}
};