今回は、本格的なスキル開発に向けて、AlexaリマインダーAPIを使用したスキルの開発方法を紹介します。リマインダーAPIを効果的に使用すれば、スキルのリテンション率アップにもつながります。
リマインダーAPIの実装には、公式リポジトリのサンプルコードが参考になります。今回は、機能を追加しやすいように該当部分のコードを解説いたします。
今回使用するサンプルコードはこちらです。
https://github.com/alexa/alexa-cookbook/tree/master/feature-demos/skill-demo-reminders
サンプルコードでは、リマインダー作成処理を行う handler は大きく分けて以下の5つの処理から構成されています。
① アクセストークンの取得
② インテントの確認
③ アクセス権限を確認し、権限が許諾されていない場合はホームカードを送信
④ リマインダーの作成
⑤ レスポンスの作成
① 71行目 ~
リマインダーを作成するためのhandler内でアクセストークンを取得
const CreateReminderHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'CreateReminderIntent';
},
async handle(handlerInput) {
const requestEnvelope = handlerInput.requestEnvelope;
const responseBuilder = handlerInput.responseBuilder;
//リクエストに含まれるアクセストークンを取得
const consentToken = requestEnvelope.context.System.apiAccessToken;
② 82行目 ~
リマインダーを作成する場合、作成するたびにユーザーから同意を得る必要があり、そのための処理をConfirmationStatus の値を利用して実装しています。開発者コンソールで CreateReminderIntent の「インテントの確認」を有効にします。
インテントの確認状況ごとに適切に処理を追加します。
// confirmationStatusの値を確認
switch (requestEnvelope.request.intent.confirmationStatus) {
// ユーザーがインテントを確認した場合は処理を続行
case 'CONFIRMED':
console.log('Alexa confirmed intent, so clear to create reminder');
break;
// ユーザーがインテントを拒否した場合はリマインダー作成処理を中止
case 'DENIED':
console.log('Alexa disconfirmed the intent; not creating reminder');
return responseBuilder
.speak(`${messages.NO_REMINDER} ${messages.WHAT_DO_YOU_WANT}`)
.reprompt(messages.WHAT_DO_YOU_WANT)
.getResponse();
// confirmationStatusが"NONE"の場合はユーザーに確認を促す
case 'NONE':
default:
console.log('delegate back to Alexa to get confirmation');
return responseBuilder
.addDelegateDirective()
.getResponse();
}
参考 :
③ 102行目~
ユーザーがスキルにリマインダーのアクセス権限を付与していない場合、スキルからユーザーにアクセス権限の付与方法を詳しく説明し、スキルのアクセス権限ページへのリンクを提供するホームカードを送信する必要があります。
if (!consentToken) {
return responseBuilder
.speak(messages.NOTIFY_MISSING_PERMISSIONS)
.withAskForPermissionsConsentCard(PERMISSIONS)
.getResponse();
}
参考:
スキルでリマインダーをコーディングする際のベストプラクティス
リマインダーの作成
try {
// getReminderManagementServiceClient()をコールするには249行目の.withApiClient(new Alexa.DefaultApiClient())が必要です。
const client = handlerInput.serviceClientFactory
.getReminderManagementServiceClient();
const reminderRequest = {
// トリガー情報を設定します。
trigger: {
type: 'SCHEDULED_RELATIVE',
offsetInSeconds: '30',
},
//リマインダーの読み上げ情報などを設定します
alertInfo: {
spokenInfo: {
content: [{
locale: 'en-US',
text: 'time to get up and dance',
}],
},
},
// Alexaモバイルアプリへのリマインダーのプッシュ通知を設定します
pushNotification: {
status: 'ENABLED',
},
};
//上記の設定情報を元にリマインダーを作成します
const reminderResponse = await client.createReminder(reminderRequest);
console.log(JSON.stringify(reminderResponse));
} catch (error) {
if (error.name !== 'ServiceError') {
console.log(`error: ${error.stack}`);
const response = responseBuilder.speak(messages.ERROR).getResponse();
return response;
}
throw error;
}
参考:
⑤ 139行目~
.speak()にリマインダー作成時の発話を設定し、レスポンスを作成します。
return responseBuilder
.speak(messages.REMINDER_CREATED)
.getResponse();
},
};
まとめ
ここまでで、リマインダー機能の実装方法を紹介しました。 リマインダーAPIは、絶対時刻または相対時刻のtrigger.typeを使用できます。 スキルの用途に合わせて適切なリマインダーを設定するようにしてください。 公開する時には、実際にユーザーテストを繰り返して、インテントの確認・ユーザー権限の許諾を促す処理が行われるか確認することをお勧めします。
Alexa Skills Kit (ASK) (日本語) スペースでは、スキル開発に関する質問や、他のメンバーの質問に対する回答を投稿することができます。お気軽に投稿ください。