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
クラスの中に取得処理が用意されています。
getCountryAndPostalCode
とgetFullAddress
の2つがあり、どちらもPromise形式でデータを取得する方法をとっています。
Device Addressにアクセスするサンプルスキルも公式で用意されている様子(ただしちょっと実装がふるめ)ですので、Amazon Alexaアプリに登録された住所などのデータを利用したい場合はぜひお試しください。