Twilioの新サービス IP Messaging を触ってみた

こんにちは、[@kimihom](https://twitter.com/kimihom)です。

こちらは [Twilio Advent Calendar 2015](http://qiita.com/advent-calendar/2015/twilio) の18日目の記事となっております。

弊社は5分でブラウザ電話コールセンターを構築できる[CallConnect](https://www.callconnect.jp)にて、Twilio をフル活用して構築しています。そんな関係で私は Twilio の新サービスの IP Messaging に前々からとても注目していました。

# IP Messaging とは
Twilio は今まで"電話" のイメージが強かったと思いますが、チャットやビデオなどコミュニケーションとしてのプラットフォームに変わりつつあります。IP Messaging は Twilio のチャットのサービスです。

先日、IP Messaging が(発表から半年待ってついに) Public Beta となりましたので、Twilio にログインすれば誰でも試して使えるようになっています。そこのドキュメントから言葉を拝借しますと、IP Messagingは以下の通りです。
>  Twilio IP メッセージングは モバイル・ウェブアプリケーションにチャット機能を追加します。構築やメッセージングのバックエンドのスケーリングを気にする必要はありません。iOS, Android, Javascript SDKをご用意しております。REST APIでの制御も可能です。

# モデル構成
IP Messaging におけるモデルは以下のようになっています。

![スクリーンショット 2015-12-16 11.21.14.png](https://qiita-image-store.s3.amazonaws.com/0/11103/bfb9952b-f70b-1d39-8934-b6d462e4e61d.png)
(訂正) Role は User 及び Member に紐付いていました。


この通り、チャット想定の強い設計となっています。スマホ用のSDKもあるのでチャット機能をサクッと開発したいという場合にとても便利なサービスになるかと思います。

# 実際に使ってみた
既に各種言語の REST API は Github上の edge ブランチに上がっています。サンプルプログラムも取り揃えているので簡単に始められました。

私は Ruby が好みだったので、Ruby のサンプルを落として動かしました。

まず Twilio ダッシュボードより IP メッセージングサービスを作成します。これはテスト環境や本番環境などで使い分けられるためのもののようです。作成したSIDをコピッておきます。

![スクリーンショット 2015-12-16 11.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/11103/56865857-73a5-a256-ea49-75e54ca7cbb8.png)

続いてツールタブの API Keys よりキーを作成します。これも適当な名前を作ってSid と Secretをコピっておきます。

```bash
git clone https://github.com/TwilioDevEd/ipm-quickstart-ruby.git
cd ipm-quickstart-ruby
cp .env.example .env
# env の TWILIO_ACCOUNT_SID, TWILIO_API_KEY, TWILIO_API_SECRET,TWILIO_IPM_SERVICE_SID を編集
bundle install
bundle exec ruby app.rb
```

無事ローカルで立ち上がりました！

![スクリーンショット 2015-12-16 11.36.30.png](https://qiita-image-store.s3.amazonaws.com/0/11103/e73e7214-1c84-501e-4fb4-25439359de3b.png)

# IP Messaging のコーディングについて
どんな感じで動いているのかソースをサクッと見てみると、Twilio の Client に似た感じでした。サーバー側でトークンを発行して、それをJavaScript SDK の`Twilio.AccessManager`にセットします。そしたらあとは各種イベントハンドラを定義しておくとそのイベントが起きた時のUI操作をすればいい感じになっています。お手軽！

今の所取得できるイベントは以下のようです。

- メッセージが追加された
- チャンネルに招待された
- チャンネルが追加、編集、削除された
- メンバーが入室、退室、タイプ開始、タイプ終了した

それ以外に、REST APIで呼べそうな項目も JavaScript SDK の中に多少入ってたりします。メッセージ送信やユーザー招待などです。シンプルなチャットであれば JavaScript だけで完結しそうです。

詳細は [Channels and Messages](https://jp.twilio.com/docs/api/ip-messaging/guides/channels)にてご確認いただけます。

# Webhook について
Webhook が最も Twilio IP Messaging でハックできそうなところかなと思っています。普通に使うだけではよくあるチャットのままですが、このWebhookを巧みに活用することで今までのチャットをより強化したサービスが作れるのではないでしょうか。

まず基本的なWebhookの仕組みは以下のようになっています。([本家Twilioブログ](https://www.twilio.com/blog/2015/12/hola-ip-messaging-real-time-translated-chat-with-asp-net-microsoft-translator-and-ip-messaging.html)から拝借)
![EpDdt0OZmHXjZrv09hatEMFNAOsMZM7qOPhDSQwQYyq0SukvwovA5NCaGOn3kgBPvOCAFpJHzTknyp6yR_6joypnXx8d6UXwYav1MlZ0W6QewDBX5_Er5zVMtCPaCPLyq9BxZY7h.png](https://qiita-image-store.s3.amazonaws.com/0/11103/47918927-5501-a546-20e2-0830ee730ea2.png)

ここで、200を返さずに403を返すと、このデフォルトのメッセージ送信を拒否することができます。そこで別途 REST API を通じてメッセージを送信することで、例えば **Aliceは英語で送ったけど、受け取り側は翻訳された日本語で表示する**、などの機能を実装することができるようになります。もちろん本格的な機能としてリンクを自動で作ったり、画像を挿入したりといった高度なチャットも Webhook で可能になるかと思います。

# 終わりに(所感)
- Socket.io を使わずに好きな言語でスケール気にせず作れるのは楽
- チャット想定の設計。それ以外のリアルタイム処理実装は(?)
- モバイルSDKこそ真の強みな気がする(Swiftにも対応)

今の所ベータなのでタダで使えるようです。そのうち料金が決まると思います。IP Messaging を使って何か面白いサービスを作れそうな気がしました！