これまでのもの
Twilioで在宅勤務の外線電話をステキな感じにする(一斉呼び出し・時間外非応答)(前置き編)
http://qiita.com/chabose/items/2dc18db77bdf14c2738f
Twilioで在宅勤務の外線電話をステキな感じにする(一斉呼び出し・時間外非応答・Slack通知)(実装編)
http://qiita.com/chabose/items/f098aa4ff28ad5492fa3
今回作るもの
前回までに着信部分を作ったので、今回は発信を実装します。
Twilioで取得した電話番号で着信できても、その番号で折り返しができなければあまり意味がありません。
なので、前述のSIPクライアントから発信した場合、Twilioで取得した番号で発信先に電話がかかるようにします。
フロー
- SIPクライアントから電話番号に発信する
- TwiMLが呼ばれ、発信先番号を解釈する
- Twilio番号を発番にして外部に発信する
太字部分が今回実装する部分です。
実装
電話番号の解釈
SIPクライアントを利用した場合、通常のように番号入力して発信すると、宛先が[email protected]
のような形でSIPサーバーに送られます。
一方、Twilioが発信のときに使う番号は、+国番号(日本:81)と国内番号の先頭0を取ったもの
、つまり+8190XXXXXXXX
のような形式なので、これを合わせてあげる必要があります。
- 電話番号の先頭が0の場合は国内電話なので、@よりあとを削除、先頭の0を削除し、+81をつけて発信先番号を作成する(ex. [email protected])
- 先頭の番号が+の場合は、国際電話なので、@よりあとを削除し、発信先番号を作成する(ex. [email protected])
- それ以外の場合はSIPの内線の可能性があるので、そのまま発信先番号として利用する(ex. [email protected])
コード
<?php
header("content-type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$to = $_POST['To'];
$endpos = strpos($to,"@");
$number = substr($to,4,$endpos-4);
$firstletter = substr($number, 0,1);
switch($firstletter){
case "+":
$dial = "<Number>${number}</Number>\n";
break;
case "0":
$number = substr($number, 1);
$dial = "<Number>+81${number}</Number>\n";
break;
default:
$dial = "<Sip>${to}</Sip>";
}
?>
<Response>
<Dial callerId="+8150XXXXXXXX">
<?=$dial?>
</Dial>
</Response>
こんな感じですかね。
callerIdには必ずTwilioで購入した番号を記載します。
これをおいたURLを
[プログラマブルVoice]-[SIPドメイン]-設定画面-[REQUEST URL]に設定すれば発信については完了です。
次は
Lambda+API Gatewayですね。