最初にお断りしておくと、今回紹介する機能は通話の API サービスで、実際に試すと少額ですが以下の料金が発生します。その点ご了承ください:
http://twilio.kddi-web.com/price/index.html



Twilio という変わり種サービスがあります:

http://twilio.kddi-web.com/


↑この URL を見てもわかるように、日本では KDDI ウェブコミュニケーションズ様がサービスを提供しています。

Twilio は「クラウド上の電話 API サービス」です。ウェブ上から電話をかけたり、特定の番号への着信を受けて(自動音声などで)処理したり、ということができるのですが、そのプログラミング用 API が公開されていることで開発者視点からも興味深いサービスです。なお、Twilio API の公式ドキュメントについてはこちらを参照ください:
http://www.twilio.com/docs/api/twiml


更に、最近 IBM がベータ公開している PaaS 環境である BlueMix の中で、この Twilio が連携サービスの1つになっていることが分かりました。BlueMix はアメリカの IBM が提供しているサービスで、日本で取得した Twilio アカウントが使えるか心配でしたが、私が使っている限りでは特に問題ないようです。 というわけで、この BlueMix のサービスとして Twilio を使った電話連携アプリを作る様子を紹介してみます。


BlueMix では Twilio サービスが提供されていますが、使うためにはあらかじめ Twilio のトライアルアカウントを取得しておく必要があります。既にアカウントをお持ちの方は自身のアカウント ID と認証トークンを確認してください。Twilio のアカウント作成に関しては Micorsoft のページに詳しく記載されていたので参照ください。こちらの手順でアカウント ID と認証トークン、そして通話用の電話番号(!)が取得できます:
Twilio (トゥイリオ)を触ってみた

ここで一点注意を。通話用の電話番号はトライアルアカウントの範囲内で取得できますが、その番号では SMS は利用できません。SMS 用の電話番号を取得するには初期チャージ料金 2000 円と、月額10ドルの番号維持費が必要になります。


Twilio のアカウントが取得できたら、そのアカウントを使った Twilio サーバーを BlueMix 上に作成します。まずは BlueMix にログインし、ダッシュボードから "Add a service" を選択します:
2014040401


サービスの種類は "Twilio" を選択します:
2014040402


確認画面で "ADD TO APPLICATION" を選択します:
2014040403


Twilio サービスの簡易設定を行います。といってもここで設定する項目は3つだけで、下の2つは Twilio アカウント作成時やログイン後の画面から取得できるものです。入力後に "CREATE" をクリックします:
 - Add to: アプリケーションサーバーの指定。後で指定する場合は "Do not associate" でも構いません。
 - Account SID: Twilio API を利用する アカウント ID
 - Auth Token: 認証トークン文字列
2014040404


先ほどの手順でアプリケーションサーバーの指定をしなかった場合は別途アプリケーションサーバーを作って(あるいは既存のものを使って)Twilio サーバーと紐づけます。ここでは kkimura3 という名前の Java アプリケーションサーバーを作って、そこに紐づける前提で紹介しています。アプリケーションサーバーの "Add existing service" を選択します:
2014040405


紐づけるサービスを選択します。今回は上記で作成した Twilio サーバーを指定します:
2014040406


アプリケーションサーバーを再起動する、という確認画面が出たら OK をクリックします:
2014040407


アプリケーションサーバーが再起動し、Twilio のマークが表示されればサービスと紐づいていることが確認できます:
2014040408


この紐づいた状態で kkimura3 サーバーの環境変数を確認すると、VCAP_SERVICES 変数に Twilio アカウントや認証トークンが設定されていることが確認できます。したがって、この後作成するアプリケーションにはこれらの情報をハードコーディングする必要がなく、環境変数から取得する、というセキュアな手法も可能になります:
2014040409


また、Twilio API の SDK をダウンロードしておきます。各種言語の API はこちらに用意されています:
Twilio API Libraries

今回は Java を利用するので、ページの真ん中くらいの "Java" というセクションから "twilio-java" と書かれた箇所をクリックし、リンク先から最新版の Java SDK をダウンロードします(2014/04/04 時点では twilio-java-sdk-3.3.16.jar が最新版です)。
2014040410

あとは普通に(Eclipse などで) Java アプリケーションを作成します。その際に今ダウンロードした Twilio Java SDK ファイルをプロジェクトに(WEB-INF/lib/ とかに)インポートして、プロジェクト内で利用できるようにしておきます。さあこれで準備は完了です!


で、Twilio 連携アプリケーションを作るわけですが、今回は以下のような仕様のシンプルなアプリを作ります:
- 「指定の番号へ電話をかけて、特定のメッセージを流す」というアプリ。
- 発信元番号は Twilio で取得した番号(日本で取得した場合は 050-AAAA-BBBB という、050 で始まる番号になっているはずです)。
- 着信先番号はアプリ内で指定する(ただし自分で受け取れないと意味ないので、自分の携帯電話番号とか)。

