通知に対応したAlexaスキルを作ってみた

概要

参考ページを参照しつつ、通知対応スキルを作ってみたが、情報が古かったのでハマったところを補足しつつ手順をメモ。(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でスキルを作成する

  1. カスタム→Alexa Hosted(Node.js)を指定して新規作成する
  2. 画面左下のエンドポイントからスキル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だった。

  1. スマホでAlexaアプリを開く
  2. その他→スキル・ゲーム→マイスキル(一番下)→「有効」をタップしたらリストが出るので「開発」に切り替え
  3. 作成したスキルが表示されるので選択
  4. 「有効にして使用する」をタップ
  5. アクセス権が表示されるが、リマインダー、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

Copied title and URL