Twillio FunctionsでAPIから電話を掛けてみる

こんにちは。廣田です。

今回は、Twilioが主催する開発者カンファレンスSIGNAL 2017で発表になったTwilio Functionsが面白そうだったので、自分のiPhoneに電話を掛けて遊んでみた記録です。

TwilioとTwilio Functions

Twilioは、インターネット上のAPIを通して電話を掛けたりSMSのやり取りができるプラットフォームサービスです。日本ではKDDIウェブコミュニケーションズさんが代理店になっていて、公式サイトやドキュメント類など日本語の情報が充実しています。
このTwilio、これまではTwilioのAPIを呼び出すアプリケーションの実行環境を自前で用意する必要があったのですが、公式の実行環境としてTwilio Functionsがリリースされたことでサーバーレスに利用できるようになりました。
この記事では、公式のチュートリアルを参考にTwilio Functionsを使ってAPIのエンドポイントを作成し、MacのターミナルからAPIを呼ぶとTwilio経由で自分のiPhoneに電話が掛かってくる仕組みを作ります。

電話番号を発行する

早速Twilio Functionsの話を…といきたいところですが、その前にTwilioの電話番号を発行する必要があります。電話番号の発行は有料(108円/月)ですが、Twilioにはトライアルアカウントという仕組みがあるのである程度までは無料で試すことができます。

Twilioのコンソールにログインしたところからスタートします。もしTwilioを使ったことがなければ、公式サイトの「サインアップ」からアカウントを作成してください。SMSまたは電話の認証が完了するとコンソールにアクセスできるようになります。

まず、左側の「・・・」メニューからSUPER NETWORKS→電話番号を開きます。発行されている電話番号がない場合、下のような画面が表示されているはずなので、「始めましょう」をクリックします。

スクリーンショット_2017-05-31_9_50_14

「最初のTwilio電話番号を取得」します。

スクリーンショット_2017-05-31_9_50_24

発行できる番号の候補が表示されるので「Choose this Number」。

スクリーンショット_2017-05-31_9_50_39

これでTwilioの電話番号を発行できました。国番号81、050から始まるので日本のIP電話であることがわかります。発行した番号は後の手順で使うので、どこかに控えておいてください。

Functionの作成

いよいよFunctionを作成します。今回の例では、「Hello worldという音声を出力する」と「電話を掛ける」の2つのFunctionが必要になります。音声の出力処理と電話を掛ける処理を分けるのがポイントです(たぶん)。

Functionの管理は左側のメニューからDEVELOPER TOOLS→Runtimeと進み、「Functions(Beta)」を開いた画面で行います。

スクリーンショット_2017-05-31_12_48_55

音声を出力する

まずは「Hello world」という音声を出力する処理です。この処理はサンプルとして用意されているものがあるので、これをそのまま使いましょう。

Functionを1つも作成していないので、一覧は空になっていると思います。「Create Function」をクリックします。

スクリーンショット_2017-05-31_9_45_43

すると、作成するFunctionを選ぶ画面が表示されます。空(Blank)のFunction以外に、いくつかサンプルが登録されているようです。今回はHello Voiceを選んで「Create」します。

スクリーンショット_2017-05-31_11_29_51

Functionが作成されると、Functionの設定や実行するコードを入力できるページが表示されます。Hello Voiceを選んだ場合は既にコードが入力されているはずなので、変更する必要があるのはPropertiesのPATHだけです。ここに設定したURLを呼び出すことで、入力したコードを実行させることができます。
ここでは「https://なんとかかんとか.twil.io/hello」にしておきましょう。このURLは次のステップで使うので、これもどこかに控えておきます。画面下の「Save」を押すと、保存されて一覧に戻ります。

スクリーンショット_2017-05-31_11_30_14

電話を掛ける

続いて電話を掛ける処理です。Function一覧の+マークをクリックし、Blank Functionを選んで空のFunctionを作成します。
Functionの詳細画面が表示されたら、Propertiesで名前とURLを設定します。このURLをターミナルから呼び出すので、わかりやすいURLにしておくと良いでしょう。ここでは「https://なんとかかんとか.twil.io/make_call」としました。

Configurationでは、以下のコードを入力します。urlの部分は上で作成した音声を出力する処理のURLで置き換えてください。入力できたらこちらもSaveしておきます。

exports.handler = function(context, event, callback) {
  // get an initialized Twilio REST API client
  // MUST have ACCOUNT_SID and AUTH_TOKEN turned on under Configuration
  const client = context.getTwilioClient()
  client.calls.create({
    // event contains all the HTTP parameters passed to this invocation
    to:   event.NumberToCall, 
    // the Twilio Number you set in the Configuration
    from: context.PHONE_NUMBER, 
    // the URL to your Hello World Function
    url:  'https://なんとかかんとか.twil.il/hello'}, 
    function(err, res) {
      // if the REST API call failed, return the error. Otherwise, return OK.
      callback(err, "OK")
    })
};

スクリーンショット_2017-05-31_11_28_51

環境変数の設定

最後に、Functionを実行する際の環境変数を設定しましょう。画面左側のFunctionsメニューからConfigureを開きます。

設定するのは

  • Enable ACCOUNT_SID and AUTH_TOKEN にチェック
  • 環境変数にPHONE_NUMBERを追加、値は上で発行したTwilioの電話番号(+8150xxxxxxxx)

の2点です。こちらも終わったらSaveします。

スクリーンショット_2017-05-31_11_30_37

APIを呼び出してみる

ここまで用意したら、あとはAPIを呼び出すだけです。ターミナルを開き、以下のコマンドを入力します。NumberToCallの部分は”+81″+自分の電話番号ですが、+記号はエスケープする必要があるので”%2B”で置き換え、かつ番号の先頭の0を取る必要があります。
(自分の電話番号が080-1234-5678であれば、”%2B818012345678″です)

$ curl -XPOST -d "NumberToCall=%2B81xxxxxxxxxx" https://なんとかかんとか.twil.io/make_call

Enterを押すと…

IMG_2620 2

来ました!あとは世界に向かってご挨拶を…

「Twilioをご利用いただきありがとうございます。アップグレードいただききますとこのメッセージは削除されます。」

無情なメッセージが流れ、電話を切られてしまいました。どうやらトライアルアカウントでは喋らせることはできないようです。時間的な都合もあり、今回の検証はここまでとなりました。

おわりに

なんとも締まらない終わり方になってしまいましたが、いかがだったでしょうか。APIを呼び出して電話を掛けられるということで、サーバ監視ソフトと連動させてアラートの電話を掛けるといったことができるかな?と思っています(もちろん、アラートが飛ばないのが一番ですが)。あとは、ユーザ登録を受ける時の本人確認の自動化などもできるでしょうか。
コードの書き方もAWSのLambdaに近いようなので、活用できればとても便利そうですね。

最後までお付き合いいただきありがとうございました!

SNSでもご購読できます。