問い合わせ電話を受けつつ、顧客データを検索したい

# 背景
## 問い合わせの窓口の番号を複数の担当者に転送
テレワークなどのために、会社の固定電話を使用していた問い合わせ番号を複数の担当者に転送したいというニーズがありました。その番号をTwilioの番号にすることは問題ありません。しかしこれまでは固定電話でかかってきた際に表示されるナンバーディスプレイを見て、オペレーターが早打ちで顧客データベースを検索してから電話を取る、という職人芸で乗り切っていました。電話を取りながら顧客データベースを見たいというニーズは理解出来ます。

## 現実的な問題
全部TwilioのIP電話で使ってくれればいろいろと展開ができるのですが、現実には担当者の携帯電話だったり、固定電話だったりに最終的に電話を転送しなければならないことが多いわけです。
その際に困るのが、TwilioからRedirectで転送すると、Caller IDが消えてしまう、つまり掛けてきた元の電話番号が参照できなくなるという点です。
これは以前に問い合わせたところ、技術的な問題では無く法律の問題ということでどうしようもありません。

# 対処方法
かかってきた番号を転送する前にプログラムを一つかませて、その電話番号に紐付いた顧客データをSlack、SMS、メールで飛ばした後にRedirectで転送することにしました。

# Twilio Studioで作ったフロー
![スクリーンショット 2021-12-01 12.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39657/b764e782-6a36-72b4-6556-f7cf5767a089.png)
## Trigger: 電話なので「Incoming Call」からフローを伸ばします。
電話の場合は常にこれを選択します。Incoming_messageはSMSを受け取ったものを処理したい場合に使用します。
## http_unite: まず用意したスクリプトを呼び出しています。
aaa.com/admin/lookup_redirecterというURLを呼んでいます。
![スクリーンショット 2021-12-01 12.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39657/4c5d6d50-94b8-050c-99fd-085d8d1660ca.png)
このスクリプトはCodeIgniterで書いています。

```php:Admin.php
public function lookup_redirecter(){
	http_response_code(200);
	$this->output->set_status_header(200);	

        if( $this->input->method() == "get"){
        	$phone = $this->input->get("sid");

            /* API URL */
            $url = 'https://companys_database/lookup_customer?sid=' . $phone;
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); // メソッド指定
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る

            $response = curl_exec($curl);

            $this->send_lookedup_info($response);
                /* close cURL resource */
                curl_close($curl);
        }
}
```

中身はこのような感じです。この中でイントラネット上の顧客データベースを電話番号をキーに呼び出しています。
電話番号をsidという引数でgetリクエストから取り出していますが、このポイントはTwilio Studioの先のhttp_uniteの設定ペインの下の方にあるこの設定です。
![スクリーンショット 2021-12-01 12.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39657/528da3e0-f961-f07e-4c0a-5008f3f03599.png)
HTTP Parametersというところでsidを指定しています。
そしてTwilioが用意してくれる{{trigger.call.From}}を値としてセットする設定にします。こうすることで、指定したURLの先でGETリクエストから電話番号を取得できます。
その後 send_lookedup_info()という関数で、Slack、担当者のメール、担当者のSMS（これもTwilioを使っています）に顧客に関する情報を一斉に飛ばしています。
顧客情報がデータベースに見つからなければ、問い合わせ履歴としてデータベースに自動的に入力されつつ、電話番号だけはメールなどでみんなに届く仕組みです。

## say_play_1: スクリプトの結果を問わずメッセージを流しています。
![スクリーンショット 2021-12-01 13.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39657/fb3ac30d-a0a8-37cf-e3d1-ec048c1f1ace.png)
この裏側の動きとは関係なく、電話を掛けてきた顧客が最初に聞くメッセージです。「まるまる」としてあるのは、読みにくい漢字の名前などはひらがなに開いておかないと機械音声で正しく反映されないからです。
例えば九州のほうに「神代」という名字があります。「くましろ」「こうじろ」「じんだい」など読み方の可能性がたくさんあります。このような固有名詞はひらがなにしておくと良いでしょう。
## connect_call_1: メッセージが終了したら用意した電話番号3つに転送しています。
![スクリーンショット 2021-12-01 13.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39657/d16dbead-0d3f-d8e2-7494-54038af9ba5b.png)
転送する段階で元の電話番号（先程使った{{trigger.call.From}}）は参照できなくなります。それでここでは自身で取得しているTwilio番号（{{contact.channel.address}}）を設定しています。

ここで設定された電話が一斉に鳴り、最初に取った人がこの顧客と話せます。着信電話番号はTwilio番号になってしまっていますが、メール、SMS、Slackで情報が届いているので、安心して顧客対応が出来ます。

転送が終わった時点でここで設定している処理は終わりです。
# 結論
かかってきた電話を最終的に転送しなければならないニーズはあります。その際に電話番号を知りたい、その電話番号で情報を事前に知りたいというニーズもありました。
強引な手ではありますが、この方法でこれらの問題を一応解決できますので、とても役に立っております。