ゼロからはじめるぜ! Twilio – 第5回

20130726-01.jpg

こんにちは! Twilio チーム ネットワークエンジニアの まさ です。
先日、小1の息子が Wii で「のむすかたろう」という名前のキャラを作っていました。
「コレ、誰なの?」と聞くと、「あれだよ、ムスカだよ。ラピュタの悪いやつだよ」と。真剣に。
それは ロムスカ・パロ・ウル・ラピュタ です(笑)
あまりの空耳っぷりに、腰が抜けました。

今回は、いよいよ大物 PHP にチャレンジします。最初に目標のおさらいです。

今回の目標

電話を架けるとアナウンスが流れ、発信者にプッシュ音操作を促し、ボタンに応じて次の処理が分岐する

前回までに、電話が架かってきて最初に叩かれる TwiML を XML で作成しました。
今回は、分岐したそれぞれの処理を実現するパーツを作っていきます。

 

この PHP では、

  • Gather が渡してきたパラメータ(URL 中「Digits=X」として渡される)を拾う
  • 発信者が「1」「2」「9」のボタンを押した時の処理

ついでに

  • 「1」「2」「9」以外のボタンを押した時の処理

これらを実現するプログラムを書くことになります。先に正解から書いておきます。

上から順番に解説します。

  • require ('Services/Twilio.php') ;
    これは、第 3 回で解凍した Twilio お助けライブラリの場所を指定しています。今回、この PHP を usage_summary.php という名前で以下の写真の通りアップロードする予定です。

よって、この PHP ファイルから Services の中にある Twilio.php までの相対パスを記載しています。この Twilio.php をインクルードすることで、この中に書いてある色々な関数が使えるようになるのです。

20130726-02.jpg

  • $response = new Services_Twilio_Twiml();
    難しい説明は抜きにして、ここはひとまず「Twilio お助けライブラリを使うための呪文」と思っておきましょう。

  • if (isset($_REQUEST['Digits'])){ ~ }
    この PHP を叩いた際に URL の中で ? を使って付与されたパラメータは $_REQUEST という名前の配列に入ります。このうち Digits に該当するものが定義されていれば、{ ~ } の中を処理する、というものです。
    この例で言えば、電話が架かってくると最初に welcome.xml が呼ばれ、<GATHER> 動詞でプッシュ操作を集めた後にこの PHP が呼ばれるため、この PHP が処理される際に Digits に該当するパラメータが空になることはあり得ません。
    なので、この IF 文は無くてもよいのです。が、ここはひとまず IF 文で作ってください。カラクリは後ほど分かります。

  • $input = $_REQUEST['Digits'];
    ここで $input という新しい変数に、実際に何の数字が押されたかを代入しています。

  • switch ($input) { ~ }
    $input に何が代入されているかで条件分岐を行う CASE 文です。
    この例では「1」「2」「9」「その他」のボタンが押された場合で分岐しています。以下「1」が押された場合を解説しますが、他のボタンも同じ要領です。
    なお、CASE 文の中の条件で default: は、「その上までに書かれた条件以外の場合は」を意味します。

  • $gather = $response->gather(array('numDigits' => 1, 'timeout' => '10'));
    XML で書く <Gather> ~ </Gather> の枠組みを作る書き方です。
    これで <Response> ~ </Response> の中にネストされます。Gather に与える属性の書き方も覚えてしまいましょう。

ここでなぜ、また Gather が出てくるのか分かりますか?
最初に呼ばれる welcome.xml で既に Gather しているのに、プッシュ操作後の条件分岐でまた Gather するのは何故でしょうか?

これは「発信者が最初にボタンを押した後も、またボタンを押してもらうことで処理を継続できるようにするため」です。
ここを、次の行で説明する Say だけにしてしまうと、発信者はこの通話において、ボタン操作が最初の 1 回しかできないことになります。押し間違えたら敗者復活もなく、もう一度電話を架け直して最初からやり直さなければなりません。これでは非常に不親切です。

よって、ここでも Gather することで、再びこの PHP スクリプト を最初から実行するようにしています。

 

もう 1 つ、この Gather で考えて欲しいことがあります。
welcome.xml では action 属性を使って、この PHP を呼びました。つまり action="http://hogehoge/twilio/usage_summary.php" としたはずですが、この PHP の中では action が指定されていません。これは何故でしょうか?

TwiML のドキュメントをよく読むと「Gather で action 属性を省略すると、集めたプッシュ操作は自分自身に渡す」ことが分かります。
つまり、この PHP 内 での Gather は、再び自分自身にプッシュ操作の結果を渡しているのです。この usage_summary.php で処理をぐるぐるループさせているというわけです。

 

反対に、この PHP 内の Gather で action 属性を使って他の URL を指定すれば、また別のプログラムへと結果を渡すことが可能です。

  • $gather->say(' 1 を押しやがりましたね、今月の請求額は、わかりません。', array('language' => 'ja-jp'));
    Gather の中身を作っています。
    これで <Gather> ~ </Gather> の中に <Say> ~ </Say> がネストされます。Say に与える属性の書き方は先程と同じ要領です。
  • break;
    CASE 文の外に出る、という意味です。
  • print $response;
    これまでに作ってきた <Response> ~ </Response> をまとめて出力しなさい、の意味です。
    この行で、完成した TwiML を一気に出力しています。

それでは、このファイルを文字コード UTF-8 で usage_summary.php という名前にして保存しましょう。そしてご利用のサーバ環境にアップロードします。もう一度、写真を振り返っておきます、この位置です。

20130726-03.jpg最後は、Twilio 電話番号に URL を関連付けます。

管理画面にログインし、電話番号メニューからお使いになる電話番号をクリックし、以下のように Voice Request URL の欄に、welcome.xml までの URL を記入します。電話番号を複数お持ちの方は、第 2 回目で使った番号とは別のものを使ってもよいですし、1 つしかお持ちでない方やトライアルアカウントの方は、第 2 回目で使った番号を流用します。

20130726-04.jpgここで usage_summary.php までの URL を記入するのではないことに注意してください。

 

usage_summary.php はあくまでも welcome.xml の中で <Gather> 動詞から呼び出されるものです。
「電話を架ける → welcome.xml が叩かれる → usage_summary.php が叩かれる」という関係です。

「変更を保存する」ボタンを押したら、この電話番号に電話を架けてみましょう。どうでしょう? 「1」と「2」を押しても「請求額は分かりません」と言われてしまえばこのアプリケーションは大成功です。
他の数字も押してみてください。「9」を押すと、「さようなら」と言われて電話が切れるはずです。

 

この例は、どこに条件分岐しても Say で喋るだけの簡単な処理ですが、usage_summary.php 内の 各 CASE 文において様々な処理を組み込むことで、より実用的なアプリケーションになります。もちろん、この例のセリフ通り、本当に今月の請求金額を調べて声でお知らせするロジックだって作れますよ!

 

Twilio では、多彩な機能をご利用頂くためのドキュメントを用意しています。慣れてきたら存分にご活用いただき、素敵なサービスを作ってくださいね。
Twilio ドキュメント

 

そういえば、先ほど PHP を書いているときに
「この IF 文は無くてもよいのです。が、ここはひとまず IF 文で作ってください。カラクリは後ほど分かります」
と言ったのを覚えていますか?

次回は、このカラクリを紹介します。お楽しみに!

この記事をシェア


最新記事

すべての記事へ