Twilio
Basics
https://www.twilio.com/docs/usage/webhooks
- 電話の着信など処理したいイベントに対してあらかじめURLを紐づけておく = Webhook
- 実際にイベントが起こると紐づけされたURLにTwilioが自動でHTTPリクエスト(POST or GET)を投げる
- HTTPレスポンスとして実行したい処理(以下サンプル)を記述したXMLの指示書(TwiML)が返る形にしておく
- Twilioが受け取った指示書に従い処理を実行する
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say>Thanks for calling!</Say> </Response>
以上の処理を如何に実現するかという点がユーザ側の検討事項
自前でWebサーバを用意せずともTwilioだけで完結できるツールも用意されている
一方で柔軟にXMLの指示書(TwiML)を作りこみたい場合などは自前のWebサーバをWebhookに指定することも可能
Security
https://www.twilio.com/docs/usage/security
https://www.twilio.com/docs/usage/webhooks/webhooks-security
https://www.twilio.com/docs/serverless/functions-assets/quickstart/basic-auth
特に電話の着信のような不特定多数からトリガされるイベントに対して指示書の内容が漏れるのは極めて危険
自前のWebサーバにWebhookを設定する場合は以下のセキュリティ対策を施す:
- HTTPS/TLS
- 署名検証
- IP制限
- Basic認証
- URL難読化
Regulatory Bundle
https://help.twilio.com/articles/4406158662171
https://qiita.com/mobilebiz/items/83eba66e7ed9ca339501
日本の電話番号を利用するには必要書類を提出して審査を受ける必要がある
日本の電話番号を運用する場合でもサーバはアメリカになる
Serverless Solutions
https://www.twilio.com/docs/serverless
自前でWebサーバを用意せずともTwilioだけで完結できるツールの代表格が以下の3つ:
- Studio
- TwiML Bins
- Functions
Studio
https://www.twilio.com/docs/studio
Twilioのシステム上でブロック図によりアルゴリズムを組むノーコードのWebアプリ
音声案内や電話転送、内線番号による条件分岐など汎用的なアルゴリズムが用意されている
作成したアルゴリズムを用意した電話番号にWebhookとして紐づけることで使用可能
Information - Connect Call To
https://www.twilio.com/docs/studio/widget-library/connect-call
- Caller ID = {{contact.channel.address}}
- Connect Call Toにおける初期設定
- Single Numberで日本の電話に転送する場合は発信者番号通知に対応しておらず多くのケースで非通知になる
- SIP Endpointに転送する場合は正しい発信元が表示される
- Caller ID = {{flow.channel.address}}
- Twilioで使用している自分の番号を発信元の番号として転送する
- Single Numberで日本の電話に転送する場合は全て自分の番号からの着信になるためTwilio経由で転送されていることは判別可能
TwiML Bins
https://www.twilio.com/docs/serverless/twiml-bins
XMLの指示書(TwiML)をTwilioのシステム上にそのまま置いてWebhookを作る方法
アルゴリズムは組めないため複雑なTwiMLを作りたい場合は後述するFunctionsか自前のサーバを用意する必要がある
Troubleshooting - Your Mustache Template is Invalid
https://mustache.github.io/
https://help.twilio.com/articles/230878368-How-to-use-templates-with-TwiML-Bins
変数の記述にはMustache Templatesというものが採用されている
類似するLiquid Templatesなら可能な以下の様な記述はTwiMLでは非対応
{{To | split:"@" | first | remove:"sip:"}}
Functions
https://www.twilio.com/docs/serverless/functions-assets
https://www.twilio.com/ja-jp/blog/start-serverless-development-twilio-function-jp
https://help.twilio.com/articles/115007737928
Node.jsの自作関数をTwilioのシステム上で実行してWebhookを作る方法
TwiML Binsよりも複雑なTwiMLがサーバレスで構築可能
関数の公開設定をProtectedにすればTwilio外部から参照できなくなる+セキュリティ対策は関数に仕込む形で安全を担保する
SIPから番号を抜き出してPSTNに発信する場合のサンプルコード:
exports.handler = function(context, event, callback) { const CALLERID = context.CALLERID; const twiml = new Twilio.twiml.VoiceResponse(); const toNumber = ((event.To || '').toLowerCase().replace(/^sip:/, '').split('@')[0]); twiml.dial({callerId:CALLERID}, toNumber); return callback(null, twiml); };
Voice
https://www.twilio.com/docs/voice
音声通話に対するAPI群はVoice(もしくはProgrammable Voice)と呼ばれている
SIP (Session Initiation Protocol)
https://www.twilio.com/docs/voice/api/sip-interface
https://qiita.com/moroshi/items/44b71dd2843350813b94
SIP Domainと付随したEndpointを設定すれば電話番号ではなくアカウントによるログインベースでのVoIPが可能 > 多様なアプリが使用可能
有効にするにはTwilioの設定画面上でSIP RegistrationをEnabledにする必要がある
アカウントのパスワードに使用可能な記号は限られているので注意
StudioのConnect Call Toなどで転送先に電話番号(Single Number)ではなくSIP Endpointを指定する事も可能
Information - Dial Webhook
着信のみならTwilioの設定で対応可能だがクライアントから発信も行う場合は以下の様なWebhookを用意する必要がある:
<?xml version="1.0" encoding="UTF-8"?> <Response> <Dial callerId="+81XXXXXXXXXX"> <Number>{{To}}</Number> </Dial> </Response>
このときクライアントからのHTTPリクエスト時の{{To}}にはsip:+81XXXXXXXXXX@yourdomain.sip.twilio.comの様にドメイン込みの情報が入る(環境依存?)
その場合は発信したい電話番号に相当する+81XXXXXXXXXXの部分だけを抜き出してXMLを出力しないとエラーになる
## Python Sample: match = re.search(r'sip:(\+\d{8,15})@', to)
エラーの内容はTwilioのConsole > Monitor > Logs > Errors > Error Logsから確認が可能
VoIP Clients
https://en.wikipedia.org/wiki/Comparison_of_VoIP_software
SIP Endpointの用意が出来ていればVoIP SIP Softphoneによるアプリ運用も可能になる
Windowsによる試験用候補:
- MicroSIP: https://www.microsip.org/
- シンプルなUIでSIP運用全般の初期試験に推奨
- 暗号化方式の適合性によりMedia EncryptionをOptionalにしないと着信に失敗する一方でMandatoryにしないと発信に失敗する場合がある
iPhoneによる実運用候補:
- Zoiper: https://www.zoiper.com/
- 無料版があり携帯側の初期試験に重宝
- 有償版(買い切り)でないと着信時のPush通知に非対応
- Acrobits: https://acrobits.net/
- 有償版(買い切り)のみだが高い安定性で少人数の実運用における第一候補
- 廉価版のSIP Softphoneと上位モデルのGroundwire
- CounterPath(Bria): https://www.counterpath.com/bria-mobile/
- 有償版(月額課金)でチーム管理やPC運用も含めた総合環境
- 企業の一括導入などにおける候補
暗号化や通信方式の設定などクライアント側の問題で繋がらなくなることもあるので注意
携帯による実運用の場合は有料版でないと着信時にPush通知されない(=実運用上は使い物にならない)ケースが多いので注意
FAX
Programmable Faxは2021年12月17日にサービス終了
SIP+VoIPアダプタでFAX送受信:
https://qiita.com/takeshifurusato/items/a8744101eb2d3870499b
https://note.com/sqm/n/n37a47a4a3c50
References
Twilio
https://www.twilio.com/
https://www.twilio.com/ja-jp/blog/call-forwarding-studio-remote-work
https://qiita.com/mobilebiz
https://qiita.com/kuwazzy/items/600a6d6beca4378d0b3d
https://note.com/sqm/m/mb859b0719ee9
https://dev.classmethod.jp/tags/twilio/
https://dev.classmethod.jp/articles/subaru-twilio8/
https://blog.dksg.jp/2022/06/twilio0120.html
Acknowledgments
Daiphys is a professional services company in research and development of leading-edge technologies in science and engineering.
Get started accelerating your business through our deep expertise in R&D with AI, quantum computing, and space development; please get in touch with Daiphys today!
Daiphys Technologies LLC - https://www.daiphys.com/