article

Tsuneki@Amazon avatar image
Tsuneki@Amazon posted

サンプルコード紹介:リマインダー機能の実装方法



AlexaリマインダーAPIを使用して、ユーザー向けのリマインダーを作成および管理できます。


リマインダーAPIの実装には、公式リポジトリのサンプルコードが参考になります。

今回は、より実装しやすいように該当部分のコードを解説いたします。


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

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


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

① 基本的なHandlerの処理

② インテントの確認

③ アクセス権限を確認し、ない場合はホームカードを送信する処理

④ リマインダーの作成

⑤ レスポンスの作成


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();
    }


108行目~

リマインダーの作成

参考:

トリガー時刻の計算

リマインダーオブジェクト


    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();
  },
};


ご指摘、ご要望がございましたら、お気軽にコメント願います。



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

alexa skills kitalexaskillawards2019
10 |5000 characters needed characters left characters exceeded

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Article

Contributors

tsuneki contributed to this article