[Alexa] スキルからTo-doリストやShoppingリストを操作する

alexa-eyecatch

1 はじめに

Amazon Alexa(以下、Alexa)には、ショッピングや予定リストを管理する機能があります。

リストは、非常に柔軟に追加することが可能で、例えば、"Alexa, create a new to-do."とか、"Alexa, I need a bread."などと話しかけるだけで簡単に追加できます。

正確には、分からないのですが、明確にリストの種類を示さなくても、(名詞)だと、Shopping、(動詞)だと、To-doに入るように見えます。

なお、EchoEcho dotデバイスからは、追加することしかできません。一覧を見たり、編集したりするには、Alexa Appが必要です。

利用例としては、自宅で音声により、気が付いた時に、必要な物をショッピングリストに追加しておき、買い物に出かけた際に、Alexaアプリでチェックするようなイメージでしょうか。

Shopping

001

To-do

002

iPhone

003 004

この2つのリストですが、パーミッションを設定することで、スキルから操作が可能になります。今回は、この機能について確認して見たいと思います。

2 パーミッション

Amazon開発者コンソールでスキルを作成する際に、ConfigurationPermitionsLists Read及び、List Writeのどちらか(若しくは、両方)にチェックすると、リストの読み書きに関する権限を要求することができます。

005

このパーミッションが設定されたスキルでは、ユーザーが許可を与えた時点で、リストにアクセスできるようになります。

006

ユーザーが許可を与えると、Alexaからのリクエストで、context.System.user.permissions.consentTokenにアクセストークンが付与されます。

リストへのアクセスには、このトークンが必要です。

