Thursday, 21 May, 2020 UTC


Summary

以前の記事で、在宅勤務に伴う電話問い合わせの一時休止を解決する方法として、Twilio Studioを利用し個人電話に転送する方法を紹介しました。
今回は別の記事で紹介したGoogleスプレッドシートのシフトデータをもとに転送先となる個人をNode.jsで変更する方法を紹介します。
前提条件
  • Twilioアカウントを持っていること(無料トライアルのサインアップ方法)
  • 期間限定の問い合わせ番号となる電話番号を購入していること
    (日本の番号を取得する場合)
  • こちらの記事に則りフローを作成、公開済みであること
  • こちらの記事に則りGoogleスプレッドシートからデータを取得するNode.jsアプリケーションを作成済みであること
Node.jsプロジェクトの作成とパッケージのインストール
以前の記事に沿って作成したNode.jsアプリケーションのフォルダーに移動し、twilio-nodeパッケージをインストールします。
npm i twilio 
次に.envファイルにTwilioへの接続情報やStudioフローのIDを保存する環境変数を追加します。
SPREADSHEET_ID= STAFF_WORKSHEET_ID= SHIFT_WORKSHEET_ID= TWILIO_ACCOUNT_SID= TWILIO_AUTH_TOKEN= TWILIO_STUDIO_FLOW_SID= 
Twilio Studio REST API v2を使ったフローの取得と更新
今回利用するTwilio Studio REST API v2は4月末にパブリックベータとしてアナウンスされたばかりの機能です。この新しいAPIを使って定義済みのフロー設定を外部から更新できます。
Twilioコンソールを開きACCOUNT SIDと、AUTH TOKENをそれぞれ.envファイルの TWILIO_ACCOUNT_SIDならびに TWILIO_STUDIO_FLOW_SID の値として設定します。
次に、Studioコンソールを開き、call forwardingフローのSIDを TWILIO_STUDIO_FLOW_SID の値として設定します。
index.jsを開き、前回の記事でテストに使用したコードを変更します。このコードでは、シフト担当者の電話番号を取得した状態で、Twilio Nodeクライアントを利用しStudioフローを取得します。
loadShiftPhoneNumbers()  .then ( numbers => {  // twilio client  const client = require('twilio')(  process.env.TWILIO_ACCOUNTSID,  process.env.TWILIO_AUTH_TOKEN);   // Studioのフローを取得  client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID)  .fetch()  .then(flow => {   })  .catch(error => console.error(error));  })  .catch( error => console.error(error)); 
フローの定義情報は、definitionというプロパティに保持されているため、そちらを取得します。また、各ウィジェットについては、statesというプロパティに配列として定義されています。このstates配列からウィジェットの名前をキーとして着信を転送するウィジェットを取得し、更に転送先番号を更新します。
loadShiftPhoneNumbers()  .then ( numbers => {  // twilio client  const client = require('twilio')(  process.env.TWILIO_ACCOUNTSID,  process.env.TWILIO_AUTH_TOKEN);   // Studioのフローを取得  client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID)  .fetch()  .then(flow => {  // フローの定義を取得  let definition = flow.definition;  // forward_callウィジェットを取得  let callForwardWidget = definition.states.find(  item => item.name == 'forward_call');  // 転送先番号をシフトの電話番号で更新  callForwardWidget.properties.to = numbers;  })  .catch(error => console.error(error));  })  .catch( error => console.error(error)); 
後は更新した定義をStudio REST API v2を使い、反映させます。この際、statusプロパティで反映したフローを下書き状態(draft)にしておくことも、即座に公開(published)にすることもできます。
loadShiftPhoneNumbers()  .then ( numbers => {  // 省略twilio client  const client = require('twilio')(  process.env.TWILIO_ACCOUNTSID,  process.env.TWILIO_AUTH_TOKEN);   // Studioのフローを取得  client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID)  .fetch()  .then(flow => {  // フローの定義を取得  let definition = flow.definition;  // forward_callウィジェットを取得  let callForwardWidget = definition.states.find(  item => item.name == 'forward_call');  // 転送先番号をシフトの電話番号で更新  callForwardWidget.properties.to = numbers;   // 更新した定義を反映し、即座に公開  client.studio.flows(process.env.TWILIO_STUDIO_FLOW_SID)  .update({  definition: definition,  commitMessage: 'シフトの更新 - 2020/05/15',  status: 'published'  })  .then(res => console.log(res))  .catch(error => console.error(error));  })  .catch(error => console.error(error));  })  .catch( error => console.error(error)); 
index.jsを実行し、ログにエラーが含まれていないこと、Studioのフローが実際に変更されていることを確認しましょう。
node index.js 
まとめ
ご覧いただいたように、パブリックベータとして公開されたREST API v2を活用することで、外部のデータやシステムと連携した上でTwilio Studioのフローを更新することができるようになりました。非常に強力なAPIなので、ぜひご活用ください。
今回のサンプルはこちらのGitHubリポジトリからクローンし、環境変数にそれぞれ値を設定することで確認することも可能です。
新型コロナウイルス感染症への支援策について
Twilioでは新型コロナウィルス感染症により引き起こされるさまざまな社会問題を解決する会社、団体、開発者グループに向けて無料クレジットの進呈など支援を行なっています。詳しくはこちらの記事をご覧ください。
また、Twilioを自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、営業部までお問い合わせください。
このエントリについての問い合わせ
不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで!
  • Twitter (@Neri78)
  • Email: [email protected]
  • Github: https://github.com/neri78
  • Twitch: https://twitch.tv/neri78