3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

リマインダの登録

Last updated at Posted at 2019-03-07

概要

Alexaスキルで、リマインダの登録を行うサンプルスキルです。
(リマインダ情報の取得や削除はなしです)
https://developer.amazon.com/ja/docs/smapi/alexa-reminders-overview.html

内容

ライブラリ

$ npm ls --depth=0
├── ask-sdk@2.4.0
├── ask-sdk-core@2.4.0
├── ask-sdk-model@1.12.0
└── ask-utils@1.3.0

index.js前半


const Alexa = require('ask-sdk-core');
const { getRandomMessage, isLaunchRequest, isMatchedIntent } = require('ask-utils');
const { ReminderRequest } = require('ask-sdk-model');

const SetReminderHandler = {
  canHandle(handlerInput) {
    return isLaunchRequest(handlerInput)
      || isMatchedIntent(handlerInput, 'SetReminderIntent')
  },
  async handle(handlerInput) {
    const { serviceClientFactory, responseBuilder } = handlerInput;

    const speechText = '1分後にリマインダーをセットしました。';
    const client = serviceClientFactory.getReminderManagementServiceClient();

    const request = {
      trigger: {
        type: "SCHEDULED_RELATIVE",
        offsetInSeconds: '60'
      },
      alertInfo: {
        spokenInfo: {
          content: [{
            locale: "ja-JP",
            text: "リマインダーのテストです"
          }]
        }
      },
      pushNotification: {
        status: "DISABLED"
      }
    };

    try {
      const response = await client.createReminder(request);
      return responseBuilder
        .speak(speechText)
        .getResponse();
    } catch (error) {
      console.log(error);
      return responseBuilder
        .speak("すいません、エラーが発生しました")
        .getResponse();
    }
  }
};

handlerInput.serviceClientFactory.getReminderManagementServiceClient() でリマインダー用のクライアントを取得します。

client#method
request

clientに実装されているメソッド一覧とrequestを参考にAPIを叩きます。

メソッド一覧

class ReminderManagementServiceClient extends BaseServiceClient {
  deleteReminder(alertToken: string): Promise<void>;
  getReminder(alertToken: string): Promise<services.reminderManagement.GetReminderResponse>;
  updateReminder(alertToken: string, reminderRequest: services.reminderManagement.ReminderRequest): Promise<services.reminderManagement.ReminderResponse>;
  deleteReminders(): Promise<void>;
  getReminders(): Promise<services.reminderManagement.GetRemindersResponse>;
  createReminder(reminderRequest: services.reminderManagement.ReminderRequest): Promise<services.reminderManagement.ReminderResponse>;
}

index.js後半

const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
  .addRequestHandlers(
    SetReminderHandler,
    HelpHandler,
    ExitHandler,
    FallbackHandler,
    SessionEndedRequestHandler
  )
  .addErrorHandlers(ErrorHandler)
  .withApiClient(new Alexa.DefaultApiClient())
  .lambda();

.withApiClient(new Alexa.DefaultApiClient()) が重要です。
これでhandlerInputでリマインダークライアントを取得できるようになります。
accessTokenもセットされているので便利です。


skill.json

  "manifest": {
    "permissions": [
      {
        "name": "alexa::alerts:reminders:skill:readwrite"
      }
    ],
...

スキルのpermissionも追加する必要があります。

以上が、起動すると1分後にリマインダーがセットされるサンプルアプリになります。

ハマりポイント

  • 実機以外はユーザーに対してのpermissionの許可ができないためだめそう
    • iphoneのAlexaアプリやAlexa Developer Consoleのシュミレータや ask simulate コマンドではうまくいかなかった
  • skillBuilder.withApiClient()の設定が必要
  • apiAccessTokenは一度のみ利用可能
    • ひとつのIntentのなかで、 リマインダー一覧を取得して、空が返ってきたら登録するなどのように、同じapiAccessTokenで2回叩くとダメなようです。

一言

イベントのサブスクリプションという機能もあるようなのでここも気になる :eyes:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?