Help us understand the problem. What is going on with this article?

alexaで通知を飛ばしてみる

More than 1 year has passed since last update.

概要

プロアクティブイベント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 #通知します。

その他

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした