カスタムスキルをウェブサービスとしてホスティングする



カスタムスキルをウェブサービスとしてホスティングする

クラウド内のAlexaサービスからリクエストを受け付けて応答を返すウェブサービスを実装することにより、Alexa用のカスタムスキルを開発できます。

Alexaから送信されたリクエストを処理するには、ウェブサービスで特定の要件を満たす必要があり、またAlexa Skills Kitインターフェース規格に準拠する必要があります。詳細については、カスタムスキルをウェブサービスとしてホスティングするを参照してください。

ASK SDK Express Adapter

Alexa Skills Kit SDK(ASK SDK)for Nodeでは、リクエストとタイムスタンプの検証用のボイラープレートコードがask-sdk-express-adapterパッケージで提供されています。このパッケージでは、SkillRequestSignatureVerifierクラスおよびTimestampVerifierクラスをエクスポートすることにより、検証コンポーネントを提供します。また、このパッケージはExpressAdapterクラスを提供します。このクラスは、検証機能とスキル呼び出し機能をまとめて、Expressアプリケーションにリクエストハンドラーを容易に登録できるようにします。

インストール

NPMを使用してask-sdk-express-adapterパッケージをスキルプロジェクトに追加できます(npm install --save ask-sdk-express-adapter)。

Expressフレームワークを使ったウェブアプリケーション

ExpressAdapterクラスは、SkillBuilderオブジェクトからスキルインスタンスを登録し、getRequestHandlersメソッドを提供します。このメソッドは、Expressアプリケーションに登録できるリクエストハンドラーの配列を返します。

ExpressAdapterインスタンスのブール値パラメーターverifySignatureおよびverifyTimeStampを設定し、テスト目的として、リクエストまたはタイムスタンプの検証を有効または無効にできます。また、スキルを呼び出す前に入力リクエストに適用する必要がある、追加のカスタムベリファイア(verifier)も提供されます。

使い方

クリップボードにコピーされました。

const express = require('express');
const { ExpressAdapter } = require('ask-sdk-express-adapter');

const app = express();
const skillBuilder = Alexa.SkillBuilders.custom();
const skill = skillBuilder.create();
const adapter = new ExpressAdapter(skill, true, true);

app.post('/', adapter.getRequestHandlers());
app.listen(3000);

クリップボードにコピーされました。

import express from 'express';
import { ExpressAdapter } from 'ask-sdk-express-adapter';

const app = express();
const skillBuilder = Alexa.SkillBuilders.custom();
const skill = skillBuilder.create();
const adapter = new ExpressAdapter(skill, true, true);

app.post('/', adapter.getRequestHandlers());
app.listen(3000);

Expressフレームワークを使わないウェブアプリケーション

Expressフレームワークを使わない場合は、ウェブアプリケーションでの使用のためにSkillRequestSignatureVerifierおよびTimestampVerifierが提供されています。

使い方

クリップボードにコピーされました。

const { SkillRequestSignatureVerifier, TimestampVerifier } = require('ask-sdk-express-adapter');

const skillBuilder = Alexa.SkillBuilders.custom();
const skill = skillBuilder.create();

// このコードスニペットは、リクエスト本文がテキストとヘッダーとして既に使用されていることを前提としています
try {
    await new SkillRequestSignatureVerifier().verify(textBody, requestHeaders);
    await new TimestampVerifier().verify(textBody);
} catch (err) {
    // サーバーがエラーメッセージを返します
}
const response = skill.invoke(JSON.parse(textBody));
// サーバーがJSON形式で応答を送信します

クリップボードにコピーされました。

import { SkillRequestSignatureVerifier, TimestampVerifier } from 'ask-sdk-express-adapter';

const skillBuilder = Alexa.SkillBuilders.custom();
const skill = skillBuilder.create();

// このコードスニペットは、リクエスト本文がテキストとヘッダーとして既に使用されていることを前提としています
try {
    await new SkillRequestSignatureVerifier().verify(textBody, requestHeaders);
    await new TimestampVerifier().verify(textBody);
} catch (err) {
    // サーバーがエラーメッセージを返します
}
const response = skill.invoke(JSON.parse(textBody));
// サーバーがJSON形式で応答を送信します