TWILIO クライアント JAVASCRIPT クイックスタートをやってみる

TwilioでWebRTCをつかって接続したいと調べると、どうやらTwilio ClientのJavaScript SDKがWebRTCベースとなっているということで、これを使用すれば、実質WebRTCでの接続となるようです。
ということで、[TWILIO クライアント JAVASCRIPT クイックスタート](https://jp.twilio.com/docs/voice/client/javascript/quickstart)をやってみます。

## 必要な情報を取得
Twilio Client JavaScript SDKを使用するにあたり、
* TwiML App SID
* Twilioの電話番号
の２つが必要となるようです。
TwiML App SIDは、TwiML APPを作成しなければ取得できないため、まずはTwiML Appの作成を行います。

## TwiML Appを作成する
### 「Phone Numbers」のタブ追加 (ついでに「Runtime」のタブも追加)
タブの追加はしなくてもTwiML Appの作成はできますが、今後のアクセス性のために「Phone Numbers」タブの追加を行います。
[Twilioコンソール](https://jp.twilio.com/console)にアクセスします。アカウント作成したばかりの場合は、「ホーム」のタブのほかには「Programmable Voice」のタブと「All Products & Services」のタブしかないと思います。
そこで、「Phone Numbers」のタブを追加します。あと、ついでに後述する「Twilio Function」の作成のため「Runtime」タブも追加します。
一番左にある縦に並んだタブの一番下の「All Products & Services」のタブをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/20a6d839-92f6-5673-b8b6-6478160ddbab.png)  
タブが右にスライドし、タブの左側に商品およびサービスの一覧が表示されますので、「Phone Numbers」および「Runtime」の右にあるピンのアイコンをクリックしピン止めを有効にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/89e1111f-cc01-d73d-ceea-af01cbd6f0ce.png)  
すると、タブに「Phone Numbers」のタブおよび「Runtime」のタブが追加されます。あとは、一覧表の際に暗くなった右側の部分の適当なところをクリックして一覧を閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/2725d943-9287-3480-0c9a-fe6bd997a48f.png)

### TwiML Appの作成
追加した「Phone Numbers」タブをクリックし、サブメニューから「ツール」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/15e34ff0-43f5-a95f-119c-e85e13c0d576.png)  
「ツール」配下にはいくつか項目がありますが、現在は「TwiML Apps」が先頭の項目であるため、「ツール」をクリックした時点で、「TwiML Apps」のコンテンツが右側に表示されます(もし、「TwiML Apps」が先頭ではなく別の項目のコンテンツが表示されている場合は、「TwiML Apps」をクリックしてください)。
まだ一つも「TwiML App」作成していない場合は「新しい TwiML App を作成する」ボタンが表示されますのでそのボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/73977d01-1474-c88b-fd5e-5efb366c7a27.png)  
すでに「TwiML App」をいくつか作成されている場合は、「TwiML App」のリストが表示され、そのリストの上に丸い"+"ボタン(「新しい TwiML App を作成する」ボタン)がありますので、そのボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/327981fe-7157-d8ea-f0a5-e26a78949a58.png)  
「TwiMLAppを作成する」フォームが表示されますので、ここでは「プロパティ」の「わかりやすい名前」にわかりやすい名前を入力(ここでは、Twilioのクイックスタートの解説に合わせて"Twilio Client Function QS App"にします)し、そのほかの入力項目は未入力で下の「保存」ボタンをクリックします。(自信はありませんがわかりやすい名前には日本語が含まれていても大丈夫そう？)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/7725b445-bb88-e76e-d2a7-2bb9cc7e33e8.png)  
「TwiML Apps」のコンテンツに戻り、コンテンツがリスト表示に切り替わっています。リストに先ほど作成したアプリが追加されていますので、アプリ名をクリックすると、そのアプリの情報ページに遷移します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/c8b72bbb-8c84-6d67-58b6-e89226ac5728.png)  
SID("AP"から始まる文字列)が表示されるのでそのSIDをどこかにメモしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/9048fc10-3f20-e5bb-a42a-54ba18143648.png)  

