Twilioの歩き方

「[Twilio](https://twilio.kddi-web.com)を使うとコードの中から電話をかけたりテキストメッセージを送信したりできるらしい」
「チャットやビデオ、二要素認証などの高度な機能を簡単に開発中のアプリケーションに組み込めるらしい」
なんだかTwilioってすごそう、便利そう、ということで色々と調べ始めたは良いものの、あまりに情報が多すぎてなかなかその全体像が見えてこない、何をどこから手をつけて良いのかよく分からない、そんなお悩みを抱えていらっしゃるそこのアナタ！
今日はそんな開発者の皆さんのためにTwilioで何が出来て、何をどうすればその豊富な機能を存分に使いこなせるのか、じっくり解説をしていきたいと思います。

# Twilioのプロダクト群

Twilioには「電話やテキストメッセージを扱うためのAPI」というイメージが一般的にありますが、ここ数年同社はその版図を広げ、上記で挙げたようなビデオや二要素認証といった新しいプロダクトを次々とリリースしています。 ここでは2017年12月現在、Twilioが提供している主な製品についての簡単な概要をご紹介します。

## [Programmable Voice](https://jp.twilio.com/docs/api/voice)

Twilioと言えば電話！ ということで同社の核となるプロダクトです。 APIを通じて一般の公衆電話網（PSTN）、SIPエンドポイント、VoIPクライアントとの間で通話の発着信を行い、それらに対して合成音声や録音されたメッセージを再生したり、別の電話に接続して両者が会話できるようにしたり、通話を待ち行列（キュー）に退避させてパーク保留などの機能を実現したり、プッシュボタン（DTMFトーン）からの入力を取得したりといった、様々な機能が利用できます。

## [Programmable Messaging](https://jp.twilio.com/docs/api/messaging)

Programmable Voiceと並ぶTwilioのもう一つの顔、APIを使用してテキストメッセージ、いわゆるSMSやMMS（日本未対応）を送信したり、受信したメッセージに対して返信したりできるプロダクトです。 また複数の電話番号を[Messaging Service](https://jp.twilio.com/docs/api/messaging/services-and-copilot)と呼ばれる単位にひとまとめにして時間あたりのメッセージ送信スピードを上げることもできます。

## [Programmable Fax](https://jp.twilio.com/docs/api/fax)

21世紀の今日においても、業種によってはFaxはまだまだ現役です。 Programmable Faxを使用すると、上述のVoiceやMessagingと同じ要領でAPIを通じてFaxの送受信を行ったり、受信したFaxを画像 (PDFファイル) としてダウンロードしたりできます。 生意気な部下に[「お前はクビだ！」Fax](https://www.youtube.com/watch?v=UlEFqR4SaVA)を送信してスカっとしましょう。（笑）
2017年12月現在、開発者プレビュー（ベータ版）として提供されています。

## [Programmable Video](https://jp.twilio.com/docs/api/video)

ブラウザー上で動作するWebアプリケーションやiOS、AndroidといったモバイルAppにビデオ通話の機能を組み込むことのできるプロダクトです。 Twilioのインフラを介して最大50人の参加者が同時にビデオ通話を行えるGroup Roomと、各クライアントに暗号化を施したうえでお互いを直接接続し、最大10人の参加者がビデオチャットを行えるPeer-to-peer Roomを、ユースケースに応じて使い分けることができます。

## [Programmable Chat](https://jp.twilio.com/docs/api/chat)

Programmable Video同様、皆さんのWebサイトやモバイルアプリケーションに、ちょうどFacebook MessangerやiMessageのようなチャット機能を組み込むことのできるプロダクトです。 公開、プライベートの指定を行える複数のチャンネル、複数デバイスのサポート、既読境界（メッセージを前回どこまで読んでいたかを捕捉しておく栞のような仕組み）、タイピングインジケーター（会話の相手がメッセージを入力中であることを示すイベント）といった、メッセージングに求められる機能が網羅されています。

## [Elastic SIP Trunking](https://jp.twilio.com/docs/api/sip-trunking)

「エラスティック・シップ・トランキング」と読みます。 [SIP (=Session Initiation Protocol)](https://ja.wikipedia.org/wiki/Session_Initiation_Protocol)とは、インターネット上で従来の電話のシグナリング処理を模倣するプロトコルのことですが、[Asterisk](https://www.asterisk.org)のようなソフトウェアを使用して構築されたIP-PBXに、公衆電話網（PSTN）との音声通話機能を廉価に統合することができます。

## [Authy](https://jp.twilio.com/docs/api/authy)

二要素認証や本人確認の仕組みをアプリケーションに組み込むためのAPI群です。 Eコマースサービスや会員向けサイトなどへのダミーアカウント作成やアカウント乗っ取りを未然に防ぐ用途で近年需要が高まっていますが、その実装には高度なセキュリティーのノウハウと多くの開発工数を必要とします。
Authyはこうした認証機能をプラットフォームとして提供しており、ワンタイムパスワードを音声通話やSMS、モバイルApp経由で認証先のデバイスに送信するOneCode、モバイルAppのプッシュ通知を活用して認証コードの数字入力を行わずにワンクリックで認証に対する応答が行えるOneTouchといった複数の認証方法から選択できます。
なお、音声通話やSMSを使用する際はAuthy専用の共通の電話番号からコードの送信が行われるため、別途Twilio電話番号を購入する必要はありません。
モバイルAppはAuthyから提供されているスタンドアローンのものが利用できるほか、SDKを使用してAuthyのクライアント機能を開発者のAppに組み込むことも可能です。

## [Sync](https://jp.twilio.com/docs/api/sync)

Twilioクラウドと、WebブラウザーやモバイルAppといった各種クライアントとの間でデータをリアルタイムに同期できるサービスです。 単一のJSONオブジェクトであるDocument、その配列であるListやMapといったデータ型が使用でき、Syncサービスの構成要素（Twilioクラウド、各種クライアント）のいずれかで変更を加えると、即座にすべての箇所に変更が通知されます。 複数デバイスでのデータの同期、生産性アプリケーションにおける複数人による共同作業、チャットアプリケーションの在籍確認といったユースケースに応用できます。

## [TaskRouter](https://jp.twilio.com/docs/api/taskrouter)

電話での問い合わせやメールやチャットのサポートチケットといったタスクを、それを処理できる適切なスキルを持った担当者に効率よく割り振るためのサービスで、コールセンターやメールサポートのシステム構築に役立つものです。

# Twilioの開発プラットフォーム

Twilioプロダクトのインターフェイスは、そのAPIエンドポイントにHTTPリクエストを送信することがもっとも基本となるインタラクションになりますが、開発を容易にするためのライブラリー、WebブラウザーやモバイルAppといったクライアント側のプラットフォームと統合するためのSDK、Console (管理画面) からアクセスできる各種ツールなど、その構成要素は多岐に渡ります。
ここではその一つ一つについて見ていきましょう。

## [APIエンドポイント](https://jp.twilio.com/docs/api/rest)

Twilioの機能を呼び出すための根幹となる、もっともプリミティブなインターフェイスです。 認証にはTwilioプロジェクト (旧称アカウント) のアカウントSID (ACで始まる34文字の英数字) と認証トークン、あるいは[APIキー](https://jp.twilio.com/docs/api/rest/keys)とシークレットの各組み合わせが使用できます。

## [TwiML](https://jp.twilio.com/docs/api)

Twilio Markup Language (Twilioマークアップ言語) の略で、「トゥイムル」と読みます。 Twilioが通話やメッセージをどのように処理するかを指示するためのXML形式の文書で、通話の発着信時などにおいてTwilioから開発者のサーバーに対して、ちょうどWebブラウザーがWebサーバーに要求を送信するのと同じ要領で[リクエスト](https://jp.twilio.com/docs/api/twiml/twilio_request)されます。
その際に、電話番号や押されたプッシュボタンの内容などが、POSTまたはGETのパラメーターとしてWebサーバーに渡されます。

## ヘルパーライブラリー

上述のAPIを使用するとTwilioの豊富な機能を活用できますが、開発者のプログラムで毎回ゼロからHTTPリクエストを送信するのはいかにも非効率です。
そこで、Twilioではメジャーなサーバー側言語から簡単にTwilioのAPIを呼び出したり、TwiMLを生成したりするためのヘルパーライブラリーが提供されており、これを使用して開発効率を向上させることができます。
対応している言語は[C# (.NET)](https://jp.twilio.com/docs/libraries/csharp)、[Java](https://jp.twilio.com/docs/libraries/java)、[Node.js](https://jp.twilio.com/docs/libraries/node) (JavaScript) 、[PHP](https://jp.twilio.com/docs/libraries/php)、[Python](https://www.twilio.com/docs/libraries/python)、[Ruby](https://jp.twilio.com/docs/libraries/ruby)の6種類で、いずれの言語のライブラリーもその機能に違いはありません。
Twilioでは現在、新しいプロダクトや既存プロダクトへのAPIエンドポイントの増加に伴い、各言語向けの[ヘルパーライブラリーとそのドキュメント生成をほぼ自動化](https://www.twilio.com/blog/2016/02/introducing-twilios-next-generation-helper-libraries.html)しており、そのためこれらの機能追加のライブラリーへの反映に時間がかかったり、言語ごとに機能の実装度合いに差異が出たり、といった課題を解決しています。
そのソースコードは[GitHub](https://github.com)にて公開されています。

## クライアント側SDK

VoIPやVideo、Chatといった、Twilioの機能が直接クライアント側に提供されるプロダクトについては、クライアント側のアプリケーションを実装するためのSDKが提供されます。
対応プラットフォームはWebブラウザー (JavaScript) 、iOS、Androidです。
iOSおよびAndroidのVoIPのSDKに関しては、現行版にあたる「Twilio Client Voice SDK」と、次世代版の「Programmable Voice SDK」の2種類が存在し、両者に互換性はありません。
JavaScript SDKを除いてソースコードは公開されず、バイナリーのみの提供となります。

## [Twilio Console](https://jp.twilio.com/console)

Web上のインターフェイスから、Twilioのプロジェクトや各プロダクトの設定を変更したり、ログを閲覧したりできます。 またTwilio上のインフラで静的なTwiMLをホストできる[TwiML Bins](https://jp.twilio.com/console/runtime/twiml-bins)や、Node.jsで動作するサーバーレス環境である[Functions](https://jp.twilio.com/console/runtime/functions/manage)、APIリクエストを手軽に送信できる[API Explorer](https://jp.twilio.com/console/runtime/api-explorer/voice)といった開発者向けの便利なツールも多く用意されています。

# 技術情報の探し方

ここでは、インターネット上で公開されているTwilioに関する公式ドキュメントや役に立つサイトをご紹介します。

## [Twilioドキュメント](https://jp.twilio.com/docs/)

Twilioを使用したアプリケーションを構築していく中でプロダクトの使い方やAPIの仕様を確認したり、トラブルシューティングを行う際、まず最初に参照すべき公式ドキュメントです。 [APIやSDKのリファレンス](https://jp.twilio.com/docs/api)のほか、はじめてTwilioに触れる開発者が手順を追うことでノウハウを身につけられる[クイックスタート](https://jp.twilio.com/docs/quickstart)、特定の目的を達成するための手順が簡潔に解説されている[ガイド](https://jp.twilio.com/docs/guides)、さまざまな架空のユースケースを想定したアプリケーションの構築例を紹介する[チュートリアル](https://jp.twilio.com/docs/tutorials)といった学習用コンテンツも豊富に揃っています。

## [Twilio for KWC FAQ](https://twilioforkwc.zendesk.com/hc/ja)

Twilioを日本でサービス提供している株式会社KDDIウェブコミュニケーションズのFAQページです。 Twilio自体はワールドワイドに提供されるサービスですが、日本国内固有の注意事項やよくあるお問い合わせに対する回答が日本語で提供されており、またこのページからサポート窓口に直接メールによる問い合わせを行うこともできます。

## [ゼロからはじめるぜ！Twilio](https://twilio.kddi-web.com/mt/mt-search.cgi?IncludeBlogs=2&tag=ゼロからはじめるぜ！Twilio&limit=20)

KWC社ネットワークエンジニアの「まさ」氏が、Twilioの使いこなしをユーザー目線でフレンドリーに説明するブログ記事のシリーズです。 Twilioの基本からアプリケーションの開発、はたまたElastic SIP Trunkingを活用したIP-PBXの構築といった幅広い内容を、ユーモアや自身の苦労話などを交えつつ解説しています。

## [Twilio Blog (英語)](https://www.twilio.com/blog/)

米国Twilio社の公式ブログです。 新しいプロダクトや機能のリリース情報がいち早く得られるほか、コーディングのノウハウ、同社のユーザー事例や社会貢献への取り組みなどといった興味深い記事も読むことができます。
新しくリリースされるプロダクトや機能については、一部日本国内のユーザーに適用されないものも含まれる点に注意してください。

# 終わりに......

ひとくちにTwilioと言っても、その膨大なプロダクトや使いこなしのノウハウすべてをここで網羅することは残念ながらできません。 またTwilioは常に進化を続けており、この記事の執筆時点においても、Programmable Voice [Agent Conference機能の正式版](https://www.twilio.com/blog/2017/12/agent-conference-generally-available.html)や、[Voice Insights Connectivity Dashboards](https://www.twilio.com/blog/2017/12/voice-insights-connectivity.html)といった新機能が続々とリリースされています。
ともあれ、本記事がTwilioを使う開発者の皆さんにとっての水先案内人になれれば、これ以上の喜びはありません。