Article

ブログ

2016/06/10

Twilio の Client コールフロー詳細

こんにちは、本間です。

簡単に電話アプリケーションが作れると話題の Twilio ですが、より強固で美しい電話アプリケーションを作る場合には詳細を理解し、その上で開発する必要があります。

今回は Client に焦点を当てていますが、これは Dial 動詞であれば基本的に変わるものではありません。ぜひ Twilio の詳細を理解し、クールな電話アプリケーションを作っていきましょう!

CallSid と DialCallSid

まず Twilio では Sid という単位でそれぞれの通話イベントやモデルの ID を生成しています。これが一意になっているため、そのデータを取得や更新・削除したい場合は REST API から簡単に操作することができます。

さて、TwiML で Dial を書いて電話転送のような仕組みを作ると、 CallSid と DialCallSid の2つが登場します。また、 Twilio のログを見てみると、1つの通話に必ず2つの Call が作成されていることがわかります。

これは Twilio を理解する上で非常に重要な概念です。料金のところにも関わってきます。

Twilio において、電話は相手と1対1の通話ではなく、 Twilio を通して通話するものです。これこそが CallSid と DialCallSid の2つが生成される理由であります。以下は 外線番号から Twilio 番号に着信が入り、Client の電話を鳴らすフローです。

TwiML の Dial を指定して転送した場合は、必ず DialCallSid も生成されます。相手が電話に出たか出なかったなどは DialCallStatus で判別できます。

TwiML の action の URL を指定することができますが、これは通話が終わった後にデータ(Dial情報)を送って次の TwiML アクションを指定するためにあります。

Twilio Client で取得できる Connection

さて、 Twilio Client の話に入りましょう。 Twilio Client では、Connection オブジェクト を取ってくることができます。この Connection オブジェクトは、Twilio から Client へのコネクション であります。つまり、From は Twilio で指定した CallerId が取得できることになります。発信元 から Twilio への Call は ParentCallSid を元に REST API で取得することも可能です。

今までは電話を受信する inbound コールの想定でしたが、outbound の場合はどうなるでしょうか。ここが実は Twilio Client の挙動において厄介な部分なのです。

Twilio.js には connect イベントが用意されています。 Connect イベントは、Client と Twilio が繋がったときに呼ばれるイベントであり、オペレーターと相手が繋がったときに呼ばれるイベントではないということが特徴です。この時点で Twilio と 相手の接続のCallを取得することはできない、とも言えます。Twilio と 相手の接続のCall を取得するためには、基本的には通話が終わった後のaction url で得られることになります。

「Client において、着信時にはすぐにCallSid を取得できるが、発信時にはDialCallSid をすぐに取得することはできない。」ということを知っておくと、今後 通話のアップデートなどを実装するときに必ず役に立ちます。

Client における CallerId

TwiML で Dial CallerId=”” のような 指定をするとき、CallerId にはどんなものを指定すると良いでしょうか。まず一つシンプルなのは、 かけて来たCallのFrom を直接渡すというのが考えられます。そうすれば Client の From として適切に表示することができます。

反対に、Twilio で複数番号を持っていてどこ宛に電話をかけたのかを知りたい場合には、かけて来た CallのToを直接渡すということも考えられます。

それ以外に、Twilio の CallerId は、 “client:” で始まる任意の英数字とアンダースコアを指定することができます。ここで例えば裏側で生成した DB の ID などを上手く埋め込むことで、着信時に Ajax で問い合わせして誰からのどこ宛の電話なのかを取ってくることもできます。

CallerId は 携帯や固定電話にかける場合は client: の記法はアラートが出てしまいます(その場合、Twilio番号がFromとして表示されます)。場合に応じて上手く使い分けるようにしましょう。

料金体系のカラクリ

さて、Twilio の通話料金に関しても言及しておきます。今までご紹介した通り、電話の受信・発信それぞれにおいて Twilio でまず受信してからTwilioが発信する。 ということになり、着信料は必ずかかることになります。そのあと、Twilio が発信するということをしない場合(つまり Say や Play などで終わらせる) には着信料だけということになります。

これが 050 番号で受信したときにでも通話料金がかかる理由となります。

終わりに

今回の知識は、TwiML で普通に外線番号に Dial して終わりという場合ではあまり必要になる知識ではないかもしれませんが、より踏み込んだ電話の実装をする場合は必ず知らなければならな知識です。

一見複雑そうに見えますが、それでも Twilio は美しく綺麗に電話の概念をコードに落とし込めていると私は思います。5分で電話システムが作れる!と売りの Twilio ですが、そのさらに奥にある部分を知ると、より一層 Twilio の素晴らしさを理解することができるでしょう。

最後に、弊社では Twilio ベースのコールセンターシステム ”CallConnect” の運営と、Twilio 関連の相談を承っております。