ついに登場!AlexaのリマインダーAPIをカスタムスキルへ組み込む
スキルを作っていると、使いたくて仕方のなかったあの機能。「リマインダーへのアクセス」がついにカスタムスキルからできるようになりました。さっそく触ってみましょう。 Remind Customers of Important […]
目次
スキルを作っていると、使いたくて仕方のなかったあの機能。「リマインダーへのアクセス」がついにカスタムスキルからできるようになりました。さっそく触ってみましょう。
Remind Customers of Important Tasks or Events with the Reminders API
権限の設定
リマインダーAPIへのアクセスは、ユーザーに許可を得てからしか実行できません。そのためスキル側ではまず[アクセス権限]画面からリマインダーをオンにする必要があります。
ASK CLIのmanifestファイルでは、以下のような書き方となります。
{
"manifest": {
...
"manifestVersion": "1.0",
"permissions": [
{
"name": "alexa::alerts:reminders:skill:readwrite"
}
],
alexa::alerts:reminders:skill:readwrite
がリマインダーAPIですね。
アプリの設定
そしてテスト用のアプリ側でリマインダーを許可する必要があります。
これで事前準備が整いました。
APIアクセストークンの取得
※この記事はベータ版での実装メモです。この先の実装はask-sdkが対応するまでの実装方法ですのでご注意ください。
スキルのテスト画面やask simulate
などで一度スキルを実行させましょう。リクエストの値にある.context.System.apiAccessToken
の値を利用します。
curlでリクエストを組み立てる
まずはcurlでテストしてみましょう。基本形は以下の通りです。
curl https://api.amazonalexa.com/{path} \
-H "Authorization:Bearer <.context.System.apiAccessTokenの値>" \
-H 'Accept: application/json'
reminderを登録する
先ほどのAPIにPOSTを実行することでリマインダーを登録できます。例えば以下のような形です。SCHEDULED_RELATIVE
を設定し、offsetInSeconds
に秒数を入れることでrequestTime
から指定秒数経過後にリマインダーを出すことができます。
{
"requestTime" : "2018-11-01T19:04:00.672"
"trigger": {
"type" : "SCHEDULED_RELATIVE",
"offsetInSeconds" : "7200",
},
"alertInfo": {
"spokenInfo": {
"content": [{
"locale": "ja-JP",
"text": "犬の散歩"
}]
}
},
"pushNotification" : {
"status" : "ENABLED"
}
}
リマインダーの一覧を取得
同じパスでGETすることでリマインダーの一覧を取得できます。レスポンスは以下のような形です。
{
totalCount: 4,
alerts:[{
"alertToken": "d877f6b7-fe34-40fe-9029-a67a3f75140f",
"createdTime": "2018-11-01T15:44:59.336Z",
"updatedTime": "2018-11-01T15:50:24.561Z",
"trigger": {
"type": "SCHEDULED_ABSOLUTE",
"scheduledTime": "2018-11-30T07:30:00.000",
"timeZoneId": "Asia/Tokyo",
"offsetInSeconds": 0,
"recurrence": null
},
"status": "COMPLETED",
"alertInfo": {
"spokenInfo": {
"content": [
{
"locale": "",
"text": "Test Reminder",
"ssml": ""
}
]
}
},
"pushNotification": {
"status": "ENABLED"
},
"version": "3"
}
...
ASK UtilsでReminder APIを(比較的)簡単によび出す
現時点ではまだask-sdkがReminder APIをサポートしていない様子です。ということで、このAPIを使うためには自力でリクエストを組み立てる必要があります。
個人的に使うことがあったので、ask-utilsの方にラッパーを用意しました。
npm i -S ask-utils@latest
で最新版へアップしてからお試しください。
コードサンプル
いずれも async / await を前提としています。handlerInputを放り込んでやれば、APIアクセストークンやエンドポイントの指定・リクエストの作成をよしなにしてくれます。
const { RemidnerClient } = require('ask-utils')
// PUT new reminder
const client = new RemidnerClient(handlerInput)
const payload = {...}
client.setPayload(payload)
await client.fetch('POST')
// Lists reminder
const client = new RemidnerClient(handlerInput)
const lists = await client.fetch()
// Delete a reminder
const client = new RemidnerClient(handlerInput)
await client.fetch('DELETE', `/v1/alerts/reminders/${id}`)
リマインダー登録時のbody (payload)については決め打ちのクラスしか作っていないので、各自頑張って作ってください。