3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TwilioAdvent Calendar 2018

Day 18

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

Last updated at Posted at 2018-12-25

この記事について

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';

おわりに

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?