var consentToken = this.event.context.System.user.permissions.consentToken
"context": {
    "System": {
      "application": {
        "applicationId": "string"
      },
      "user": {
        "userId": "amzn1.ask.account.<userId_value>",
           "permissions": {
             "consentToken": "Atza|MQEWY...6fnLok"
      },		
        "accessToken": "string"
      },
      "device": {
        "deviceId": "string",	  
        "supportedInterfaces": {
          "AudioPlayer": {}
        }
      },
      "apiEndpoint": "string"
    },

3 RestAPI

Alexaのリストは、下記のエンドポイントでアクセスできます。

Endpoint: https://api.amazonalexa.com/

API Method URI Endpoint
Get lists metadata GET v2/householdlists/
Get a list GET v2/householdlists/{listId}/{status}
Get a list item GET v2/householdlists/{listId}/items/{itemId}
Update a list item PUT v2/householdlists/{listId}/items/{itemId}
Create a new list item POST v2/householdlists/{listId}/items
Delete a list item DELETE v2/householdlists/{listId}/items/{itemId}

(1) Get lists metadata

リストの一覧取得です。

Get lists metadataでは、まずは、To-do及び、Shoppingリストを取得するためのURLを取得します。

GET: v2/householdlists/

Authorization: Bearer auth_token_for_customer
Content-Type: application/json

上記のAPIで、shopping(active)、shopping(completed)、To-do(active)、To-do(completed)の4つのURLが取得できます。

{
    "lists": [
        {
            "listId": "IT1BQSU5(略)HX0lURU0=", 
            "name": "Alexa shopping list", 
            "state": "active", 
            "statusMap": [
                {
                    "href": "/v2/householdlists/IT1BQSU5(略)HX0lURU0=/active", 
                    "status": "active"
                }, 
                {
                    "href": "/v2/householdlists/IT1BQSU5(略)HX0lURU0=/completed", 
                    "status": "completed"
                }
            ], 
            "version": 1
        }, 
        {
            "listId": "FQ1NJTllOS(略)lVVRBU0s=", 
            "name": "Alexa to-do list", 
            "state": "active", 
            "statusMap": [
                {
                    "href": "/v2/householdlists/FQ1NJTllOS(略)lVBLVRBU0s=/active", 
                    "status": "active"
                }, 
                {
                    "href": "/v2/householdlists/FQ1NJTllOS(略)lVBLVRBU0s=/completed", 
                    "status": "completed"
                }
            ], 
            "version": 1
        }
    ]
}

そして、上記で得たURLを使用して、Shopping(active)及びTo-do(active)を取得した例です。Alexa アプリで見たものと同じであることが分かります。

Shopping List

{
    "items": [
        {
            "createdTime": "Mon Aug 14 19:32:23 UTC 2017", 
            "href": "/v2/householdlists/YW16bjEuYWNjb3V(略)2eece1", 
            "id": "55c486bc-a5f4-3705-a5d7-5728c12eece1", 
            "status": "active", 
            "updatedTime": "Mon Aug 14 19:32:23 UTC 2017", 
            "value": "shampoo", 
            "version": 1
        }, 
        {
            "createdTime": "Mon Aug 14 19:32:07 UTC 2017", 
            "href": "/v2/householdlists/YW16bjEuYWNjb3V(略)e848667", 
            "id": "58496aa8-4e96-5bca-92ab-ecb88e848667", 
            "status": "active", 
            "updatedTime": "Mon Aug 14 19:32:07 UTC 2017", 
            "value": "butter", 
            "version": 1
        }, 
        {
            "createdTime": "Mon Aug 14 19:31:52 UTC 2017", 
            "href": "/v2/householdlists/YW16bjEuYWNjb3V(略)14ec9e4", 
            "id": "a6167bf7-c8b7-8f4f-437f-5be5514ec9e4", 
            "status": "active", 
            "updatedTime": "Mon Aug 14 19:31:52 UTC 2017", 
            "value": "Plain bread", 
            "version": 1
        }
    ], 
    "links": null, 
    "listId": "IT1BQSU5(略)HX0lURU0=", 
    "name": "Alexa shopping list", 
    "state": "active", 
    "version": 1
}

To-do list

{
    "items": [
        {
            "createdTime": "Mon Aug 14 19:32:59 UTC 2017", 
            "href": "/v2/householdlists/YW16bjEu(略)f47c0687264", 
            "id": "960f10d8-db70-05e2-6925-7f47c0687264", 
            "status": "active", 
            "updatedTime": "Mon Aug 14 19:33:26 UTC 2017", 
            "value": "I go to the movies with Mary", 
            "version": 3
        }, 
        {
            "createdTime": "Mon Aug 14 19:30:44 UTC 2017", 
            "href": "/v2/householdlists/YW16bjEu(略)36c06ad", 
            "id": "562e4d86-f59f-333e-833a-290ce36c06ad", 
            "status": "active", 
            "updatedTime": "Mon Aug 14 19:30:44 UTC 2017", 
            "value": "go to the gym", 
            "version": 1
        }
    ], 
    "links": null, 
    "listId": "FQ1NJTllOS(略)lVVRBU0s=", 
    "name": "Alexa to-do list", 
    "state": "active", 
    "version": 1
}

(2) Get a list / Get a list item

個々のリストやアイテムを取得します。 listIdや、ItemIdは、GetListsMetadataで取得したものを使用します。

GET: v2/householdlists/{listId}/{status}
where {listId} is customer's list id and {status} is "active" or "completed"

Authorization: Bearer auth_token_for_customer
Content-Type: application/json
GET: v2/householdlists/{listId}/items/{itemId}
where {listId} is customer's list id and {itemId} is the item id

Authorization: Bearer auth_token_for_customer
Content-Type: application/json

(3) Update a list item

アイテムを更新します。

PUT: v2/householdlists/{listId}/items/{itemId}
where {listId} is customer's list id and {itemId} is the item id

Authorization: Bearer auth_token_for_customer
Content-Type: application/json

{
    "id": // item id (String)
    "version": // item version when it was read (Positive integer)
    "value": // updated item value (String, limit is 256 characters)
    "status": // item status (Enum: "active" or "completed")
}

(4) Create a new list item

新しくアイテムを追加します。

POST: v2/householdlists/{listId}/items

Authorization: Bearer auth_token_for_customer
Content-Type: application/json

{
    "value": // new item value (String, limit is 256 characters)
    "status": // item status (Enum: "active" or "completed")
}

(5) Delete a list item

アイテムを削除します。

DELETE: v2/householdlists/{listId}/items/{itemId}

Authorization: Bearer auth_token_for_customer
Content-Type: application/json

4 パーミッションの要求

ユーザーの許可が得られていない場合、Alexaアプリにカードを表示して、ユーザーに許可を促す必要があります。 Alexa SDK for nodejsを使用している場合、下記のレスポンスでRead + Writeを催促するカードが表示されます。

const READ_LIST_PERMISSION = "read::alexa:household:list";
const WRITE_LIST_PERMISSION = "write::alexa:household:list";
const PERMISSIONS = [READ_LIST_PERMISSION, WRITE_LIST_PERMISSION];
const message = 'Please enable Lists permissions in the Amazon Alexa app.';

this.emit(":tellWithPermissionCard", message, PERMISSIONS);
"card": {
   "type": "AskForPermissionsConsent",
   "permissions": [
      "read::alexa:household:list",
      "write::alexa:household:list"
    ]
  }
}

Alexaアプリでは、下記のように表示されています。

007

5 最後に

Alexaのリストは、使い慣れると非常に便利かも知れません。そして、スキルを作成することで、リストを更に強化できるかも知れません。

例えば、定型業務をTo-doリストに追加するスキルとか・・・
googleカレンダーからイベントをリストに追加するとか・・・

6 参考リンク


Access the Alexa Shopping and To-Do Lists
Integrate Your Skills with Alexa Shopping and To-Do Lists
GitHub alexa/alexa-cookbook