はじめに
開発コンテストに応募するに辺り、割とギリギリまでアイディアを考えていることも多く、チームを組んでコンテストに挑むわけではないので、構造をシンプルに実装できる箇所はシンプルにしたいと、常に思っています。
私が作ったTwilioを活用した作品は以下の二つあります。
これらはいずれも、アイディアを実現しながらもTwilio側の実装をシンプルを追求した作品となっています
電話をかけたり、電話をかけた結果を知る機能って共通化したくないですか?
作っているうちに、別々の機能なんだけど、電話をかけて、電話をかけた結果で別の処理をしたいというケースがありました。
実は、自分が作った「電言」という作品でそのようなニーズがありました。
お客様にTwilioの番号を払い出し、払い出した番号でお客様を特定したり、管理するユニークなIDとしたかったため、基本的にはお客様1人に対して1つの番号で運用する必要がありました。
体温を元に、ユーザにフォローの電話をかけたり、
ボタンを押して、助けを求めるために会社に電話したり、
心拍数、血中酸素濃度の状況に応じにて、ユーザーにフォローの電話をかけたり・・・
つまり、これらは別々の機能でも、電話をかける、応答結果を返す、というところは共通化したいと思っていました。
できれば、ノーコードに近いくらいで作れるTwilio Studioで!
共通化すると、Make HTTP Requestで困る
当然といえば、当然ですが、電話を発信する要求に対して、その結果をHTTP RequestでTwilio Studioから対象の機能にCallbackすることになるため、Twilio Studioを共通的に利用すると、結果を戻す先に困りますよね。しかも、機能が全く別なのであれば。
何か手はないか・・・と考えたときに、MAKE HTTP REQUESTのHttp Parametersに設定できるVALUEに着目しました。
{{flow.data.xxx}}と書いておくことにより、REST APIで外部のクラウドからTwilio StudioのAPIを起動した時にセットした変数をそのままMake HTTP Requestで送り返せるのです。
つまり、呼び出す時にどの機能から呼ばれたかを判別するためにTwilio StudioのREST APIで変数を受け取り、電話発信後の応答のMake HTTP Requestにそのまま設定された変数をお返しすることで、呼び出し元の機能で、どの機能の電話応答がどうだったか?という条件分岐が作れるのだ!
発信先の電話番号、発信元の電話番号、自動応答のメッセージを共通化する
これは、赤い芸人さんこと、高橋さんも解説されている内容だったため、細かいところは割愛しますが、応答まで共通化できたら、発信先の電話番号、発信元の電話番号、自動応答のメッセージまで、共通的に実装できます。
この作品では、Node-red側でほとんど実装していますが、
https://protopedia.net/prototype/2557
Functionに定義するだけになっています。
From、toのパラメータに発信元、発信先の電話番号を設定するだけです。
メッセージは今回、機能毎にflowを作っているので固定にしてますが、ここもデータベースから取得して動的に変更できる箇所です。メッセージを書いておくだけで、自動音声で話してくれます
SAY/PLAYに{{flow.data.message}}と書いておけば良いのです。そうすると↑で設定されたメッセージを喋ってくれます
最終的には、たったこれだけのTwilio Studioの定義だけで、いろんなデバイスからの電話要求、応答の処理などを共通的に処理できるようになるのです。
他の部分の実装については、ProtoPediaを見ていただけると嬉しいです