FlashAir開発者向け非公式wiki - Lua: Twilioを使って電話を掛ける

概要

電話/SMSをAPIから発信・着信できるサービスTwilioを使って,FlashAirから電話をかけます.
電話のほか,SMSも利用できます.また,将来的にはFAXも利用できるかもしれません.

簡易的な非常通報装置や,セキュリティ装置,呼び出しボタンなんかが作れます.
インターネットに出られるWi-Fi接続が必要です.


ライセンス

3条項BSDライセンス(ただしLGPLのコードを含む)

注意

Twilioは有料サービスです.
1番号あたり月額108円に加え,1発信あたり15円(携帯電話宛で,1分以内の場合.1分を超えるごとに15円追加)がかかります.
無料お試し(500円相当)のあと,番号を削除しないで放置していると,残高がマイナスになりアカウントが一時的に休止されますが,
仮にアカウントが休止されていた場合でも,番号が登録されている間,毎月残高がマイナスされて積み上がっていきます.
この料金は支払う義務が発生します.後のアップグレード時に請求が発生します.
(またアップグレード後にポイントを購入しなかった場合も同じことが発生します)
長期間使わない場合は,Twilioの電話番号か,あるいはアカウントを削除しましょう.

なお、トライアルが終了した時点以降(トライアルで定めている一定額の無料ご利用分を超えた以降)に、アカウントをアップグレードせず経過した期間の電話番号については、月額が計上し続けられています。トライアル時にご利用になった電話番号を引き続きご利用頂く場合には、アップグレード時に、トライアル期間終了後から経過した月額が請求対象となりますことにご留意ください。
Twilio FAQ 「無料トライアル アカウントはどのように使いますか ?」より
https://twilioforkwc.zendesk.com/hc/ja/articles/20...

無料お試し期間中の制限

  • 現在は500円分のポイントが有ります.(月額108円を抜いた,392円分が実際に発着信に利用可能な額です)
  • 検証済み電話番号(登録時に入力した番号)にしか発信できません
  • 自動メッセージの前に「こちらはTwilioです.アカウントをアップグレードすることでこのメッセージを消すことができます.なにかボタンを押してください」のメッセージが流れます

使い方

0. FlashAirをWi-Fiに接続する
1. Twilioに登録する.
名前(実名)とメールアドレス,パスワード,そして電話番号で登録できます.
無料お試し期間中は,この電話番号にしか掛けられないのでご注意ください

参考:twilioのトライアル登録してみた by @tukiyo3 on @Qiita
http://qiita.com/tukiyo3/items/e41f94a9e74379c5bbe...

また,この際登録した電話番号をスクリプトのここに記入してください.
先頭の+は不要で,国番号から始めます.
例:0903101655の場合 → 81903101655
 local ToNum   = "810000000000"


2. Twilio電話番号を取得する
画面の指示に従ってください.
この電話番号をスクリプトのここに記入してください.
先頭の+は不要で,国番号から始めます.
例:0903101655の場合 → 81903101655
 local FromNum = "810000000000"

3. ACCOUNT SIDとAUTH TOKENをメモする
「ホーム」の「コンソールダッシュボード」から確認できます.
スクリプトのここに記入してください.
 local SID = "#######################################"
 local Token = "########################################"

4. TwiML Binを作成する
電話の発着信の制御には,TwiMLというものを用います.
Twilio用のXMLです.このファイルを置くサーバーが本来必要となりますが,
これを保管するサービスが公式に提供されていますので,今回はこれを使用します.

「</>デベロッパーセンター」の「TwiML Bins」を開き,+マークを押します.
「FRIENDLY NAME」には好きな名前を.
「TWIML」には,以下のXMLを記述します.

<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say voice="alice" language="ja-JP" >
{{message}}
</Say>
</Response> 

記入が終わったら,「Create」をクリックすると,
このようなURLが表示されるのでタンをクリック
スクリプトのここに末端のIDだけを記入してください.

例: https ://handler.twilio.com/twiml/EH312f3ed42b8ac937f7b3fe9bd3154008
上記のURLの場合はEH312f3ed42b8ac937f7b3fe9bd3154008です.
 local twimlurlid = "EHxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

※このTwiMLには,「TwiML Binテンプレート」を利用しています.
これは,発信時のURLの末端に情報を付加すると,その情報をTwiML中に置換してくれるTwiML Binの機能です.
詳しくは以下のページをご覧ください
https://twilioforkwc.zendesk.com/hc/ja/articles/11...

