この記事について
Twilio Advent Calendar 2018 - Qiita の 18日目 の記事です。
※遅刻してすみません。
Twilioの架電周りについては、架電することはよく書かれていますが、架電のトレーサビリティについてはあまり語られていないようなので、この機会に残しておきます。
Twilioの架電実装の容易性は素晴らしいのですが、トレーサビリティについても簡単に行えて素晴らしいので、是非参考にしていただきたいです。
文中のコードはLaravel 5.5で書かれたものです。
どうやるのか
概略
- 架電して架電IDを取る
- 取った架電IDを保存しておく
- 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';
おわりに
自分からかけた架電のトレースについてざっくり書いてみました。