以前の記事で、在宅勤務に伴う電話問い合わせの一時休止を解決する方法として、Twilio Studioを利用し個人電話に転送する方法を紹介しました。
今回は別の記事で紹介したGoogleスプレッドシートのシフトデータをもとに転送先となる個人を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は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を自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、営業部までお問い合わせください。
不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで!
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント