alexa-sdkからデバイスの情報を取得する

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の22日目の記事です。 Alexa Skillの「設定」に「アクセス権限」という項目があります。 デバイスア […]

広告ここから
広告ここまで

目次

    この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の22日目の記事です。

    Alexa Skillの「設定」に「アクセス権限」という項目があります。

    デバイスアドレスとリストへのアクセス権限がそれぞれ設定できますが、実際にデータを取得するためにはアプリによる認証が必要となります。

    alexa-sdkの場合、各インテントのfunction内でthis.event.context.System.user.permissions.consentTokenに値が入っているかいないかで判断することができます。

    tokenの有無を判定するサンプル

    const consentToken = this.event.context.System.user.permissions.consentToken || '';;
    if(!consentToken) {
        this.emit(":tellWithPermissionCard", 'Amazon Alexaアプリでデバイスアドレスへのアクセス権限を有効にしてください。', ["read::alexa:device:all:address"]);
        return;
    }
    // access device data
    

    :tellWithPermissionCardを使うことで、Amazon Alexaアプリに認証画面付きのカードを表示させることができます。

    そちらでユーザーにデバイスデータへのアクセスを許可してもらうことで、以降そのデバイスではデバイスデータを利用することができるようになります。

    データの取り出し方サンプル

    const Alexa = require('alexa-sdk')
    const AlexaDeviceAddressClient = Alexa.utils.TextUtils.AlexaDeviceAddressClient
    
    const consentToken = this.event.context.System.user.permissions.consentToken || '';
    if(!consentToken) {
        this.emit(":tellWithPermissionCard", 'Amazon Alexaアプリでデバイスアドレスへのアクセス権限を有効にしてください。', ["read::alexa:device:all:address"]);
        return;
    }
    const deviceId = this.event.context.System.device.deviceId;
    const apiEndpoint = this.event.context.System.apiEndpoint;
    
    const alexaDeviceAddressClient =new Alexa.services.DeviceAddressService();
    alexaDeviceAddressClient.getFullAddress(deviceId, apiEndpoint, consentToken)
                        .then((data) => {
                                 this.response.speak('<address information>');
                                 console.log('Address get: ' + JSON.stringify(data));
                                 this.emit(':responseReady');
                         })
                       .catch((error) => {
                                 this.response.speak('I\'m sorry. Something went wrong.');
                                 this.emit(':responseReady');
                                 console.log(error.message);
                         });
    

    Alexa.services.DeviceAddressServiceクラスの中に取得処理が用意されています。
    getCountryAndPostalCodegetFullAddressの2つがあり、どちらもPromise形式でデータを取得する方法をとっています。

    Device Addressにアクセスするサンプルスキルも公式で用意されている様子(ただしちょっと実装がふるめ)ですので、Amazon Alexaアプリに登録された住所などのデータを利用したい場合はぜひお試しください。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark