2020-05-27に投稿

Googleスプレッドシートのシフト表を使ってTwilio Studioフローの転送先をNode.jsから更新する方法

Header
以前の記事で、在宅勤務に伴う電話問い合わせの一時休止を解決する方法として、Twilio Studioを利用し個人電話に転送する方法を紹介しました。

Twilio Studio - Flow

今回は別の記事で紹介した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 の値として設定します。

AccountSid & AuthToken

次に、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を自社のシステム、ソリューションやパッケージに組み込みたいとお考えの場合は、営業部までお問い合わせください。

このエントリについての問い合わせ

不明点があればぜひ、お問い合わせください。オンライン登壇のご依頼等もこちらまで!

Originally published at www.twilio.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

Neri78

Twilioでデベロッパーエバンジェリストをしています。

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!
ボードとは?

関連記事

コメント