第40回NSEGにて、Ruby + Sinatra + Twilio + Herokuのデモを作った時の参考資料

第40回NSEGにて、Rubyを使ったTwilioのデモを作りましたが、その際に調べたことをまとめておきます。
リンク先にはお世話になりました。ありがとうございました。

■Twilio関係

公式ドキュメント

英語のほか、日本語訳もあります。ホスト名を「www」「jp」を変えることで英語/日本語が切り替えられます。


サンプルはGitHubのtwilio-rubyのところにもありました。


Status APIもあるようです。

ライブラリ「twilio-ruby」メソッド名ついて

TwiMLを作り出すメソッドはすべて大文字になります。小文字にしたところ、XMLのタグが小文字になり、TwiMLがうまく動作しませんでした。



JSONのバージョンエラー

Herokuへ上げたところ、以下のエラーで動作しませんでした。

You are using an old or stdlib version of json gem
Please upgrade to the recent version by adding this to your Gemfile:

gem 'json', '~> 1.7.7'


stackoverflowに解説がありました。そのため、Gemfileに以下を追加しました。

gem 'json', '~> 1.7.7'
Twilio例

以下のこともできるようです(RubyではなくPythonですが)。

Sinatra関係

ルート('/')で、静的ファイル('public/index.html')を返す

どんな方法があるのかを調べたところ、stackoverflowに回答がありました。

send_file File.join(settings.public_folder, 'index.html')
Heroku + Sinatraで、HerokuのURLを取得する

WebからTwilioを経由して自分の携帯へ電話をかける場合、引数にTwiMLのURLを渡す必要があります。今回はHerokuでTwiMLを返すので、そのURL取得に悩みました。
最初は、以下の方法で実装してみましたが、自分のアプリ名ではないものが取れました。


ただ、Herokuのconfigに設定することも考えましたが、設定するのはわざわざ設定するのは面倒でした。


そこで、リファレンスをよく見たところ、求めていたそのものズバリの uri() がありました。

client.account.calls.create(
  from: ENV['TWILIO_PHONE_NUMBER'],
  to: ENV['TWILIO_VALIDATED_PHONE_NUMBER'],
  url: uri('/read')
)
SinatraMIME-TYPEを変更する

CaVIOを使ってwavファイルを作成し、Twilioで再生することを考えましたが、何もしないとMIME-TYPEが正しくないため、wavを再生することができませんでした。
設定する方法を探したところ、こちらも content_type() がありました。


なお、該当するMIME-TYPEは、以下の一覧から探しました。

Twilioのdate_createdがRFC2822形式を変換する処理の記載箇所

Viewの中に変換処理を記載したくなかったため、helperを使いました。

helpers do
  def make_time(rfc2822_time)
    utc = Time.rfc2822(rfc2822_time)
    local = utc + 60 * 60 * 9
    local.strftime('%Y/%m/%d %T')
  end
end
テンプレートへの変数渡し

以下を参考にしました。

■Redis To Go関連

GoogleAppEngineで作った時にはDatastoreを使いましたが、そのような感じで気軽に使えるものがHeroku本体にはなかったため、アドオンの「Redis To Go」を入れました。

redis_uri = URI.parse(ENV['REDISTOGO_URL'])
REDIS = Redis.new(host: redis_uri.host, port: redis_uri.port, password: redis_uri.password)

# 入れる
REDIS.set('hoge', 'fuga')

# 出す
piyo = REDIS.get('hoge')

■Heroku関連

ログを見る

Twilioと連携させる必要があり、基本的にHerokuに上げて動作確認をしたため、Herokuのログを追いかけました。

アプリ名を変更する

最初はアプリ名を「nseg40」という単純なものにしていたのですが、そのうちに「/call」へPOSTが連続で届き、電話が鳴り続ける状態となり、恐怖を覚えました。
本来ならば認証を追加するなどを行えばよかったのですが、時間がなかったため、アプリ名を変えました。
さらに、面倒くさがってWebのGUIから変更しましたが、Git側も直す必要があったため、結局CUIになり手順も増えてしまいました*1

■CeVIO関連

Twilioはmp3/wav再生も可能だと知っていたのですが、良いデータがなかったため、最初は音声を再生するデモは諦めていました。
ところが、前日に以下のエントリが流れてきたため、デモのネタになりました。ありがとうございます。

*1:Qiitaの方には現在は不要とありますが、GUIで変えてしまった人は忘れずに行う必要があります。