2
3

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.

Lambda不要! SMSを送信するAlexaスキルを作る(ASK SDK v2 for Node.js対応)

Last updated at Posted at 2018-08-07

はじめに

Alexaは、『声』という直感的なインターフェイスを使って様々なサービスを利用することができます。
利用するサービスは自分で『スキル』を構築することにより拡張でき、オリジナルのサービスをAlexaを通して利用することができます。
ここでは、Twilioを使ってSMSを送信するAlexaスキルの作り方を紹介します。

前提

この記事では以下を前提としています。

目次

  1. SMS送信用の電話番号を取る
  2. Alexaスキルを作る
  3. スキルの呼び出し名、インテントを設定する
  4. Twilio FunctionsでSMS送信処理部分をつくる
  5. AlexaスキルとFunctionsをつなぎこむ
  6. テスト

1. SMS送信用の電話番号を取る

Twilioコンソールにこちらからログインします。

左のメニューから『Phone Numbers』を選択し、『番号の管理』から『番号を購入』(+ボタン)を選択します。

Twilioでは、SMSの送信は日本の番号からはできません。アメリカ番号(+1で始まる番号)を購入する必要があります。そのため、『COUNTRY』では『United States』を選択し、『機能』で『SMS』にチェックを入れて検索してください。

検索結果に表示された番号の中から好きなものを選び、『購入』ボタンをクリックして購入してください。

2. Alexaスキルを作る

Alexaデベロッパーコンソールにこちらからサインインします。
『スキルを作成』ボタンをクリックし、スキル作成画面に遷移します。

skill_create.png

スキル名、デフォルトの言語(日本語)、スキルに追加するモデル(カスタム)を選択し、『スキルを作成』ボタンをクリックすると、新しいスキルが作成できます。

skill_create_finish.png

3. スキルの呼び出し名、インテントを設定する

スキルの管理画面で、左のメニューから『呼び出し名』を選択します。

skill_call_name.png

呼び出し名は、『アレクサ、〇〇で■■して』とAlexaに話しかけたときの『〇〇』にあたる部分です。
好きな名前を入力してください(今回は『おくるくん』とします)。入力したら、『モデルを保存』ボタンで入力値を保存します。

次に、左メニューのインテントで『追加』をクリックします。

インテントは、『アレクサ、〇〇で■■して』とユーザーからリクエストを受けたあと、そのリクエストに対応して行われる処理のことを指します(詳細については、こちらをご参照ください)。

『追加』をクリックすると、インテントの名前入力欄が表示されます。インテントの名前はこの後作成するTwilio Function上コードでも使用しますので、アルファベットの大文字、小文字、アンダースコアのみを使い、わかりやすい名前をつけてください(今回は『SendSms』とします)。
名前の入力後、『カスタムインテントを作成』をクリックします。

カスタムインテントの作成後、そのインテントの詳細設定画面に遷移します。ここでは『サンプル発話』を入力します。
サンプル発話は、『アレクサ、〇〇で■■して』の『■■して』の部分にあたります。サンプル発話に登録した内容がAlexaにリクエストされると、サンプル発話が登録されているインテントが実行されます。
ここではサンプル発話を一つ入力します(実際にAlexaスキルを作成する場合は、表記ゆれを考慮し複数のパターンの発話を登録する必要があります)。
サンプル発話を入力したら、エンターキーで登録ができます。登録後、『モデルを保存』ボタンで入力値を保存します。

4. FunctionsでSMS送信処理部分をつくる

Twilioの管理コンソールにログインし、スライドメニューからRuntimeConfigureを選択します。
CredentialsEnable ACCOUNT_SID and AUTH_TOKENのチェックを入れます。

スクリーンショット 2018-08-07 18.26.15.png

Environmental Variablesの下にある赤い+アイコンを2回クリックして、枠を2行作ります。
今作成した2行に、以下の内容を追加します。

KEY VALUE
SMS_FROM_NUMBER 先程購入したUS番号
SMS_TO_NUMBER SMSを送信したい携帯番号(E.164形式)

Dependenciesの中の赤い+アイコンを押して、枠を一つ追加します。
NAME欄に、「ask-sdk」、VERSION欄に「2.0.7」と入力します。

スクリーンショット 2018-08-07 17.14.14.png

画面下部にあるSaveボタンを押して、設定を保存します。

左側のメニューのFunctionsManageを選択します。
赤い+アイコンを押すか、Create a new Functionボタンを押して新しいFunctionを作ります。
New Functionダイアログが開くので、Blankを選択してからCreateボタンを押します。
FUNCTION NAMEに「SendSmsV2」と入力し、PATH欄には、「/send-sms-v2」と入力します。