以下でそのアプリのコードを紹介しますが、かなりシンプルなのがわかると思います。

なお、日本の電話番号はゼロから始まる(0**-****-****)のですが、Twilio から発信する場合は国際電話形式に変更する必要があります。そのため最初のゼロをとり、頭に +81 を付け、+81-**-****-**** という形式の電話番号をコード内で指定している、という点に注意してください。


Twilio 連携をするアプリケーションをこんな感じで作成します。今回は JSP ファイル(twilio.jsp)を1つ作成し、以下のような内容にしてみました:
<%@page import="java.util.*" %>
<%@page import="java.net.*" %>
  :
<%@page import="com.twilio.*" %>
<%@page import="com.twilio.sdk.*" %>
<%@page import="com.twilio.sdk.resource.factory.*" %>
<%@page import="com.twilio.sdk.resource.instance.*" %>

<%
String sid = "", token = "";
String env1 = System.getenv( "VCAP_SERVICES" );
if( env1 != null && env1.length() > 0 ){
  // BlueMix 環境なので、env1 から accountSID と authToken の値を取り出し、sid / token に格納する
    :
}

//. BlueMix でない環境のための設定
if( sid.length() == 0 ){
  sid = "(Twilio のアカウントSID)";
}
if( token.length() == 0 ){
  token = "(Twilio の認証トークン)";
}

String r = "";
try{
  TwilioRestClient client = new TwilioRestClient( sid, token );
  Map params = new HashMap();
  params.put( "To", "+8180xxxxyyyy" );  // +81-80-XXXX-YYYY 形式での(自分が受け取れる)電話番号
  params.put( "From", "+8150aaaabbbb" ); // +81-50-AAAA-BBBB 形式での Twilio で取得した電話番号
  params.put( "Url", "http://demo.twilio.com/welcome/voice/ja/" ); // 確認用ウェルカムメッセージ
  CallFactory callFactory = client.getAccount().getCallFactory();
  Call message = callFactory.create( params );  // 実際に電話をかける
  r = "" + message.getSid();
}catch( Exception e ){
  e.printStackTrace();
  r = "Exception: " + e;
}
%>

result = <%= r %>

ここでの内容はシンプルなので眺めていればなんとなくわかると思います。発信番号と着信番号を指定して、着信するとウェルカムメッセージを流す、というだけの内容です。また成功した場合のウェブ画面には SID が表示されるようになっています。

ちなみに上記コード内の params.put( "Url", "***" ); で指定した箇所ですが、Twilio ではメッセージの内容を特定のフォーマット(TwiML)で定義するのですが、その定義内容が参照できる URL を指定することで、そのメッセージを音声で喋らせることができます。上記で指定しているのはデフォルトの確認用メッセージ(「トライアルアカウントへようこそ・・」みたいな感じ)が流れる URL ですで、その中身は以下のようになっています:
<Response>
<Say language="ja-JP" voice="alice">VOICE U R L の設定を変更することでこの文章を変更できます。</Say>
<Pause length="1"/>
<Say language="ja-JP" voice="alice">仕様のことでご不明点が御座いましたらご連絡ください。</Say>
</Response>

この内容は自分でオリジナルのものを定義/用意することも可能ですし、TwiML を生成/保管するサービスも提供されているようです。TwiML の仕様についてはこちらを参照するか、あるいはウェブで情報を探してみてください。


こうして作成したウェブアプリケーションを WAR ファイル(twilio.war)にして、上記で作成した BlueMix の kkimura3 サーバーに cf を使ってデプロイします(この辺りの詳しい手順はこちらを参照ください):
# cf push kkimura3 -p twilio.war

そして、ウェブブラウザで BlueMix のアプリケーションサーバーの twilio.jsp にアクセスすると、画面には SID が表示されて・・・
2014040411


そして携帯電話には Twilio の番号からの着信が・・・
写真


おお! できました!! このコールを着信すると機械的な声で Twilio のデモメッセージが(自分で作ったメッセージの URL を指定した場合はそのメッセージが)音声で流れてきます。つまりウェブアプリから電話番号に発信してメッセージを流す、というアプリがこんな簡単に作れてしまったことになります。


このアプリは放置しておくと1アクセスごとに電話がかかってきて(しかも19円ずつかかって)しまうので、検証が終わった段階で止めておくのがいいでしょう。でも電話や SMS の連携が数行のコードでできてしまうのはアプリ開発の幅が広がりますよね。

そしてそんな Twilio サービスを自分のアプリ用に、しかも選択するだけで簡単に用意できてしまう BlueMix プラットフォームにも可能性を感じました。