Alexaのスキルにてリストアクセスをしようと思ったが上手くいかなかった話

先日のAlexa Skills Awardsに行った帰りにふと思いついたスキルを作成してみようかと思って
スキルからTODOリストにアクセスしようと思ったがうまくできなかった話を
備忘録として書き残しておく。

目的:やりたかったこと

ユーザが任意のもの/フレーズを登録し占いできるようにする

昔作ったスキルとして、家にあるぬいぐるみの名前を占いとしてランダムに伝えてくれるものがある。
これはあくまでスキルの内部処理(Lambda側)でレスポンスできるものを登録していたので
気軽に変更できないし、そもそも公開スキルとしては使い物にならなかった。

で、閃いたのがAlexaのリスト機能を使えばいいのでは?ということ。
おそらく大半のユーザがTODOリストの機能なんか使っていないだろうと思うので、それを使うことにした。
※カスタムリストを新規で作成させればいいのかもしれないが、できるだけユーザのハードルが低くなることを目標にしてます。

名前としては、「なんでも占い」を予定

実装

必要な機能としては、TODOリストにアクセスしてリスト一覧を取得するぐらい。
リストのアイテム一覧を取得してしまえば、それをランダムで返却してあげるぐらいなのでどうってことないスキルだと思ってた。

この辺を参考にした

Alexaの買い物リストとやることリストにアクセスする | Alexa Skills Kit
Alexaの買い物リストとやることリストにアクセスする 権限の設定 Alexaリストへのアクセス ...
[Alexa] スキルからTo-doリストやShoppingリストを操作する | DevelopersIO
1 はじめに Amazon Alexa(以下、Alexa)には、ショッピングや予定リストを管理する機能があります。 リストは、非常に柔軟に追加することが可能で、例えば、
WP-Kyoto

リストに対する権限を設定しておく。

なんだかんだでこんな感じの実装にしてみた。

//=============================================================================
// APIを呼び出す関数
//=============================================================================
function get_list_data(deviceId, consentToken, apiEndpoint) {

    const hostname = "api.amazonalexa.com";

    // エンドポイント。
    const path = `/v2/householdlists`;

    const requestOptions = {
        method: 'GET',
        protocol: 'https:',
        host: hostname,
        path: path,
        headers:{
            "Authorization" : "Bearer " + accessToken,
            'Content-type' :  'application/json',
        },
    };
    // console.log(requestOptions);

    // APIに非同期でHTTPS接続をする。完了時にresolve, 失敗時にrejectが呼び出される
    return new Promise((resolve, reject) => {
        https.get(requestOptions, (response) => {
            console.log("StatusCode: " + response.statusCode);
            response.on('data', (data) => {
                console.log(data);
                let responseObject = JSON.parse(data);
                const result = {
                    statusCode: response.statusCode,
                    responseObject: responseObject
                };
                resolve(result);
            });
        }).on('error', (e) => {
            reject();
        });
    });
}


const handlers = {
    'LaunchRequest': function () {
        console.log(`start LaunchRequest`);
        this.emit('GetNewFactIntent');
    },
    'GetNewFactIntent': function () {
        console.log(`start GetNewFactIntent`);

        var accessToken = this.event.context.System.apiAccessToken;
        const apiEndpoint = this.event.context.System.apiEndpoint;        
        get_list_data("", accessToken, apiEndpoint).then((result) => {
            switch (result.statusCode) {
                case 200:
                    // リザルトコードが200の時だけ戻り値の解析を行う
                    console.log("200 !!");
                    console.log(result.responseObject);

                    this.response.speak("通信できました");
                    break;
                case 204:
                    this.response.speak('セットされていません');
                    break;
                case 403:
                    this.response.speak('許可されていません');
                    break;
                default:
                    this.response.speak('失敗しました');
            }
            this.emit(':responseReady');
        }).catch(() => {
            this.response.speak('接続に失敗しました');
            this.emit(':responseReady');
        });
        console.log("skip");

    }
}

今一つ上手くいかない

参考

ASK SDK for Node.js — ASK SDK for Node.js ドキュメント
alexa/alexa-apis-for-nodejs
The Alexa APIs for NodeJS consists of JS and Typescript definitions that represent the request and response JSON of Alexa services. These models act as core dep...
Alexaのスキルを実機で試そう
こんにちは。 前回までで、ユーザーによる任意の入力を含む、様々なリクエストを受け付けるスキルを開発できるようになりました。今回はいよいよ、開発したスキルをAmazon Echo、Echo Dotに代表されるAlexa搭載デバイスで動作させたいと思います。 もちろんAlexa Skills Kit開発コンソールから利用で...

いったん挫折。
処理そのものはあっていると思うのだが、レスポンスとして404が返ってくるの原因がさっぱりわからない。
403ではないあたり、認証うんぬんではなくURLが間違っているのかなと思わなくもないのだが、
this.event.context.System.apiEndpoint
を使っても変わらなかった。
※というか、非同期通信周りがちゃんとわかっていないからな気もする。
ちゃんと通信できているんであればアレクサが「失敗しました」っていうはずなんだよな。。。

どなたかわかるかたがいたら教えていただけるとありがたい。

とりあえず来月にハンズオンセミナーにでも行ってみようかな。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

Bitnami