概要
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に実装されているメソッド一覧と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
コマンドではうまくいかなかった
- iphoneのAlexaアプリやAlexa Developer Consoleのシュミレータや
-
skillBuilder.withApiClient()
の設定が必要 -
apiAccessToken
は一度のみ利用可能- ひとつのIntentのなかで、 リマインダー一覧を取得して、空が返ってきたら登録するなどのように、同じ
apiAccessToken
で2回叩くとダメなようです。
- ひとつのIntentのなかで、 リマインダー一覧を取得して、空が返ってきたら登録するなどのように、同じ
一言
イベントのサブスクリプションという機能もあるようなのでここも気になる