Twilio x SORACOM Air で SIM の停止/再開を音声電話経由で制御する


[SORACOM Advent Calendar 2015](http://qiita.com/advent-calendar/2015/soracom)の19日めの記事をお届けします.

Twilio API を使って、音声電話経由で SORACOM API を叩くアプリケーションを作ってみました. 名づけて、SoraTel(ソラテル) です.

SoraTel は、専用の電話番号に電話をかけた後、操作メニュー番号と IMSI をプッシュするだけで、SORACOM Air SIM の停止や再開をおこなえる Web アプリケーションです.

SoraTel は Heroku アカウントと Twilio アカウントがあれば、下のボタンを押すだけで、いますぐ自分専用のアプリケーションを動かせます！よろしければ、ぜひお試しください.

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/tmtysk/soratel)

[ソースコードは GitHub にホストしています](https://github.com/tmtysk/soratel).

# SoraTel のしくみ

SoraTel の実体は、[100 行に満たない Sinatra アプリケーション](https://github.com/tmtysk/soratel/blob/master/app.rb)です.
Twilio で取得した電話番号への着信を HTTP リクエストとして受信し、電話機からのプッシュ信号に応じて、SORACOM API との通信をおこないます.

![Kobito.1xoArY.png](https://qiita-image-store.s3.amazonaws.com/0/1329/f7eb1de1-01a2-5a0a-669d-65db373e7f02.png "Kobito.1xoArY.png")

# 使い方

[README](https://github.com/tmtysk/soratel/blob/master/README.md) でも見られますが、ざっと解説しておきます.

## Heroku の準備

[Heroku アカウントを取得](https://signup.heroku.com/signup/dc)します. 皆さんお持ちですよね.
初めての方も、サインアップ後にブラウザでログイン状態にしておけば、ひとまず OK です.

## Twilio の準備

### アカウント取得

[Twilio アカウントを取得](https://www.twilio.com/try-twilio)します. Twilio は[国内用のサービスサイト](http://twilio.kddi-web.com)が本家とは別のところにあるようなのですが、僕は本家で取得してしまいました. たぶんどっちでやっても使えます. アカウント取得時には、SMS や音声電話による本人認証手順があります.

### 電話番号取得

アカウント取得後に、SoraTel で使用する電話番号を取得します.
[ログイン後の画面](https://www.twilio.com/user/account/phone-numbers/getting-started)から `Get your first Twilio phone number` ボタンを押します.

![Kobito.MmFFsi.png](https://qiita-image-store.s3.amazonaws.com/0/1329/554e2bb9-7775-8fcb-aa40-b24133516e5a.png "Kobito.MmFFsi.png")

適当な番号が割り当てられますので `Choose this Number` で確定します. +813 から始まる番号ということで、03 局ですね. 着信先は東京なんでしょうか. 050 が降ってくると思っていたので意外でした.

![Kobito.iKK51g.png](https://qiita-image-store.s3.amazonaws.com/0/1329/993c9653-c0fe-9269-c25e-2faca0b66f15.png "Kobito.iKK51g.png")

ここで取得した電話番号が、SIM をコントロールするための発信先番号となります.

### Twilio AuthToken の取得

SoraTel では Twilio で受け付けた通話を HTTP リクエストとして受け取ります. ですが、リクエスト先の URL がバレてしまうと、第三者から勝手に SIM をコントロールされてしまって、よろしくありません.

SoraTel では Twilio 経由でのリクエストであることを検証するため、認証トークンを設定しておくことができます. [ダッシュボード](https://www.twilio.com/user/account/settings)で認証トークンを確認しておきましょう. このトークンは、デプロイ時の設定に使用します.

![Kobito.qUKSsU.png](https://qiita-image-store.s3.amazonaws.com/0/1329/ddbfdadb-980b-a26b-33c9-e44a5f97d3a6.png "Kobito.qUKSsU.png")

## SoraTel アプリケーションの配備

Heroku へ SoraTel をデプロイします. まだやっていない方は、下のボタンからどうぞ.

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/tmtysk/soratel)

デプロイボタンを押すと、デプロイ前に環境変数の設定画面が表示されます. ここで、Soracom の認証情報と、先ほど取得した Twilio AuthToken をセットしてください. (この情報は Heroku でのアプリケーション実行時の環境変数として使用されるだけで、勝手にどこかに送信したりはしていませんのでご安心を.)

![Kobito.942xCh.png](https://qiita-image-store.s3.amazonaws.com/0/1329/ea12d155-3e64-476e-c637-cc41dc49f111.png "Kobito.942xCh.png")

デプロイが終わると、`View` ボタンが表示され、起動したアプリケーション URL にアクセスできるようになります. この URL は、Twilio 側の設定に使用します.

![Kobito.lDaxir.png](https://qiita-image-store.s3.amazonaws.com/0/1329/06c5d59f-68da-10fd-b2a2-2e03da643d3a.png "Kobito.lDaxir.png")

## Twilio への通話の転送先 URL を設定

[Twilioで取得した電話番号一覧画面](https://www.twilio.com/user/account/phone-numbers/incoming)から、電話番号をクリックし、電話着信時の転送先 URL を設定します. 設定する URL は、以下のとおりです.

![Kobito.ekzd0T.png](https://qiita-image-store.s3.amazonaws.com/0/1329/73dc462a-4ef2-4a2e-7eaa-895183e46f1b.png "Kobito.ekzd0T.png")

```
https://<Herokuで稼働しているSoraTelのドメイン>/twilio
```

設定は以上です.

## 動作確認

さっそく、手元の電話機から Twilio で取得した電話番号に電話をかけてみましょう！

* 電話が繋がると、音声ガイダンスによるメニューが再生されます. (トライアルアカウントの場合、先にトライアルのガイダンスが流れる場合があります.) 1で再開、2で停止です.
* IMSI を入力するよう求める音声ガイダンスが再生されます. 15桁の IMSI を入力すれば、再開/停止処理が実行されます.
* 処理が終わったら、任意のタイミングで電話を切ってかまいません.

# こんなことができそう

クリスマスまで、まだちょっと日がありますので、こんなハックはいかがでしょうか.

## 対応するAPIを増やす

SoraTel は今のところ activate/deactivate にしか対応していません. register に対応させて SIM 即売会場で即時開通してニヤニヤするのもよし、みんな大好き update_speed_class に対応してワクワクしたり、禁断の terminate に対応させてドキドキしたりするのはいかがでしょうか.

## 発信者電話番号認証をする

今のままだと、Twilio 電話番号がバレてしまうと、第三者に SIM 状態を操作されてしまいます. Twilio から転送されてくる HTTP リクエストからは、[発信者電話番号を取得することができます](https://www.twilio.com/docs/api/rest/call)ので、これを使って発信者番号認証を付けておくのが良さそうです.

## 発信者電話番号に応じて IMSI 入力をスキップする

別途ユーザのメイン電話番号と IMSI をひも付けておけば、IMSI の入力を不要にできますし、複数ユーザ向けになんちゃって MVNO サービスができちゃうかもしれません. うまくいったら、[ぼくにクリスマスプレゼントを贈ってください](http://www.amazon.co.jp/gp/registry/wishlist/3GAIT6I9Y7PI3/).

## 国際化対応

[locales ディレクトリの下](https://github.com/tmtysk/soratel/tree/master/locales)に、辞書ファイルがあります. ja と en だけ作ってありますが、せっかくなのでいろんな言語に対応させてみてはどうでしょうか. Twilio の `voice = alice` は[20種類以上の言語読み上げに対応](https://www.twilio.com/docs/api/twiml/say#attributes-alice)しているようです.

# 作ってみての感想

電話による音声通話や、SIM 開通のような回線契約状態変更など、ちょっと前までは、API 経由で制御できるようになるなんて思いもよらなかったサービスだと思います. API のおかげで、こういう新しいことができるようになっていくのは楽しいですね！

# 注意事項

* SoraTel は MIT License のもと公開するアプリケーションです. 本ソフトウェアの利用に関して、作者は何の責任も負いません.
* Heroku, Twilio ともに、無料で利用できる範囲には限りがあります. 制限事項については各サービス側で確認してください.

# その他

* アイコンが無いので、もし作ってくださる方がいらっしゃったらご連絡ください.
* ソラコムたのしいので、IoT というか、なんかやりたいわーって方、いらっしゃったら誘ってください.

# 参考

* [Creating a 'Deploy to Heroku' Button | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-button)
* [Security - Twilio](https://www.twilio.com/docs/api/security)
* [SORACOM Developers](https://dev.soracom.io/jp/)