Tropoでモーニングコール

# 動機
* 朝が苦手です
* 電話が鳴りません(※そんな友達いません)

↓

__朝突然、誰かから電話がかかってきたら起きられるのでは！__

# 作るもの
* slackで予約
* 時間になったら電話がかかってくる
* 電話応答。起きた場合は1を、まだ寝る場合は0を入力
* 起きた・起きてないをslackにお知らせ

### イメージ
![Tropoでモーニングコール-イメージ](https://qiita-image-store.s3.amazonaws.com/0/50054/048b68c8-518b-10e9-a36a-0d7e0a7cce61.png)

# クラウド電話APIサービスTropo
https://www.tropo.com/

* WebAPI経由で電話をかけられるWebサービス
* 電話を受信し、通話しているユーザーからの入力を受け付けたり、返答用音声の再生をしたり出来る
* これらをプログラムとして書ける
* 開発時点では無料で利用できる(※!!実質無料!!後述)

### 登録
https://www.tropo.com/ の `REGISTER` より登録

### アプリケーション作成
1. Tropoにログイン
2. MY APPS メニューからCreate New Appで作成
3. アプリケーションに対し、自動で1つ電話番号が発行される

### アプリケーションのタイプ
アプリケーションのタイプは2種類あります。
__Scripting API__

* TropoのUI上で通話処理のスクリプトを作成
* PHP, Java, javascript, ruby, pythonに対応
* 電話がかかってきたら音声を流す くらいの処理であればこのタイプでよい

TropoのUI上でスクリプトを編集する
<img src="https://qiita-image-store.s3.amazonaws.com/0/50054/68b66813-a2cb-e0a6-57cf-43ba9de09cd3.png" width="300" title="Tropoでモーニングコール-スクリプト編集画面" />

__Web (HTTP) API__

* 開発者が用意したWebAPIで通話処理を実装(JSONを返すだけ)
* TropoのアプリケーションにそのAPIのURLを設定。APIからのレスポンスによりTropo側が処理を行う
* PHP, Java, javascript, ruby, pythonそれぞれライブラリが用意されている(https://github.com/tropo/)
* 発着信の情報をDBに保存するなどの処理が必要な場合はこのタイプを使う

### アプリケーションの開発ステータス
`Development`と`Production`の2種類あり、ステータスが`Development`である限り無料で利用できるようです。
![Tropoでモーニングコール-アプリケーションの開発ステータス](https://qiita-image-store.s3.amazonaws.com/0/50054/65abe9a6-20f9-cd06-a862-e0884ad390f0.png)
`Development`ステータスのまま使い続ければ無料で行けそうですが・・・(未検証)
また、`Production`に移行すると`Development`に戻すにはサポートさんへの連絡が必要とのこと。

### アプリケーションの実行
2パターンあるようです。
A. アプリケーションに発行された電話番号に電話をかける
![Tropoでモーニングコール-アプリケーションに発行された電話番号に電話をかける.png](https://qiita-image-store.s3.amazonaws.com/0/50054/e95b057a-03cf-7b8e-3150-64ce9fd9bd38.png)

電話番号 03-4578-1959 が割り当てられたアプリケーションに下記コードを設定しています。

```php:tropo.php
<?php
say ("Hello, world! I'm satoshun00!");
```

試しにお手元の電話でかけてみてください。たどたどしい英語が聴こえてきます。
(！電話のかけ間違いに注意してください)
(！通話料金はお客様負担です)

B. アプリケーションに発行されたAPI KeyでTropoのAPIを実行
![Tropoでモーニングコール-アプリケーションに発行されたAPI KeyでTropoのAPIを実行](https://qiita-image-store.s3.amazonaws.com/0/50054/7c940509-b648-ce74-1c3b-f470a72d0021.png)

# Tropoから日本の携帯電話に無料で電話をかける
Tropoで電話をかける(outbound)には一手間必要でした。
> However, in order to make outbound calls or send outbound SMS at all, you will also need to verify your account. Please open an account ticket to begin the process.

Tropoのサポートにoutbound権限の申請(英語)がいるとのこと。サポートのフォームを使ってこんなやりとりをしました。

> _私 「outboundの権限が欲しいです。( ﾟρﾟ )」_

> 5分後(早い。多分コピペ)

> _サポートさん 「
1. アプリの使い道を教えてくれ
2. 認証するから電話番号教えてくれ
3. $10のデポジットが必要だから払って(開発時は無料で使えるよ！)
4. 」_

> _私 「
1. リマインダー作るよ
2. 電話番号書く(国際電話番号で)
3. 払ったよ
」_

> ここで非通知で謎の電話。私、キョドって無視する。

> 10分後に返信(早い)

>_サポートさん 「
1. もうちょい詳しく教えてくれないかな（#^ω^）悪用とかどうやって防ぐん？
2. そのうち連絡行くと思うから、認証番号をここに書いてね
3. いいね
」_

>_私 「
1. 勉強のためだから外に公開しないよ！
2. SMSで認証コードくれませんか・・・(英語で話しかけられたら詰むので
」_

> SMSで認証コードが届く。
>_私 「認証コードは○○○○だよ！」_

> 10分後に返信
>_サポートさん 「認証コードもあってるし、権限付与したよ！」_

ここまで1時間足らず。サポートさん優秀ですね。権限はゲット出来た。

##### 日本の携帯電話にかける
権限がもらえたので、テストで電話をかけてみることに。

```php:call.php
<?php
call('+8190*********'); // 自分の携帯番号
say('Hello World.');
```

かかってこない。ヘルプにも記載がないので、またサポートとやりとり。
私の操作ログ等を見て、状況を追ってくれたらしい。返ってきた返事が以下。

> Calls to mobile numbers outside the United States are restricted in the development environment, due to cost.
(どうやら日本の番号にかけてるみたいだね)アメリカ国外へのoutboundは無料で出来ないんだ。

出来ないらしい。

##### 流石に開発は無料でやりたい
デバッグするたびに通話料がかかるなんてやりたくないので、デバッグ用にはSIPによる通話を利用しました。
1. [Antisip](http://sip.antisip.com/)にて無料のSIPを取得
2. MacOSX用電話アプリ[Telephone.app](https://itunes.apple.com/jp/app/telephone/id406825478?mt=12)をインストール。上記で取得したSIPを設定

先の`call()`の引数に、取得したSIPを書いたらTelephone.appを通じてちゃんと電話がかかってきました。

# ここまでで出来たもの
* PublicにWeb (HTTP) APIを用意。電話をかけるJSONを返す
* 音声ファイルの再生
* 自分の携帯に電話がかかってくる

# 出来てないもの
* slackとのつなぎ込み
* 予約機能
* 通話しているユーザーからの返答を受ける処理


※随時UPDATEします。。