Amazon AlexaのSkillにおける、applicationId,userId,deviceIdの一意性の調査

2017.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

この記事は、2018/01/09 日本語対応も含め、最新版にリメイクされました。是非、こちらをご参照下さい。

1 はじめに

Amazon Alexa(以下、Alexa)のSkill開発では、特定の条件で処理を分けたいことがあります。

例えば、スキル起動時のWelcomeメッセージを、初めて利用される場合は「はじめまして」そして、2回目以降は「こんにちは」、しばらく利用がなかった場合は、「おひさしぶりです!」みたいに変化させるような場合です。

このような場合に、利用できるのが、userIdなのですが、既に、これを利用する方法は、Developers.IOでも紹介されています。

device IDを使ってAmazon Alexa端末を識別してみる

今回は、userIdに加えて、applicationId及び、deviceIdが、どのような条件で識別子として利用可能であるかを確認してみましたので、紹介させて下さい。

また、特定の条件で、この値が変化してしまうことも、まとめておきたいと思います。

IDの取得

下記は、AlexaからSkillに対して送られるJSONです。

今回の調査の対象したのは、Context.Systemにある、applicationIduserId及び、deviceIdの3つです。

{
    "version": "1.0",
    "session": {
        "new": true,
        "sessionId": "amzn1.echo-api.session.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
        "application": {
            "applicationId": "amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
        },
        "user": {
            "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXXXXXXXXXXX"
        }
    },
    "context": {
        "AudioPlayer": {
            "playerActivity": "IDLE"
        },
        "System": {
            "application": {
                "applicationId": "amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
            },
            "user": {
                "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXXXXXXXXXXX"
            },
            "device": {
                "deviceId": "amzn1.ask.device.XXXXXXXXXXXXXXXXXXXXXXXXX",
                "supportedInterfaces": {
                    "AudioPlayer": {}
                }
            },
            "apiEndpoint": "https://api.amazonalexa.com"
        }
    },
    "request": {
        "type": "LaunchRequest",
        "requestId": "amzn1.echo-api.request.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
        "timestamp": "2017-07-04T03:41:04Z",
        "locale": "en-US"
    }
}

3 調査結果

実施した調査の方法は、下記のとおりです。

  • 端末(AVS)、アカウント(Amazonアカウント)、スキルをそれぞれ2つずつ用意する
  • 上記をマトリックス図に展開して、IDの値が同一になる条件を確認する

そして、結果は以下のとおりです。

001
※表中のIDの値は簡略化されています。
※端末(AVS)は、自作したものを利用しています。

applicationId

スキル毎にユニーク

userId

スキル+アカウント毎にユニーク

deviceId

スキル+アカウント+デバイス毎にユニーク

なお、この値は、デバイスを再起動したり、アカウント登録をやり直しても、変化しませんでした。

4 特記事項

上記の調査結果までは、特に気に留めるところはありませんが、試験中に下記の動作を確認しましたので、特記事項としてまとめさせて頂きました。

(1) スキルの再登録

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

元々、この2つのIdは、スキルの同一性が影響していますが、同じスキルでも、一旦、Disableされると、別のスキルとして扱われるように見えます。

ユーザーから見れば、インストールしていたアプリを削除して、初期化したような動作になるということでしょうか。 また、一旦Disableされると、スキル側で、同一ユーザを識別する方法は無いとも言えると思います。

002 003

(2) Echosim.ioでの利用

Amazon Ecoのシュミレータとして提供されている Echosim.ioですが、こちらは、Amazonのアカウントでログインして使用するようになっています。

004

しかし、Echosim.ioでログインすると、同アカウントで利用しているスキルが、一旦 Disable/Enableされたように、識別値が変わってしまう事を確認しました。

userIdやdeviceIdを識別に利用しているスキルを開発中に、同シュミレーターを使用する場合は、注意が必要だと思います。

5 最後に

今回は、applicationIduserId及び、deviceIdの一意性に関する調査を纏めてみました。

もしかすると、ユーザに豊かな体験を提供するためには、これらのIdをうまく活用することは、非常に重要かも知れません。

6 参考リンク


Alexaクライアント「Friendly Voice Assistant」をリリースしました
Amazon Alexa用のクライアントをiOSで作ってみた
Alexa Skills Kit for Node.js はじめの一歩
Alexa Skills Kit for Node.js 次の一歩(DynamoDB)