読者です 読者をやめる 読者になる 読者になる

sekaie engineers' blog

セカイエ株式会社が主催するエンジニア勉強会について

Twilio 入門

Twilio Heroku

まいどどうも、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 やで!

github.com

ほな。

広告を非表示にする