Alexaスキルのユーザー情報を、スキル無効化時に削除する

スキルでDB使っていますか?使っている?それはよかった。 では、スキルを停止したユーザーの情報を消してますか? Alexaスキルでは、一度無効化するとIDが変わるためにまったく別のユーザーとして扱われます。 スキルの利用 […]

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

目次

    スキルでDB使っていますか?使っている?それはよかった。

    では、スキルを停止したユーザーの情報を消してますか?

    Alexaスキルでは、一度無効化するとIDが変わるためにまったく別のユーザーとして扱われます。

    スキルの利用は、AlexaアプリからEnable/Disableが可能ですが、利用していたスキルを一旦Disableにして、再びEnableに戻した場合、userId及び、deviceIdが変化します。

    [日本語Alexa] スキルで利用可能な各種IDの一意性調査

    ということで、無効化したユーザーの情報は消しておきましょう。

    スキルイベントを利用する

    会話の外で起きたイベントでスキルを起動することができる機能がAlexaにはあります。この中の、スキル無効化時に発火するイベントを利用します。

    skill.jsonに追加する

    以下のような形でスキルにイベントを設定しましょう。イベント名とLambdaのARNがわかればOKです。

    {
      "manifest": {
        "events": {
          "subscriptions": [
            {
              "eventName": "SKILL_DISABLED"
            }
          ],
          "endpoint": {
            "uri": "arn:aws:lambda:us-east-1:99999999:function:ask-custom-skill-event-default"
          }
        },
    ...

    独自のLambdaを設定しても問題ありませんが、管理が面倒なのでスキルに利用するものと同じのを指定してみます。

    イベントハンドラーを設定する

    あとはスキルイベントが発火した時のリクエストを処理するハンドラーを追加します。

    
    const SkillDisabledHandler = {
        canHandle(handlerInput) {
            return handlerInput.requestEnvelope.request.type === 'AlexaSkillEvent.SkillDisabled'
        },
        async handle(handlerInput) {
            if (!handlerInput.attributesManager.deletePersistentAttributes) return
            await handlerInput.attributesManager.deletePersistentAttributes()
        }
    }

    簡単ですね。通常のリクエストハンドラーと同様.addRequestHandlersに追加してやりましょう。

    ちなみにhandlerInput.attributesManager.deletePersistentAttributesは後で追加されたメソッドなので、SDKのアプデをしていないとメソッドがない可能性もあり要注意です。

    これで何が起きるか

    スキル無効化時にhandlerInput.attributesManager.deletePersistentAttributesが実行されます。これはDynamoDB.DocumentClient.Deleteを実行してくれるラッパーなので、無効化したユーザーのItemを消してくれます。

    使われないユーザー情報を持ち続ける必要もありませんので、DB情報を扱うスキルで、無効化された後その情報を必要としない場合はとりあえず入れておくとよいでしょう。

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