Alexa

alexaで通知を飛ばしてみる


概要

プロアクティブイベントAPI を利用して、ユーザーにイベント(通知)を送ってみました。

こちらの内容を実際にやってみます。

https://developer.amazon.com/ja/docs/smapi/proactive-events-api.html#onboard-smapi


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

スキルで発行されたClientID + ClientSecretを利用して

任意のユーザーもしくは全ユーザーに

通知を送ることができます。

通知が送られると、Echo Dotの場合は、「ポン」と音を出しLEDが黄色にひかり、「アレクサ、通知は何?」と話しかけるとその詳細を確認できます。


やってみた


作成するもの


  • alexa skill(通知する側のスキル)

  • イベント通知を受け取るlambda(subscribeする側のlambda)


    • 実際にこのlambdaが利用される場面はよくわからないけれども、用意しないと設定できない模様。




1. alexaスキルの作成

メインとなるalexaスキル、すなわち通知する側のスキルを作成します。

今回もこれで、サクッとサンプルアプリを作ります。

(別になんでもよいです。)


2. subscribeするlambdaの作成

serverless frameworkを利用してlambdaを作ります。

$ serverless create --template aws-nodejs --path subscribe-event-lambda

イベント通知を受け取るために、lambdaの入力トリガーとして、skillIdを指定してalexaと連携させます。

serverless frameworkでは、 eventsの部分を追加すればOKです。


serverless.yml

functions:

hello:
handler: handler.hello
events:
- alexaSkill: amzn1.ask.skill.xxx


3. skill.jsonの設定

alexa skill側の設定に戻ります。

イベント通知用のpermissionを追加します。


skill.json

$ cat skill.json | jq .manifest.events

{
"publications": [
{
"eventName": "AMAZON.OrderStatus.Updated"
},
{
"eventName": "AMAZON.MessageAlert.Activated"
}
],
"subscriptions": [
{
"eventName": "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED"
}
],
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:XXX:function:subscribe-event-lambda-dev-hello"
}
}

publicationsでは、ここを参考に通知するイベントを設定します。

subscriptionsはなくても動きますが、サンプルからコピペしておきます。

この記述があると、スキルを有効化したタイミングで、hello lambdaが起動するようです。

endpoint は必須のようです。使われるタイミングは不明です。

以上で、skill側の設定は完了なので、変更点をdeployします。

$ ask deploy


4. 通知を飛ばす

https://developer.amazon.com/ja/docs/smapi/proactive-events-api.html#prepare-proactive

通知を飛ばすためには、2つのAPIを叩く必要があります。


  1. アクセストークンを取得する

  2. 通知API(ProactiveEvents API)を呼び出す

1.アクセストークンの取得 で利用するclientIdとclientSecretは、

alexa developer consoleの「スキル」 -> 「アクセス権限」 -> 「Alexaスキルメッセージング」 の物を利用します。

2. 通知APIを呼び出すでは、指定のユーザーもしくは全員のいずれかを選択できますが、今回は指定のユーザーに対して通知します。

なお、userIdの特定は、alexa skillにログを仕込んで、そこから確認するという方法を用いました。

console.log(JSON.stringify(handlerInput.requestEnvelope, null , "\t"));


ドキュメントには、curlを使って叩く例が記載されていますが、簡単のためこちらのコードを利用します。

https://github.com/tekutoo/alexa-cookbook/blob/feature/mod-proactive-events/feature-demos/skill-demo-proactive-events/order.js

オリジナルのコードを一部しました。(一部の変数を環境変数に設定しています)

変更点

通知してみます。

(なお、例のごとく実機でないとおそらく動かないかもしれません。iPhoneのalexaアプリだとだめかもしれないです。)

# 環境変数をセットします。

$ export CLIENT_ID=hogehoge
$ export CLIENT_SECRET=fugafuga
$ export USER_ID=amzn1.ask.account.xxx

$ node order.js #通知します。


その他