15
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

alexaで通知を飛ばしてみる

Last updated at Posted at 2019-03-17

概要

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

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

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

スキルで発行された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. 通知を飛ばす

通知を飛ばすためには、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 #通知します。

その他

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?