PHP
laravel
twilio
TwilioDay 18

自分でかけた電話を追跡する方法


この記事について

Twilio Advent Calendar 2018 - Qiita の 18日目 の記事です。

※遅刻してすみません。

Twilioの架電周りについては、架電することはよく書かれていますが、架電のトレーサビリティについてはあまり語られていないようなので、この機会に残しておきます。

Twilioの架電実装の容易性は素晴らしいのですが、トレーサビリティについても簡単に行えて素晴らしいので、是非参考にしていただきたいです。

文中のコードはLaravel 5.5で書かれたものです。


どうやるのか


概略


  1. 架電して架電IDを取る

  2. 取った架電IDを保存しておく

  3. Twilioからのコールバックを受けてステータスに応じた処理をする


詳細

Twilioの架電には、架電ごとに割り振られるcallSidというものがあるので、これで以ってトレースします。

/** @var Twilio\Rest\Client twilio_cli */

$call_obj = $twilio_cli->calls->create(
$to, $from,
[
'url' => $markup_url,
'method' => 'POST',
'StatusCallback' => 'https://hoge.com/callback',
'statusCallbackMethod' => 'POST',
'statusCallbackEvent' => ['initiated', 'ringing', 'answered', 'completed'],
]
);

このコードを実行すると、$call_objの属性にsidというのが入ってくるので、

これをデータベースやKVSに登録しておき、アプリで拾えるようにします。

statusCallbackEventに、トレースしたい架電ステータスを放り込んでおくと、その状態に変わったときに、

TwilioのサーバからwebhookがStatusCallbackで指定したURL宛てに届くので、それに応じた処理をします。

例を置いておきます。

public function modify(TwilioTelRequest $request)

{
$input = $request->only(['CallSid', 'CallStatus']);

if ($input['CallStatus'] === 'in-progress') {
// なんか実装
}
$this->updateCallStatus($input);

// Twilioに何かしたいわけではないので、Twimlを生成して返しておけばOK。
return new Twiml();
}

TwilioTelRequestの中でTwilioサーバーからのリクエストかをチェックするようにしています。

Twilioからのリクエストかチェックする方法については、こちらを見ていただければと思います。


statusCallbackEventでの注意事項

私も最初勘違いしていましたが、

ここに設定できる設定値に、in-progressやbusyなどはありません。

これらのステータスは詳細のステータスであり、

statusCallbackEventというのは、概形的なイベントを設定するにすぎません。

うろ覚えですが、例えばin-progressだとstatusCallbackEventで指定したところのansweredの詳細ステータスにあたったはずです。

ここみてもらうのが一番手っ取り早いです。

ちなみに、上記にはqueuedも取れそうな感じで書いてありますが、


$twilio_cli->calls->create


して取った$call_objのステータスを見るとqueuedになっているので、私がやるときは無意味だと思ってstatusCallbackEventには含めていないです。

(含めてもコールバックは飛んでこないし、たとえ飛んできてもタイミングなどの問題を埋め込むことになる)


その他注意事項

CSPを独自にいぢってたりすると、そもそもTwilioからの要求を受け付けなかったりします。

その場合はCSPに以下を追加してください。


script-src 'self' *.twiliocdn.com 'unsafe-inline';



おわりに

自分からかけた架電のトレースについてざっくり書いてみました。