スクリーンショット 2018-08-07 17.18.09.png

CODE欄に予め書かれているコードをすべて削除し、以下のコードを貼り付けます。


const Alexa = require('ask-sdk');

const HELP_MESSAGE = 'エスエムエスを送信できます。おくるくん、エスエムエスを送ってと言ってみてください';
const MESSAGE_BODY = 'こんにちは! AlexaからのSMSです';
const SENT_MESSAGE = 'エスエムエスを送信しました。';
const STOP_MESSAGE = 'さようなら';

let twilioContext;

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
        const speechText = HELP_MESSAGE;

        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
}

const SendSmsIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'SendSms';
    },
    handle(handlerInput) {
        const client = twilioContext.getTwilioClient();
        return client.messages
        .create({
            body: MESSAGE_BODY,
            from: twilioContext.SMS_FROM_NUMBER,
            to: twilioContext.SMS_TO_NUMBER
       })
      .then(message => {
	    const speechText = SENT_MESSAGE;
        return handlerInput.responseBuilder
            .speak(speechText)
            .getResponse();
      })
    }
};

const HelpIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent';
    },
    handle(handlerInput) {
        const speechText = HELP_MESSAGE;

        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
};

const CancelAndStopIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent'
                || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent');
    },
    handle(handlerInput) {
        const speechText = STOP_MESSAGE;

        return handlerInput.responseBuilder
            .speak(speechText)
            .getResponse();
    }
};

const SessionEndedRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
    },
    handle(handlerInput) {
        return handlerInput.responseBuilder.getResponse();
    }
};

const ErrorHandler = {
    canHandle(handlerInput) {
        return true;
    },
    handle(handlerInput) {
        return handlerInput.responseBuilder.speak('正常に処理できませんでした。')
        .getResponse();
    }
};

let skill;

exports.handler = function (context, event, callback) {
  console.log(`REQUEST++++${JSON.stringify(event)}`);
  twilioContext = context;  // Twilioの環境変数参照用
  if (!skill) {
    skill = Alexa.SkillBuilders.custom()
      .addRequestHandlers(
        LaunchRequestHandler,
        SendSmsIntentHandler,
        HelpIntentHandler,
        CancelAndStopIntentHandler,
        SessionEndedRequestHandler,
      )
      .addErrorHandlers(ErrorHandler)
      .create();
  }

  return skill.invoke(event,context)
  .then((res) => {
    callback(null, res);
  })
  .catch((error) => {
    callback(error);
  });
};

Saveボタンを押して、デプロイが完了するまでしばらく待ちます。
PATH欄の右側にあるコピーアイコンをクリックし、FunctionsのURLをクリップボードにコピーしておきます。

5. AlexaスキルとFunctionsをつなぎこむ

Alexaデベロッパーコンソールで左メニューの『エンドポイント』を選択します。

『サービスのエンドポイントの種類』で『HTTPS』を選択し、『デフォルトの地域』に手順4で作成したFunctionsのURLを入力します。
証明書については、『開発用のエンドポイントは、証明機関が発行したワイルドカード証明書をもつドメインのサブドメインです』を選択します。
入力が終わったら『エンドポイントを保存』ボタンで入力値を保存します。

6. テスト

Alexaデベロッパーコンソールの上部メニューで『ビルド』を選択し、『モデルをビルド』をクリックします。

ビルド完了までには数分かかり、完了したらそのメッセージが表示されます。
ビルドが完了したら『テスト』を選択します。もしスキルのテストが無効になっていた場合は有効化します。
入力欄に『アレクサ、{呼び出し名}で{サンプル発話}』と入力します。例えば、『呼び出し名』に『おくるくん』、『サンプル発話』に『エスエムエスを送って』と入力していたら、『アレクサ、おくるくんでエスエムエスを送って』と入力します。
すると処理が実行され、SMSが送信されてきます。

これでSMSを送信するAlexaスキルの作成は完了です。

Twilio SDKについて

今回のように、Twilio Functionsを利用することで、Lambdaを利用せずにスキルの開発可能になりました。
TwilioSDKでは、SMS以外にも『電話をかける』『LINEやFacebook Messangerにメッセージを送る』『プッシュ通知』『Faxを送る』など様々な機能を簡単に利用することができます。

Alexaスキル開発にTwilioを利用し、様々なコミュニケーション機能を組み込んでみてください。

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?