概要
参考ページを参照しつつ、通知対応スキルを作ってみたが、情報が古かったのでハマったところを補足しつつ手順をメモ。(2024/5/2に作成)
ちなみにAlexaの通知する方法は2種類あって、リマインダAPIとプロアクティブイベントAPIがあるが、今回使用するのは後者。違いについてはこちら。
事前準備
Alexa Developer Console用のアカウントを作成
手持ちのAlexa搭載デバイスで使用するアカウントを事前にAlexaアプリ(スマホ)から作成し、デバイスを登録しておく。Alexa Developer Consoleでもこのアカウントを使用する。なお、AWSのアカウントは今回使用していない。
ask-cliの実行用コンテナ作成
スキルのmanifestをアップデートするためにaskコマンドを実行するコンテナを作成する。ちなみに今回使用したask-cliのバージョンは2.30.7
でした。
- build/Dockerfile
FROM node:20.12-buster
RUN npm install -g ask-cli
ENTRYPOINT [ "tail", "-f", "/dev/null" ]
- docker-compose.yml
version: '3'
services:
ask:
build: ./build
volumes:
- ./app:/app
※コンテナ内では/appの下で作業する想定。
スキルの作成
Alexa Developer Consoleでスキルを作成する
- カスタム→Alexa Hosted(Node.js)を指定して新規作成する
- 画面左下のエンドポイントからスキルIDをメモしておく
※詳細は概要の参考ページ参照
manifestの更新
ask-cli用の認証情報を登録する
askコマンドを使えるようにするため、ask-cliコンテナ内で以下のコマンドを実行してAlexa Developer Consoleのアカウントを登録する。AWSアカウントにリンクするかきかれるが、今回は通知するだけなのでNと答える。
ask configure --no-browser
manifestを取得する
ask-cliコンテナ内で、以下のコマンドでmanifestを取得する。skill-idは先ほどメモしたものを指定。ちなみにsmapiはスキル管理APIのこと。
ask smapi get-skill-manifest -s skill-id > mymanifest.json
manifestを編集する
以下を参考にevents及びpermissionsの要素を追加する。
manifestをアップデートする
ask-cliコンテナ内で、以下のコマンドを実行する。
ask smapi update-skill-manifest -s skill-id --manifest "$(cat mymanifest.json)"
成功したかどうかを確かめる(manifestのところでstatusがSUCCEEDEDならOK)。
ask smapi get-skill-status -s skill-id
作成したスキルによる通知をAlexaアプリで許可する
概要の参考ページとほぼ同じ手順でOKだった。
- スマホでAlexaアプリを開く
- その他→スキル・ゲーム→マイスキル(一番下)→「有効」をタップしたらリストが出るので「開発」に切り替え
- 作成したスキルが表示されるので選択
- 「有効にして使用する」をタップ
- アクセス権が表示されるが、リマインダー、Alexaの通知のところにチェックが入っていることを確認して、アクセス権を保存をタップ
※なぜか5でエラーが出たが、後で確認したらどちらも「許可されました」になっていたのでおそらく問題ない
実際に通知してみる
アクセストークンを取得する
下記のコマンドを実行する(client_id_XXX,client_secret_XXXはalexa developer consoleのアクセス権限のAlexaスキルメッセージングのところに表示されるもの。詳細は概要の参考ページ。)
curl -i -X POST \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=client_id_XXX&client_secret=client_secret_XXX&scope=alexa::proactive_events' \
https://api.amazon.com/auth/o2/token
APIをたたく
こちらを参考に、取得したアクセストークンを指定して通知を投げる。アクセストークンは1時間で期限が切れる模様(レスポンスのexpires_inが3600だったので)。
Comments