AlexaのプロアクティブイベントAPIを使ってみる

Alexaを買ったのはちょうど一年前くらい。
Alexaにいろいろ通知ができないかといろいろ模索してた時期があって、
そのときは通知用のAPIがβ版になっていてAmazonに申請しないと使えなかったのですが、最近調べたらプロアクティブイベントAPIなるものが出てるらしく遊んでみた。

プロアクティブイベントAPI - amazon alexa

プロアクティブイベントAPIとは?

一言で言うとサーバ側からAlexaにPUSH通知を行うことができるAPIです。
Alexaは基本的にユーザがEchoに呼びかけてサーバから結果を取得するいわば「フェッチ型」です。
このプロアクティブイベントAPIを利用すると、ユーザがEchoに呼びかけなくてもサーバ側から通知を送ってくれる「プッシュ型」の処理が作れるわけです。
とはいっても、このAPIだけでは好きな言葉をベラベラ喋らせれることはできなくて、ある定型文に沿って喋らせることができるだけです。
それと、「Alexa, 通知は何?」って聞かないと結果は返してくれません。
※ 聞かなくても勝手に返してくれる方法があれば誰か教えてください

使ってみる

https://github.com/328/alexa-proactive-api-test

1. ツールのインストール

2. AlexaDeveloperコンソールからスキルを作成

LambdaのトリガーにスキルIDが必要になるのでこちらを控えておく。
スキルIDはAlexaスキルのアプリ名の下に「スキルIDの表示」というボタンがあるのでそこを押下すると表示される。

3. ServerlessFrameworkで空のLambdaを作成

https://github.com/328/alexa-proactive-api-test/blob/master/lambda/subscribe-event-lambda/serverless.yml#L16

↑の __SKILLID__ 部分を手順2で控えたスキルIDに差し替えて

# sls deploy

でデプロイを実行する。LambdaのARNを控える。

4. askコマンドでプロジェクトをデプロイを実行

ask deploy

でデプロイを実行します。

5. Alexaコンソールから通知の許可を実行

https://alexa.amazon.co.jp にアクセスします。 「有効なスキル→作成したアプリをクリック→設定→アクセス権を管理→Alexaの通知をON→アクセス権を保存」で通知を許可します。
これやってなくてハマってしまった…^^;

6. クライアントIDとクライアントシークレットを控える

alexa developer consoleから「アプリ→アクセス権限→Alexaスキルメッセージング」からクライアントIDとクライアントシークレットの2つを控える

7. userIdの取得

Alexaでスキルを動作させて、LambdaのコンソールからuserIdを取得

8. プロアクティブイベントAPIを実行

ファイル内のclientID, clientSecret, userId1を埋めて

$ node test-proactive-api.js

で実行します。

その他調べたこととか

AMAZON.OrderStatus.Updated がうまく動作しない

プロアクティブイベントAPIドキュメントでは、Eventに AMAZON.OrderStatus.Updated を使った方法が書いてあるんだけど、どうも動きませんでした。
HTTPのステータスコードが202で返ってくるんだけど、Alexaに通知が行かなかった。どこかでOrderStatusは日本語が非対応というのを見かけた気がするけどソースが見当たらない…
けども、 AMAZON.MessageAlert.Active にしたらちゃんと動作した。

userIdはユニーク?

詳細は, https://dev.classmethod.jp/cloud/alexa-userid-applicationid-deviceid/ に書いてあって、
userIdはスキル+アカウント毎にユニークらしい。
なので、userIdを知るには一旦Alexaからスキルを呼び出して、ログから吸い出す方法しか今の所なさそう?

もっと自由に発言させたい…

今の所はスキーマに沿った発言しかできそうにない。スキーマは需要があるものから追加されるらしい。
公式ドキュメントには 対応するスキーマがない事例の場合は、Alexa Skills - Developer Voice And Voteにリクエストを入力してください。スキーマは随時追加されます。 と記載があった

雑感

AlexaのプロアクティブイベントAPIを使うことで、サーバ側からEchoに対してプッシュ通知を実行することができました。
本当は、もっと自由に発言させることができるAPIだと思ってたのだけれど、今の所はスキーマに沿った発言しかできない。
今後、スキーマが追加されれば通知のバリエーションが増えるはずなので、Echoのスキルももっと良いものが出てくる気がする。

おしまい。

参考