TwilioでCTI、IVRを作る

# 電話番号の取得

電話番号は各国の規制で、本人確認などが必要なため、対応する書類の提出が必要。
約３日の審査あり。
お試し版で最初に現れるUSの電話番号はすぐに使える（EmergencyCallのためUSの住所などを登録しないといけないが、使える。）

# 着信時のアクション設定
```
Phone Numbers
 - Manage
   - Active Numbers
```

のなかの使用したい電話番号をクリック。

A CALL COMES INの部分に、着信した時点でHTTP POSTを飛ばすアドレスを記入する。
PRIMARY HANDLER FAILSは、A CALL COMES INが終わった段階で、実行されるようだ。音声案内のTwiML Binを作って設定してみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677977/ae4b06c1-48ce-57bc-4c17-ac445a564713.png)





で、Save.
ちなみに、TwiML Binの中身は、以下から作成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677977/ae5685a8-3f81-05e9-b36e-7a39270a6917.png)

```
<?xml version="1.0" encoding="UTF-8"?>
<Response>
 <Say language="ja-JP">お電話ありがとうございます。本日は営業を終了しています。またのお電話お待ちしております。</Say>
</Response>
```



Skypeなどで電話をかけてみると、電話がかかった時に、A CALL COMES INで指定したURLに情報が飛んでくる。

POSTだと、中身のParameterを取り出してみると、(XXXXで内容を変更しております。）
[POST]<ID>｜<value>となっております。

```
2021-10-26 06:20:52,418 [views.py:1135] DEBUG    ------------------post twilio---------------------
2021-10-26 06:20:52,418 [views.py:1139] DEBUG    [POST]AccountSid|AC27bcxxxxxxxxxxxxxxxxxxxxxxxxxxxx　　
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]ApiVersion|2010-04-01
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallSid|CA59xxxxxxxxxxxxxxxxxxxxxxxxxxxx　
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallStatus|ringing
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]Called|+1540573XXX　　　<=xxxxは私が伏せました。
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CalledCity|
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CalledCountry|US
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CalledState|VA
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CalledZip|
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]Caller|+26669XXXX  <=Skypeから　xxxxは私が伏せました。
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallerCity|
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallerCountry|LS
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallerState|
2021-10-26 06:20:52,419 [views.py:1139] DEBUG    [POST]CallerZip|
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]Direction|inbound
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]From|+26669XXXX  <=Skypeから　xxxxは私が伏せました。
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]FromCity|
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]FromCountry|LS
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]FromState|
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]FromZip|
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]To|+15405732101
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]ToCity|
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]ToCountry|US
2021-10-26 06:20:52,420 [views.py:1139] DEBUG    [POST]ToState|VA
2021-10-26 06:20:52,421 [views.py:1139] DEBUG    [POST]ToZip|
```

のようなデータを取得することができた。

さあ、これで着信した瞬間に、データベースから発信者情報を取り出して、ユーザーに情報を表示したりすることができる。

```
<Dial> +8111111111 </Dial>
```
を入れると、転送もできるようだ。

#Studioによる通話の着信や転送、APIでの通話状況や番号の送信

Studioという機能を使えば、着信から終了までの音声案内や、API通信、メッセージの預かり、SMSでメッセージを聞けるURLを送信など、細かい設定をフローチャートのような編集画面で作成できる。実際に作成して成功したチャートを以下に掲載します。

１．音声通話の着信
２．Httpで着信の内容（発信元の電話番号、国、地域、着信した電話番号など）を自分のサーバーのURLにPOSTやGETで送信
３．音声ガイダンスを流す
４．ほかの電話番号に転送（電話番号を購入したら、どこの国にかけることができるかの設定を行わないとどこにもかけれないので、注意！）
５．転送先が電話に出ない、転送失敗などの時、その旨のアナウンスとメッセージを預かりますとお知らせする。
６．メッセージを預かったら、希望の番号にSMSを送信。メッセージが再生できるURLを添付する。（SMSが発信できる電話番号が必要。）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677977/83cea7f8-4cd6-20ec-f89a-d8a20ebbeca6.png)


私の場合、２のおかげで、かけてきた人の情報をデータベースで検索し、転送先にあるWebアプリに前もってかけてきた人の情報を表示できるようになりました。

以上です。