どうもhisayukiです。
よくみたら今月はもう25日なのにブログがまだこれで3記事目・・・・w
ペース遅すぎてやばいなーって思ってます、年間100記事ペースで考えたらかなり遅いw
というわけで、今日はTwilioSDKの所で困った?話しを書いていきたいと思います。
TD;TR
Twilio自体がコードを極力書かなくても出来る仕組みになっている。
出来る限り、Twilio側で出来ることはTwilio側にやってもらいましょう。
やりたいこと
- Webサービスの画面からボタンを押すことで、電話通知ができるようにしたい。
- 画面側はAPIを叩くだけにする。
- POSTで送るのは通知先電話番号と、Twilio側電話番号
こんなところかな?
通知メッセージの文章をどこに持たせるかは決めてないけど、とりあえず仕組み的にはこんな感じで作る。
困ったこと
原因は完全に自分の思い込みだったのですが・・・
TwilioSDKを使うことで、TwiMLをファイルとして指定しなくてもコード上で作ることが出来ます。
例えば今回のようにシステム側から音声通知をしたい場合は
VoiceResponse.Builder()
.say(
Say.Builder("Hallo world").build()
)
.build().toXML()
こんな感じで書くと
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>Hallo world</Say>
</Response>
このXMLがString形式で帰ってきます。
toXML()を使わなければVoiceResponse型のままなので、ここまでコードで書けるんだし通話用のオブジェクト作るときに直接渡せるのかなって思ってました。
でも実際は・・・
渡せなかった/(^o^)\
通話用オブジェクトはCallクラスになるのですが
Call.creator(
com.twilio.type.PhoneNumber("通知先番号"),
com.twilio.type.PhoneNumber("Twilio側番号"),
URI.create("TwiML先のURL") or TwiMLAppのApplicationSid
).create()
直接TwiMLのxmlファイルを指定するか、TwiMLAppsのSIDしか指定できなかった・・・
対処方法
個人的な思い通りに行かなかっただけで、やり方はいくつかあります。
S3とかのストレージにxmlを置く
電話通知で流したい内容をTwiMLとして書いたXMLファイルをどこかに置いておく。
例えばAWSのS3とかに置いて、そこにアクセスできるようにしておけばOK
詳しいやり方はTwilio Docksに書いてあります。
自前でAPIを作る
VoiceResponseでコードベースでTwiMLは作成できるので、それをXML形式で返すAPIを作る。
URI.createでAPIのURLを指定すればOK
TwiML Binを使う
こんな感じでファイルにしなくてもTwilioの画面でTwiMLを作成する。
作成した時点でURLが発行されるので、このURLを指定すればOK!
この時点で”S3とかのストレージにxmlを置く”のやり方はもうしないかな・・・w
TwiML Appsを使う
TwilioのサービスにあるTwiMLAppsを使い、作成したApplicationのSIDを指定する。
利点としてはCallが呼び出すTwiML周りの動作をTwilioのコンソールから指定できるのでURLをApplication内に持たなくてよくなる。
なので、TwiMLをXMLファイルとして持つ場合でも、URLの変更がTwilioのコンソール画面から変更出来たりします。
他にも通話失敗時、ステータス変更時に呼び出すAPIの設定もコンソール画面から指定できます。
直接コードに書くことも出来ますが、TwiMLAppsで設定出来る所は抜き出したほうがコードは綺麗になりますね!
結局どうしたか
TwiML BinとTwiML Appsを使いました。
しかもこれに近いことを去年ハンズオンでやってました/(^o^)\
固定文章を送るのでTwiMLは動的生成じゃなくてもTwiML Binで作成すればよいし、TwiML Appsを使うと画面側からTwiMLでの通話をテストも出来るし。
なんかここまで出来ると、他のサービス使ってAPIにPOSTでTwilio番号と通知先番号、ApplicationSIDさえ渡しちゃえばあとはTwilio側だけでなんとかなるんじゃないかとも思えてくる。
コールバックでの処理はサービス側でAPI作ってそれを呼び出せばいいし、その時APIにはPOSTでTwilio側の情報渡してくれるし。
触れてないですがFunctionとかも用意されているので、Lambdaみたいなこともできそうだしなぁ
可能な限りTwilio側に書いちゃうのもありかなと思えてきた。
まとめ
ちょっと準備不足というか、考えが浅かったですね。
CallオブジェクトにVoiceResponseで作るTwiMLを直接渡せない
完全に失策でした、できるものだと思いこんでたので(;´∀`)
ただ、ブログ書いているうちに少し考えも変わってきて、
Twilio自体がコードを極力書かなくても出来る仕組みになっている。
今回の自動音声通知くらいなら、本当にNoCodeでいけるんじゃないかって思えてきました。
そもそもTwilioSDKを使わずに出来る
コメント