まいどどうも、5年ぶりに髪を染めたエンジニアの中島です。
セカイエでは、社員の約半数が RCG (Reform Consultant Group) に所属し、直接お客様と電話対応しながらコンサル業務を行っています。
電話を用いた業務を多くこなすセカイエでもなにか活用できるのではと考え、今回は電話とインターネットをつなぐAPIを提供している Twilio に入門してみました。
Twilio 概要
Twilio では電話がかかってくると TwiML と呼ばれる Twilio用の xml をみて、記述されたタグの処理を実行します(音声を流す、録音するなど)。TwiML を置く場所は インターネットから見れる URL が指定されていればオッケーで、ウェルカムメッセージを流すだけならば gist などで公開するだけで動作確認できます。
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="woman">Please leave a message after the tone.</Say> <Record maxLength="20" /> </Response>
あとはこの TwiMLを動的に作成すればいろんなことができそうです。
作るもの
今回は、社員の誕生日が近いということで、
Twilio を使ってお祝いメッセージを集めて、当日にプレゼントすることにしました。
やりたいことは、以下の記事とほぼ同じで、シーケンスやコードを参考にさせていただきました。
wedding-sに向けてTwilioでお祝いのメッセージを集めた - はまさき : http://hmsk.hatenablog.com/entry/2013/10/22/091427
できたもの
Rails、Heroku で作成しました。
詳しい実装は、Github を参照ください。
(動かなかったら堪忍です。)
github.com
入門してわかったこと
Twilio で取得できる情報(電話時)
{ "Called"=>"+81*********", "ToState"=>"Tokyo", "CallerCountry"=>"JP", "Direction"=>"inbound", "CalledVia"=>"03********", "CallerState"=>"", "ToZip"=>"", "CallSid"=>"hogehoge", "To"=>"+81*********", "CallerZip"=>"", "ToCountry"=>"JP", "ApiVersion"=>"2010-04-01", "CalledZip"=>"", "CalledCity"=>"", "CallStatus"=>"completed", "From"=>"+81**********", "AccountSid"=>"fugafuga", "CalledCountry"=>"JP", "CallerCity"=>"", "Caller"=>"+8180********", "FromCountry"=>"JP", "ToCity"=>"", "FromCity"=>"", "CalledState"=>"Tokyo", "ForwardedFrom"=>"03*********", "FromZip"=>"", "FromState"=>"" }
基本的なパラメータはこんな感じで、録音の処理のときは RecordingUrl
、ボタン操作の時は Digits
などのパラメータが付与されます。
これらのパラメータによって処理を変えることでいろんなことができそうです(特定の電話番号からのみ処理を変更するなど)。
音声ファイル
録音された出力は wav形式 で保存されているようですが、今回は、mp3 形式で扱いたかったので、ffmpeg などを用いて変換、結合しました。
以下の様な rake スクリプトを用いて一括ダウンロード&変換&結合します。
音声案内などのインターネットから参照できる音声ファイルも Heroku に置いたので今回は rake secret
でファイル名を難しくしました。
# lib/tasks/records.rake namespace :records do desc 'Make an mp3 file for gift' task make_mp3: :environment do # $ hk run rails c # >> Record.pluck(:recording_url) # の、配列を records に指定する records = [] DOWNLOAD_DIR = "#{Rails.root + 'downloads/'}" # 一括ダウンロードして wav を mp3 に変換 records.each do |r| system("wget -O #{DOWNLOAD_DIR + File.basename(r)}.wav #{r}") system("ffmpeg -i #{DOWNLOAD_DIR + File.basename(r)}.wav -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 #{DOWNLOAD_DIR + File.basename(r)}.mp3") end # 結合 system("cat #{DOWNLOAD_DIR}*.mp3 > #{Rails.root + 'public/mp3/'}`bundle exec rake secret`.mp3") # 素材は消しておく system("rm #{DOWNLOAD_DIR}*{.mp3,.wav}") puts "COMPLATED!!" end end
料金
Heroku で運用したため、ほぼ電話番号料金だけでした。(レコーディングなどのAPIは全部で $1 かかっていません) 詳しい料金はサイトで確認できます。
セキュリティ
Heroku 上に 管理画面を作成したこともあり BASIC認証をかけました。サイト全体にも BASIC認証が有効にしたため、Twilio の Request URL にも https://username:password@www.myserver.com/
のように指定することで TwiML もみることができます。
もっと、クリティカルなデータを扱うなどするときは、X-Twilio-Signature
のヘッダーを指定して HTTP のやりとりをするなどが必要です。
詳しくはドキュメントを参照ください。
Security Documentation for SMS, VoIP & Voice API - Twilio
アカウント
Twilio では JP 専用のドメインがあります。日本でサービスを提供するなら JP で良さそうですが、わたしは誤って米国のアカウントで作成してました。。気をつけるべきポイントです。
おわりに
Twilio 操作に、特にハマることもなくサービスを作り、サプライズプレゼントを成功できてよかったです。普段、チャットやメールのコミュニケーションに偏りがちな皆さんにもオススメです!(社内交流にもとても良いと思います)今後は、自動化を進めて「祝電2.0」を広めていきたいです!あと、自社サービスでも活用できるように知見を深めていきます。
あまり関係ないけど、hk 便利
Heroku 操作するなら、hk やで!
ほな。