twilio-ruby を使ってみた

[Shinosaka.rb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/shinosakarb) 7日目の記事。

twilio-ruby を Rails5 で使った時の驚きや何やコレ?感、感想を書く。
twilio-ruby を使う時の参考になればと思う。 :baby_chick::rooster:

# twilio-ruby って何？ :hatching_chick:

https://github.com/twilio/twilio-ruby
で公開されている gem。

Ruby で Twilio の機能が利用できるようになる。
Twilio の公式gemである。
なお、Rails用に最適化しているgemは、公式/非公式含め見つけられなかった。
（あったら教えてほしい）

# Twilio って何？ :hatching_chick:

プログラマブルな電話、メッセージ、ビデオ機能が提供されているサービス。

本家は、こちら
https://www.twilio.com/

日本では、KDDI と組んでやってる
http://twilio.kddi-web.com/

日本語での Twilio の紹介ページは以下
http://twilio.kddi-web.com/availability/

# twilio-ruby のインストール :hatching_chick:

Ruby で使う場合は、Github の Installation の通りにすれば OK.
https://github.com/twilio/twilio-ruby#installation

Rails5 でも使えて(Rails4とかでも使えるはず)、Gemfile に追加すれば OK.


# 僕が使ったのは TwiML, REST API の２つ :hatching_chick:
他にも機能はあるが、ちゃんと使ったのはこの２つなので、この事についてここでは書く。

## 1. TwiML :chicken:
これは何かというと、XMLの亜種というか Twilio が作ったXML文法のもの。
Twilio から発行された電話番号に電話とかが着信したり切られたりしたら、指定したURLにあるこのTwiMLを読み込んで実行してくれる。

電話の発着や、メッセージの受信で、Webサービスのイベントの起点に出きたり、人の声で応答メッセージを作れたりする。

"少々お待ちください" と日本語で書いて、人間っぽい声で音声メッセージが流れてきて驚いた。
ドコまで出来るかは分からないが、ある程度漢字にも対応しているようだ。

TwiML のドキュメントは以下。日本語版もあるのはありがたい。
https://www.twilio.com/docs/api/twiml
https://jp.twilio.com/docs/api/twiml

ここまで読んで、ぜんぜん Ruby 関係ないじゃんと思ったあなた。
あなたは正しい。
しかし、ちょっと待って欲しい。
実は、 twilio-ruby には TwiML の DSL が用意されているのだ。
これがあったので、Shinosaka.rb のアドベントカレンダーに登録しようと思った。

以下の URL でサンプルが書いてある。
https://github.com/twilio/twilio-ruby/wiki/TwiML

上記のページのコードを引用して説明しよう。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say voice="alice">hello there</Say>
  <Dial callerId="+14159992222">
    <Client>jenny</Client>
  </Dial>
</Response>
```

上記の TwiML は 電話がかかってきたら、 "hello there" と女性の声が聞こえた後に、
CallerId が "+14159992222" のクライアント jenny につなぐ処理が実行される。
TwiMLの解説は詳しく書かないので、公式ドキュメントを参照してほしい。
このTwiMLを twilio-ruby の DSL で書くと、上記サイトには以下のように書いてある。

```ruby
response = Twilio::TwiML::VoiceResponse.new do |r|
  r.say('hello there', voice: 'alice')
  r.dial(caller_id: '+14159992222') do |d|
    d.client 'jenny'
  end
end
```

それをテキストとして出力するのが、

```ruby
# print the result
puts response.to_s
```

の部分になる。

Ruby で使うには良い機能だけど、 Rails で使うにあたり、困った。
View と Controller の分離に反するので、気になるなら使わない方がいいと思う。
DSLを使わずにTwiMLを直接Viewに書いても挙動に全く違いはない。

##2. REST API :chicken:

Twilio の機能が REST API として提供されている。
Get リクエストだけじゃなくて、ちゃんと POSTリクエストのパラメーターを使った処理もあるので、使い道は結構ある。

Twilio のドキュメントは以下。もちろん日本語版もある。
https://www.twilio.com/docs/api/rest
https://jp.twilio.com/docs/api/rest

使い方自体は公式ドキュメントを見て使って欲しいが、
ここで触れておきたいのは、サンプルコードの事である。

サンプルコードに Ruby での書き方も書いてあるので参考になるが、
サンプルコードの右上のほうに "SDK Version: 4.x 5.x" という記述があって、
デフォルトでは "4.x" という古い形式の SDKのサンプルが表示されている。
"5.x"をクリックして、新しいSDKの方を見ると、若干記述方法が変わっているので注意しよう。
ただ、 "4.x"の書き方でも 2016年12月時点では使えているので、あまり気にする事はないのかもしれない。

ActiveRecord とは違う感じの使い勝手になっているので、サンプルを見ながら慣れよう。

# Rails5で使った感想/空想 :hatching_chick:

最後に使った感想を書く。
僕は、Rails5に組み込んだので、その感想だ。
Railsでない Ruby で使った時は、別の印象を持ったと思う。

まず TwiML。
DSLが用意されているのが面白いので、これを View に組み込む機能が欲しい。
Controller にこれを書くのは、何か違う気がする。
*.twiml とかで勝手に xml に展開してくれるようなやつがあったらいいなと空想した。

REST API
ドキュメントがしっかりしているので、使える。
しかし いかんせん Rails の model と使い勝手が異なるので、
twilio-ruby のオブジェクトをいろんな場所に組み込むと混乱すると思う。
ActiveModel 組み込んだやつがあったらいいなと空想した。


以上:baby_chick::rooster: