attributesを利用してalexa-sdkでAlexaの会話でデータをひきまわす

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の16日目の記事です。 クイズやガイドスキルなどで、ユーザーの発言を後々のレスポンスに利用したい場合が少なか […]

広告ここから
広告ここまで

目次

    この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の16日目の記事です。

    クイズやガイドスキルなどで、ユーザーの発言を後々のレスポンスに利用したい場合が少なからずあります。

    クイズスキルのソースなどを見るとわかるのですが、会話の中で引き継ぎさせたい値はthis.attributesに保存されるようになっています。

    一時保存するコードサンプル

    LaunchRequestでattributesに値がない場合は初期化しています。
    SampleIntentでattributesのcallAmountの数をインクリメントさせてます。

    'use strict'
    const Alexa = require('alexa-sdk')
    const handlers = {
      'LaunchRequest': function () {
        if (Object.keys(this.attributes).length === 0) {
          this.attributes['callAmount'] = 0
        }
        this.emit(':tell', 'サンプルスキルへようこそ。')
      },
      'SampleIntent': function () {
        this.attributes['callAmount'] += 1 
        this.emit(':tell', 'サンプルインテントがコールされました。')
      }
    }
    
    module.exports.hello = (event, context, callback) => {
      alexa = Alexa.handler(event, context, callback)
      alexa.registerHandlers(handlers)
      alexa.execute()
    }
    

    セッション情報はattributesに保存する

    取り出す場合は先ほどの逆にすることでとりだせます。

      'COUNTIntent': function () {
        const callAmount = this.attributes['callAmount'] 
        this.emit(':tell', `${callAmount}回呼び出されました。`)
      }
    

    おわりに

    もちろんこのやり方では、セッションが終了するタイミングで値は破棄されます。

    ただし会話の中だけで保持したいデータであれば、わざわざDynamoDBなどを用意する必要もなく実装できますので知っておくと便利です。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark