Alexaスキル開発トレーニングシリーズ:リマインダーAPIの利用方法

Tsuneki Umeda Jun 20, 2019
Share:
API Tips & Tools
Blog_Header_Post_Img

今回は、本格的なスキル開発に向けて、AlexaリマインダーAPIを使用したスキルの開発方法を紹介します。リマインダーAPIを効果的に使用すれば、スキルのリテンション率アップにもつながります。

リマインダーAPIの実装には、公式リポジトリのサンプルコードが参考になります。今回は、機能を追加しやすいように該当部分のコードを解説いたします。

今回使用するサンプルコードはこちらです。

https://github.com/alexa/alexa-cookbook/tree/master/feature-demos/skill-demo-reminders

 

サンプルコードでは、リマインダー作成処理を行う handler は大きく分けて以下の5つの処理から構成されています。

① アクセストークンの取得

② インテントの確認

③ アクセス権限を確認し、権限が許諾されていない場合はホームカードを送信

④ リマインダーの作成

⑤ レスポンスの作成

① 71行目 ~

リマインダーを作成するためのhandler内でアクセストークンを取得

Copied to clipboard
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 の「インテントの確認」を有効にします。

how to use alexa skills

インテントの確認状況ごとに適切に処理を追加します。

Copied to clipboard
// 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行目~

ユーザーがスキルにリマインダーのアクセス権限を付与していない場合、スキルからユーザーにアクセス権限の付与方法を詳しく説明し、スキルのアクセス権限ページへのリンクを提供するホームカードを送信する必要があります。

Copied to clipboard
    if (!consentToken) {
      return responseBuilder
        .speak(messages.NOTIFY_MISSING_PERMISSIONS)
        .withAskForPermissionsConsentCard(PERMISSIONS)
        .getResponse();
    }

108行目~

リマインダーの作成

Copied to clipboard
    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()にリマインダー作成時の発話を設定し、レスポンスを作成します。

Copied to clipboard
    return responseBuilder
      .speak(messages.REMINDER_CREATED)
      .getResponse();
  },
};

まとめ

ここまでで、リマインダー機能の実装方法を紹介しました。 リマインダーAPIは、絶対時刻または相対時刻のtrigger.typeを使用できます。 スキルの用途に合わせて適切なリマインダーを設定するようにしてください。 公開する時には、実際にユーザーテストを繰り返して、インテントの確認・ユーザー権限の許諾を促す処理が行われるか確認することをお勧めします。

■ トレーニングコース目次 ■

Alexa Skills Kit (ASK) (日本語) スペースでは、スキル開発に関する質問や、他のメンバーの質問に対する回答を投稿することができます。お気軽に投稿ください。