### Twilioの電話番号確認(メモ)
アカウント作成時に、たぶんすでに一つは取得されていると思いますので、ここでの解説は割愛させていただきます。
(もし、まだ取得されていない場合は[トライアルサインアップの解説動画](https://www.youtube.com/watch?v=rNiaLjnhlB4)内にて、「Twilioの電話番号の購入」の解説がありますので、そちらを参考にして取得してください。)
「Phone Numbers」タブをクリックし、サブメニューから「番号の管理」をクリックします。
「アクティブな電話番号」が、「番号の管理」配下の先頭項目で「番号の管理をクリックした時点で右側に「アクティブな電話番号(電話番号)」のコンテンツが表示されていると思います。もし、「アクティブな電話番号」が「番号の管理」配下の先頭項目出なかった場合は、「アクティブな電話番号」クリックしてください。
「アクティブな電話番号」のコンテンツでは、現在取得してアクティブな電話番号のリストが表示されます。
今回、このTwilio Client JavaScript SDKで使用する電話番号をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/4194c5a2-4bc6-0c2e-114b-5d5d4870f219.png)  
電話番号をクリックすると、その電話番号の情報ページに遷移しますので、「電話番号」に表示されている"+"から始まるハイフンなしの電話番号(E.164形式)を「Twilio App」のSIDをメモしたところに同じくメモしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/c63c304a-8904-92a6-49f1-c14ca1000544.png)


以上で、
* TwiML App SID
* Twilioの電話番号
の２つの情報がそろいました。

## Twilio Functionを作成する
Twilio Functionとは、AWSのLambdaやgoogleのCloud Functionsとほぼ同じようなもので、リクエストやイベントなどにより設定したFunctionを実行しTWiMLなどを返します。Twilio FunctionはJavaScript(Node.js)のコードで記述しますが、今回はコードの記述は行いません。
### Twilio Functionの作成
「Runtime」タブをクリックし、サブメニューの「Functions」、または右側のコンテンツにある「Functions」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/67eb1fd8-0fdc-9d65-82f6-6fef809fbd54.png)  
「Fuctions」配下にいくつか項目があり、先頭が「Manager」となっており「Functions」をクリックした時点で「Manager」のコンテンツが右側に表示されます。
まだ一つも、「Twilio Function」を作成していない場合は「Create Function」ボタンが表示されますので、そのボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/5f1615eb-9212-49c6-456e-0addc3b4f430.png)  
すでに、いくつか「Twilio Function」を作成している場合は、「Twilio Function」のリストが表示され、リストの上に丸い"＋"のボタンがありますので、そのボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/dc6d829e-3f02-2949-eb9d-492406eb0bbf.png)  
ページ内ポップアップが表示され、どんな「Twilio Function」を作成するかを選択するダイアログが表示されますので、「Twilio Clientクイックスタート」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/ddb014ca-9d09-bc9b-c6c4-029b189e0cbe.png)  
「TWIML_APP_SID」と「CALLER_ID」の２つの入力項目に切り替わりますので、「TWIML_APP_SID」にメモしておいた「TwiML App」のSIDを、「CALLER_ID」にメモしておいたTwilioの電話番号を入力したら、下の「Create」ボタンをクリックします。
(「TwiML App」のSIDおよびTwilioの電話番号のメモはあともう一か所設定するところがありますのでまだ消さないでください)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/108f3fbc-056a-0308-0018-1ccd9da9aedf.png)  
ページ内ポップアップが消え、「Manager」のコンテンツがリストに切り替わり、リストに「Twilio Client Quickstart (Voice calls)」と「Twilio Client Quickstart (Capability token)」の２つのアイテムが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/3ae8f9b9-c6dd-d11a-7672-28c0095237cb.png)

### Twilio Client Quickstart (Voice calls)のURLをコピー
「Twilio Client Quickstart (Voice calls)」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/55e4f1ec-932a-ad70-dee0-ea65b67680cb.png)  
「Twilio Client Quickstart (Voice calls)」のページに切り替わりますので、「Properties」の「PATH」にURLが表示され右側に「Copy」ボタンがありますのでそのボタンをクリックしURLをコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/6d5167e3-e094-1dd2-3e36-54e03f010d24.png)  

