AppEngineでTwilioを試してみた(基本編) |
AppEngineでTwilioを試してみた(応用編) |
はじめに
これまでapps-gcpではデータストアやCloud SQL等のGoogle Cloud Platform(以下GCP)上のAPIについて検証をおこなってきました。ただ、これからGCP上で開発をおこないたいと考えている方の中には外部のAPIも利用してより幅の広いサービスを開発していきたいという方もいるかと思います。ということで、今回はGCPサービスと連携可能なサードパーティのAPIにスポットを当ててみようかと思います。記念すべき第一回は「twillio」を取り上げてみます。
Twilioとは?
Twilioとは”電話”そのものをクラウド化したサービスのことで、開発者はハードウェアの購入をおこなわずに自前でコミュニケーションサービスを構築することができます。TwilioAPIを利用するユーザは一般のクラウドサービスと同様に利用した分だけ使用料金を支払います。もちろん、初期費用は一切かかりません。今回は実際にTwilioアカウントを作成し音声メッセージの出力までを試してみました。Twilio社はGoogle App Engine(以下GAE)用にライブラリを提供しているため、本稿ではGAE上でtwilio APIを利用する方法について説明します。
Twilioの仕組み
画像1. twilioとGAEの連携
(1)モバイルによる発信処理
ユーザがtwilioから発行された電話番号に発信をおこなうと、リクエストがtwilioサーバに送信されます。
(2)リクエストURL(GAE)への問い合わせ
twilioサーバはあらかじめ開発者が設定しておいたリクエストURL(GAE)に対して、ユーザとのコミュニケーションを定義したTwiMLと呼ばれるXMLファイルをリクエストします。
(3)TwiMLをレスポンスとして返却
GAEサーバはtwileサーバに対してTwiMLを返却します。
(4)モバイルへ音声メッセージの出力
twilioサーバはTwiMLファイルで定義された挙動(音声出力・録音等)を実行します。
twiMLとは?
twiMLとは、電話からの発信を受信した場合の挙動を定義するためのXMLファイルです。twilioサーバはGAEからこのtwiMLを受け取り、ユーザとのコミュニケーションをおこないます。本章では、twiMLのタグをいくつかピックアップして紹介します。
(1)Sayタグ
通話による音声出力をおこなう場合はSayタグ内に出力する文字列を定義します。Sayタグの主な属性は以下の通りです。例1は、電話を発信すると2回「こんにちわ。」という音声を出力するサンプルtwiMLです。
・voice
音声を指定します。設定できる値は「man」「woman」「alice」です。
※1 aliceは、多数の言語をサポートする属性です。ただし女性の声しかサポートしていません。
※2 日本語版の場合は3種類のうち「woman」しか対応していません。
・language
音声言語を指定します。日本語の場合は「ja-jp」を指定します。
・loop
繰り返す回数を指定します。
コード
<?xml version="1.0" encoding="UTF-8" ?>
<Response>
<Say voice="woman" language="ja-jp" loop="2">こんにちわ。</Say>
</Response>
例1. Sayタグ
(2)Playタグ
通話中に音声ファイルを再生する場合はPlayタグ内に再生する音声ファイルのURLを定義します。Playタグの主な属性は以下の通りです。例2は、10回音声ファイルを再生するサンプルtwiMLです。
・loop
繰り返す回数を指定します。
コード
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Play loop="10">https://api.twilio.com/cowbell.mp3</Play>
</Response>
例2. Playタグ
(3)Gatherタグ
携帯電話の入力キーを取得する場合はGatherタグを利用します。Gatherタグの属性は以下の通りです。例3は、携帯の入力キーを受け付けるサンプルtwiMLです。
・method
「GET」または「POST」を指定します。
・action
入力キーを受信するURLを指定します。URLは「Digits」というパラメータから入力キーを取得します。
・finishOnKey
入力を終了するためのキーを指定します。
コード
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/getKey" method="GET" finishOnKey=”*”>
<Say>キーパッドからキーを入力してください。</Say>
</Gather>
</Response>
例3. Gatherタグ
※入力キーはGatherタグのactionで指定されたURLに送信されます。GAEから見たログは以下の通りです。キーパッドから”4”を入力した場合は、パラメータは「Digits=4」という形式で送信されてくることがわかります。
画像2.キー入力取得時のGAEログ
(4)Smsタグ
通話中にSMSメッセージを送信する場合はSmsタグを利用します。Smsタグの主な属性は以下の通りです。例4は、通話者に対してSMSメッセージを送信するサンプルtwiMLです。
・to
送信先を指定します。指定しない場合は通話したユーザ宛にメッセージが送信されます。
・from
送信元を指定します。指定しない場合は通話先の電話番号が送信元となります。
コード
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>電話を受け付けました。SMSメッセージを送信します。</Say>
<Sms from=”+15104038862”>メッセージを送信しました。</Sms>
</Response>
例4. Smsタグ
(5)Redirectタグ
他のtwiMLを呼び出す場合はRedirectタグを利用します。Redirectタグの主な属性は以下の通りです。例5は、他のtwiMLにリダイレクトするサンプルtwiMLです。
・method
「GET」または「POST」を指定します。
コード
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Redirect method="POST">http://hoge.hoge/twiml.xml</Redirect>
</Response>
例5. Redirectタグ
Twilioのアカウント登録
Twilioのアカウント作成はとても簡単です。以下のURLにアクセスし「サインアップ」リンクをクリックしてください。
https://jp.twilio.com/
(1)ユーザ情報の入力をおこない「利用開始」ボタンを押下します。
画像3. Twilioアカウントの登録
(2)手持ちの携帯電話番号を入力し「Text Me」ボタンを押下します。
画像4.電話番号の認証
(3)確認コードが記載されたSMSメッセージを受信したら、本コードを入力し「Submit」ボタンを押下します。
画像5.確認コードの入力
(4)twillioからトライアル用の電話番号が発行されます。
これでアカウント作成は完了です。2つ目以降の電話番号を発行する場合は、アカウントのアップグレードをおこないます。アップグレードにはクレジット情報の入力が必要となります。
画像6.アカウント発行時に付与される電話番号
環境構築
AppEngineでTwilioの開発環境を構築するのはとても簡単です。 以下のダウンロードをおこない、Eclipseに(3)のライブラリのビルドパスを設定してください。
※既にApp Engineの環境が整っている場合は、TwilioのHelperライブラリだけダウンロードしてください。
(1)Eclipse
(2)Google Plugin
(3)Twilio Helper Libraries(v3.4.4)
・twilio-java-sdk-3.4.4.jar
・twilio-java-sdk-3.4.4-jar-with-dependencies.jar
https://www.twilio.com/docs/libraries
音声メッセージを出力してみる
通話をおこなうと「Hello, it’s apps-gcp!」という音声メッセージを出力するサーブレットプログラムを実行してみます。EclipseからAppEngineプロジェクトを作成し、以下のサーブレットを作成してください。
(1)音声メッセージ出力のサーブレットの作成
– TwilioServlet
コード
public class TwilioServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// Create a TwiML response and add our friendly message.
TwiMLResponse twiml = new TwiMLResponse();
Say say = new Say("Hello, it’s apps-gcp!");
try {
twiml.append(say);
} catch (TwiMLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resp.setContentType("application/xml");
resp.getWriter().print(twiml.toXML());
}
}
図1.音声メッセージ出力用サーブレット
– web.xml
コード
...
<servlet>
<servlet-name>Twilio</servlet-name>
<servlet-class>test.TwilioServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Twilio</servlet-name>
<url-pattern>/twilio</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
...
図2.サーブレットのURL定義
(2)デプロイ
作成したプログラムをEclipseからデプロイしてください。web.xmlで設定したサーブレットURLにアクセスし、以下のtwiMLが出力されることを確認してください。
画像7.twiML
(3)サーブレットURLの登録
Twilioのアカウントページ(https://jp.twilio.com/)にログイン後、ヘッダメニューの「NUMBERS」を選択し、[音声通話]-[Redirect URL]に今回作成したサーブレットのURLを登録してください。
画像8.音声通話に対応するRequest URLの設定
(4)実際に電話をかけてみる
Twilioから発行された電話番号に対して実際に電話をかけてみます。
(5)音声メッセージの確認
「Hello, It’s apps-gcp!」という音声メッセージが電話から聞き取れれば、プログラムの実行は成功です。
※当分の間、以下の電話番号を公開しますので興味がある方は実際に電話をかけてみてください。上記メッセージが受話器から流れるはずです。ただし、公開は予告なしに取り下げる可能性がありますのでご了承ください。
050-3159-7370
まとめ
以上のことから、twilio SDKを利用することで開発者は簡易にコミュニケーションシステムを構築できることがわかりました。さらにAppEngineを利用することで他のプラットフォームを利用するよりも、よりスピーディに開発がおこなえることが実感できたと思います。次回は応用編としてより高度なtwilio APIの使い方について説明したいと思います。
AppEngineでTwilioを試してみた(基本編)
AppEngineでTwilioを試してみた(応用編)
・voice
音声を指定します。設定できる値は「man」「woman」「alice」です。
※2 日本語版の場合は3種類のうち「woman」しか対応していません。
音声言語を指定します。日本語の場合は「ja-jp」を指定します。
繰り返す回数を指定します。
<?xml version="1.0" encoding="UTF-8" ?>
<Response>
<Say voice="woman" language="ja-jp" loop="2">こんにちわ。</Say>
</Response>
繰り返す回数を指定します。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Play loop="10">https://api.twilio.com/cowbell.mp3</Play>
</Response>
「GET」または「POST」を指定します。
入力キーを受信するURLを指定します。URLは「Digits」というパラメータから入力キーを取得します。
入力を終了するためのキーを指定します。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/getKey" method="GET" finishOnKey=”*”>
<Say>キーパッドからキーを入力してください。</Say>
</Gather>
</Response>
送信先を指定します。指定しない場合は通話したユーザ宛にメッセージが送信されます。
送信元を指定します。指定しない場合は通話先の電話番号が送信元となります。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>電話を受け付けました。SMSメッセージを送信します。</Say>
<Sms from=”+15104038862”>メッセージを送信しました。</Sms>
</Response>
「GET」または「POST」を指定します。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Redirect method="POST">http://hoge.hoge/twiml.xml</Redirect>
</Response>
https://jp.twilio.com/
public class TwilioServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// Create a TwiML response and add our friendly message.
TwiMLResponse twiml = new TwiMLResponse();
Say say = new Say("Hello, it’s apps-gcp!");
try {
twiml.append(say);
} catch (TwiMLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resp.setContentType("application/xml");
resp.getWriter().print(twiml.toXML());
}
}
...
<servlet>
<servlet-name>Twilio</servlet-name>
<servlet-class>test.TwilioServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Twilio</servlet-name>
<url-pattern>/twilio</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
...