※TwiMLは,その他様々な機能が利用できます.(音声ファイルの再生,通話の録音,メニュー機能等)
上記のTwiMLは,日本語を再生する最も単純な例です.
より様々な機能を利用したい場合は,以下のページを参照してください.
https://jp.twilio.com/docs/api/twiml

5. Luaを実行する
「電話のテストでした。電話のテストでした。」と電話がかかってくれば成功です.

発信内容を変更したい場合,スクリプトのここを変更することでメッセージを変えることができます.
ここには,UTF-8エンコードされた文字列を,URLエンコードした文字列を入れる必要があります.
callTwilio("%E9%9B%BB%E8%A9%B1%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E9%9B%BB%E8%A9%B1%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82")

例えば,変換にこのサイト( http://urlencode.net/result.cgi )を利用する場合,
中央の「オプション」を「UTF-8」に設定し,左に日本語を入れ,「エンコード」を押した後の結果を
貼り付けることで利用できます.
例:「緊急通報です。緊急通報です。」
→「%E7%B7%8A%E6%80%A5%E9%80%9A%E5%A0%B1%E3%81%A7%E3%81%99%E3%80%82%E7%B7%8A%E6%80%A5%E9%80%9A%E5%A0%B1%E3%81%A7%E3%81%99%E3%80%82」

6. アップグレードする
より自由に利用したい場合,アップグレードすることで様々な利用ができるようになります.
着信時のトライアル版メッセージもなくなります.

アップグレードにはクレジットカードまたはPayPalアカウントが必要です.
また,ポイントチャージは最低2000円からとなります.
※ポイントチャージをした時点でトライアルは終了になります。(体験用ポイントは即座に消滅し,以降の課金は即座に行われます)

くれぐれも,電話番号に応じた月額料金がかることにご注意ください

スクリプト

-- Lua 5.1+ base64 v3.0 (c) 2009 by Alex Kloss <alexthkloss@web.de>
-- licensed under the terms of the LGPL2
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function enc(data)
        return ((data:gsub('.', function(x) 
                local r,b='',x:byte()
                for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
                return r;
        end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
                if (#x < 6) then return '' end
                local c=0
                for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
                return b:sub(c+1,c+1)
        end)..({ '', '==', '=' })[#data%3+1])
end
--end of base64

--Twilio caller (c) 2017 by SegFaul
-- licensed under the terms of the BSD 3-Clause License

local SID = "#######################################"
local Token = "########################################"
local AuthInfo = enc(SID..":"..Token) --※ここをBASE64エンコードした状態にしておけば,上記BASE64エンコードのライブラリは不要になります

--国際電話番号の形式で入力(+は不要.プログラム側で付加している)
local ToNum   = "810000000000"
local FromNum = "810000000000"

--https://handler.twilio.com/twiml/############################## の#の部分を記入
local twimlurlid = "EHxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

function callTwilio(mes) 
  collectgarbage()
  local twimlurl = "https%3A%2F%2Fhandler.twilio.com%2Ftwiml%2F"..twimlurlid.."%3Fmessage%3D"..string.gsub(mes, "%%", "%%25") --URLエンコードを二重にかける
  local requestUrl = "https://api.twilio.com/2010-04-01/Accounts/".. SID .. "/Calls.json"
  local requestBody = "Url="..twimlurl.."&To=%2B"..ToNum.."&From=%2B"..FromNum

  local len_s = tostring(string.len(requestBody))
  local b,c,h = fa.request{
     url = requestUrl,
     method = "POST",
     headers = {
      ["Content-Length"] = len_s,
      ["Content-Type"] = "application/x-www-form-urlencoded;",
      ["Authorization"] = "Basic "..AuthInfo
    },
     body = requestBody
  }

  print(h)
  print(b)
  return c
end

--UTF-8エンコードの文字を,URLエンコードしたものを入れてください.
--日本語が使えます.あまり長い文字列は受け付けられないことが有ります.(エンコード後が2000文字くらいまで?)
--便利なサイト: http://urlencode.net/result.cgi (このサイトの「オプション」をUTF-8にする)
callTwilio("%E9%9B%BB%E8%A9%B1%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E9%9B%BB%E8%A9%B1%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82")