## TwiML AppにTwilio Function(Twilio Client Quickstart (Voice calls))を設定する
「Phone Numbers」タブをクリックし、サブメニューから「ツール」をクリックします。
(もしこの時点で右側に「Twilio Apps」のコンテンツ(Twilio Appのリスト)が表示されていない場合は、「ツール」配下の「Twilio Apps」をクリックします。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/6309c14f-4d71-59d4-6ac1-c63b3415ace0.png)  
リストから、今回作成した"Twilio Client Function QS App"の名前をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/f440cbdb-a065-f055-06d7-fee92f00cfd7.png)  
"Twilio Client Function QS App"の情報ページに遷移しますので、「Voice」の「REQUEST URL」に先ほどコピーした「Twilio Client Quickstart (Voice calls)」のURLをペーストし、「保存」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/78545996-5ae0-ee58-0b80-11ece963bea0.png)  
以上で、Twilio側の設定が終了しました。
次は、Twilio Client JavaScript SDKを使用したWebアプリの作成です。

## Webアプリの作成
### 「Twilio Client Quickstart (Capability token)」のURLをコピー
Twilio Client SDKを使用するにあたり、Capability tokenが必要になりますので「Twilio Client Quickstart (Capability token)」のURLをコピーしておきます。
「Runtime」タブをクリックし、サブメニューから「Functions」をクリックするか、右側のコンテンツに表示されている「Functions」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/24e9bc73-e92f-734f-f0a8-bcc86a79f7fc.png)  


### クイックスタートサンプルコードのクローン
[client-quickstart-jsのGitHub](https://github.com/TwilioDevEd/client-quickstart-js)のコードをクローンし、クローンしたフォルダをエディターで開きます。

```
> git clone https://github.com/TwilioDevEd/client-quickstart-js.git
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/b77b4005-23d4-c3c5-84d0-3d4ca9c0a34a.png)

### サンプルコードの編集
編集するところは１か所だけでquickstart.js内の
```js
$.getJSON('https://YOUR_FUNCTION_SUBDOMAIN_HERE.twil.io/capability-token')
```
の行を検索し、括弧内のURLの部分に、先ほどコピーした「Twilio Client Quickstart (Capability token)」のURLをペースト(上書き)します。

### Webサーバーを起動する
Twilioのクイックスタート解説においてWebサーバーの起動には、http-serverモジュールを使用するとなっていますのでそれに従います。
http-serverをインストールし起動します。

```
> npm i -g http-server
> http-server
```
### ブラウザーからアクセスする
http-serverを起動すると、URLの候補が出力されますのでいずれかのURLでブラウザーからアクセスすると、画像のようなページが表示されます。

```
Starting up http-server, serving ./public
Available on:
  http://192.168.33.1:8081
  http://192.168.99.1:8081
  http://192.168.1.9:8081
  http://127.0.0.1:8081
Hit CTRL-C to stop the server
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/6ae14aed-520e-88ac-d78e-3edb97dece4d.png)

## 電話をかけてみる
Make a Call:の入力欄に、E.164形式の電話番号(トライアルの場合は検証済電話番号)を入力し、「Call」ボタンを押します。
トライアルの場合は、冒頭にトライアルの自動音声が流れた後に実際のCallが開始されます。
すると、数秒後に、入力した電話番号の電話に着信し、応答するとブラウザー<->電話で通話することができます。


### Application not found
画像のように、「Call」ボタンをクリックしたら、"Application not found"というエラーが出る場合があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/618319a2-a9cc-ff32-729b-44ff5afa4635.png)  
このエラーは「Twilio Function」に設定した「TwiML App」のSIDをもつAppが見つからないということですので、「Twilio Function」に設定された「TwiML App」のSIDを確認します。
確認の仕方は、「Runtime」タブをクリックし、サブメニューの「Functions」をクリック、「Functions」配下の「Configure」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/4946cfeb-68d2-de36-ef18-323679cb7e99.png)  
「Environmental Variables」の項目に、「CALLER_ID」と「TWIML_APP_SID」の値がマスクされた状態で表示されますので、「TWIML_APP_SID」のマスクされた値をクリックするとアンマスクされますので、SIDが今回使用する「TwiML App」のSIDと一致しているか確認します。確認していない場合は、今回使用する「TwiML App」のSIDにこの場で上書きし下にある「Save」ボタン(betaだからなのかほかのページの「保存」ボタンはfixedな配置でスクロールせずとも表示されていますが、このページの「Save」ボタンはスクロールしないと表示されません)をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17554/91c77788-e176-e6bf-b40d-81397df636b3.png)  
これで、再度ブラウザーからCallを試してみるとエラーが解消され、電話との通話ができると思います。