LoginSignup
17
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-22

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
11