https://www.twilio.com/docs/usage/webhooks
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say>Thanks for calling!</Say> </Response>
以上の処理を如何に実現するかという点がユーザ側の検討事項
自前でWebサーバを用意せずともTwilioだけで完結できるツールも用意されている
一方で柔軟にXMLの指示書(TwiML)を作りこみたい場合などは自前のWebサーバをWebhookに指定することも可能
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://help.twilio.com/articles/4406158662171
https://qiita.com/mobilebiz/items/83eba66e7ed9ca339501
日本の電話番号を利用するには必要書類を提出して審査を受ける必要がある
日本の電話番号を運用する場合でもサーバはアメリカになる
https://www.twilio.com/docs/serverless
自前でWebサーバを用意せずともTwilioだけで完結できるツールの代表格が以下の3つ:
https://www.twilio.com/docs/studio
Twilioのシステム上でブロック図によりアルゴリズムを組むノーコードのWebアプリ
音声案内や電話転送、内線番号による条件分岐など汎用的なアルゴリズムが用意されている
作成したアルゴリズムを用意した電話番号にWebhookとして紐づけることで使用可能
https://www.twilio.com/docs/studio/widget-library/connect-call
https://www.twilio.com/docs/serverless/twiml-bins
XMLの指示書(TwiML)をTwilioのシステム上にそのまま置いてWebhookを作る方法
アルゴリズムは組めないため複雑なTwiMLを作りたい場合は後述するFunctionsか自前のサーバを用意する必要がある
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:"}}
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); };
https://www.twilio.com/docs/voice
音声通話に対するAPI群はVoice(もしくはProgrammable Voice)と呼ばれている
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を指定する事も可能
着信のみなら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から確認が可能
https://en.wikipedia.org/wiki/Comparison_of_VoIP_software
SIP Endpointの用意が出来ていればVoIP SIP Softphoneによるアプリ運用も可能になる
Windowsによる試験用候補:
iPhoneによる実運用候補:
暗号化や通信方式の設定などクライアント側の問題で繋がらなくなることもあるので注意
携帯による実運用の場合は有料版でないと着信時にPush通知されない(=実運用上は使い物にならない)ケースが多いので注意
Programmable Faxは2021年12月17日にサービス終了
SIP+VoIPアダプタでFAX送受信:
https://qiita.com/takeshifurusato/items/a8744101eb2d3870499b
https://note.com/sqm/n/n37a47a4a3c50
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