Twilio Flexで特定の担当者に直接繋ぐ方法

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズの Twilioエバンジェリストの高橋です。

[Twilio Flex Advent Calendar 2021](https://qiita.com/advent-calendar/2021/twilio-flex) 11日目の記事となります。
[前回](https://qiita.com/mobilebiz/items/d64f6414a1acda4085eb)までの記事で、ACDの基本的な設定方法について解説をしました。本記事では、ACDに関するTipsの一つとして「特定の担当者に直接つなぐ方法」について説明していきます。
なお、本記事で利用しているのは、[Known Agent Routing](https://www.twilio.com/docs/taskrouter/workflow-configuration/known-agent-routing)というパブリックベータの機能となります。

# シナリオ

今回のシナリオは以下の通りです。

- 発信者の電話番号をDBと突合し、ユーザーを特定する。
- ユーザーが未登録の場合は通常のACDとして処理し、待受時間の長いオペレーターが対応する。
- ユーザーが登録されているが、担当者がアサインされていない場合は、上記と同様とする。
- ユーザーが登録されていて、かつ担当者がアサインされている場合は、優先的に担当者に振り分ける。
- 担当者が待受状態ではない場合は、一定時間は待ち呼としてキューイングするが、それでも対応できない場合は通常のACDと同様に別のオペレーターが対応する。

DBには、[こちらの記事](https://qiita.com/mobilebiz/items/916b416af155bdab988b)で使ったものと同様のGoogleSpreadsheetを利用します。

# 具体的なACDの実装

## GoogleSpreadSheetの準備

今回のシナリオを実装するため、GoogleSpreadsheetは以下のように設定しておきます。シート名は`sheet1`にしてください。

![スクリーンショット 2021-12-20 7.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b0d441b9-d63a-23ea-ad51-999b60631467.png)

３列目に担当者を作成し、ここに担当者（ワーカー）のSIDを入れておきます。ワーカーのSIDは、TaskRouterのWorkerで確認することができます。

![スクリーンショット 2021-12-20 7.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b393f3a5-94c3-4967-b30c-f5f5234dfc6a.png)

## ワークフローの設定

今回は、以下のようなワークフローを新規に作成します。名前は「ByName」にしておきましょう。

![スクリーンショット 2021-12-20 9.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/aa98e16b-4130-0732-76a9-362fcce9d268.png)

- フィルター名は「ByName」にします。
- **MATCHING TASKS**に「`worker_sid != ""`」と指定します。これは、「タスクの`worker_sid`になにか値が指定された場合にこのフィルターを有効にする」という意味になります。
- **MATCHING WORKERS**の**TASK QUEUE**は、デフォルトの「Everyone」のままにします。Everyoneタスクキューには、指名される担当者（ワーカー）が含まれている必要があります。
- **KNOWN WORKER**のチェックボックスは、「Worker SID」を選び、その下の枠内には「`task.worker_sid`」を指定します。
- **SKIP TIMEOUT**は、デフォルトの「Do not skip」 を選択しておきます。このようにしておくことで、指定された担当者が別の対応をしている場合に、一定時間コールが待ち呼になり、担当者が空いた時点で自動的につながるようになります。ここを「`1==1`」にすると、担当者が出られない場合はすぐに別の担当者に振り分けされます。
- **TIMEOUT**には、任意の時間を入れておきます。今回は「10」と入れましたので、担当者が応答的ない場合は、10秒間は待ち呼となった後、次のステップに遷移します。
- ステップは２つ作っておき、担当者が対応できない場合のタイムアウトを拾うようにしておきます。
- **DEFAULT TASK QUEUE**は「Everyone」にしておきます。これにより、フィルターに合致しないコールは通常のACDとして動作します。

ここでのポイントは、`task.worker_sid`です。すなわち、タスクの属性として`worker_sid`というパラメーターを設定することで、振り分ける担当者を指定できるということです。

## GoogleSpreadsheetを検索する

今回は、以下のようなFunctionを作成しました。Functionの作成方法については、以前の記事を参考にしてください。
[Twilio Flexの始め方（GoogleSpreadsheet連携編）](https://qiita.com/mobilebiz/items/916b416af155bdab988b)
Functionsを**Protected**として作成しておくことで、外部からの不正なアクセスを防止します。

![スクリーンショット 2021-12-20 8.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/159d2083-2d31-0dcb-1b03-e2828ee9d0c9.png)

コード部分を抜き出すとこんな感じです。

```javascript
const SteinStore = require('stein-js-client');

exports.handler = async function(context, event, callback) {
  try {
    const number = event.From.replace(/\+81/, '0'); // E.164->0ABJ
    const store = new SteinStore(context.STEIN_API);
    const data = await store.read("sheet1", { search: { '電話番号': number }});
    console.log(`data: ${data}`);
    return callback(null, data.length > 0 ? data[0] : {'顧客名': number, '担当者': null});
  } catch(err) {
    console.error(`ERROR: ${err}`);
    return callback(err);
  }
};
```

Google Spreadsheetの内容をAPIとして取得することができる[stein](https://steinhq.com/)を利用します。シート上の電話番号が0ABJで格納されているので、検索するためにE.164に変換しています。
該当データが登録されていない場合は、顧客名に電話番号、担当者はnullを返却します。

## Studioフロー

今回は、新しく以下のようなフローを作成しました。
![スクリーンショット 2021-12-20 8.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/0f777f00-0286-fb45-e836-d42bb6c648c3.png)

ウィジェットは２つだけのシンプルなフローになります。

まずは、先程作成したFunctionを呼びだすウィジェットです。

![スクリーンショット 2021-12-20 8.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/509880c9-39ba-ab11-31dd-69f04fa6b88d.png)

Functionの呼び出しに、パラメーターとして`From`を渡しています。パラメーターの値には、`{{trigger.call.From}}`と指定することで、発信者番号がE.164形式で渡されるようになります。

次に、TaskRouterを呼び出すウィジェットです。

![スクリーンショット 2021-12-20 8.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/dd275738-2d2b-cd75-e413-a088dc982e34.png)

**WORKFLOW**に、先程作成したワークフローを指定します。
さらに、**ATTRIBUTES**には、Functionで取得した`担当者`と`顧客名`をそれぞれ`worker_sid`と`name`パラメーターとして指定しています。

設定が終わったら、最後にパブリッシュするのを忘れないようにしましょう。

## 着信番号の指定

最後に、今作成したStudioフローを電話番号に割り当てます。

![スクリーンショット 2021-12-20 8.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/fe2678df-8696-a48d-0f88-a10b1a33efb8.png)

以上で設定はすべて終了です。

# テスト

今回のシナリオをテストするためには、同時に複数名でFlexにログインしておく必要があります。
Chromeブラウザと、Chromeブラウザ（シークレットモード）、BraveブラウザとBraveブラウザ（シークレットモード）の４つでテストすることにします。

![スクリーンショット 2021-12-17 16.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/afe57dc2-95de-597a-96af-19f2d468a4f0.png)

全員を「Available」にしておくことを忘れないようにしましょう。

## テスト① 担当者がアサインされている番号から発信

- GoogleSpreadsheet上に、担当者をアサインした電話番号から発信します。
- アサインされている担当者に着信することを確認します。
- 何度か発信をして、常に担当者が着信することを確認します。

## テスト② 担当者が取り込み中

- 対象の担当者のステータスを**Available以外**にしておきます。それ以外のオペレーターはAvailableにしておきます。
- 担当者がアサインされている電話番号から発信します。
- コールが待ち呼に入り、音楽が流れます。
- 担当者をAvailableに戻すと、担当者に着信が回ってくることを確認します。

## テスト③ 別のオペレーターにエスカレーション

- テスト②と同じように、コールを待ち呼に入れます。
- 担当者はそのままAvailableにせずに放置します。
- 10秒くらい待ち呼になったあと、別のオペレーターに着呼することを確認します。

## テスト④　GoogleSpreadsheetに番号がない、もしくは担当者がアサインされていない

- GoogleSpreadsheet上に登録されていない番号から発信します。
- オペレーターの誰かが着呼します（発信者番号が顧客名になります）。
- GoogleSpreadsheet上に登録されているが、担当者が空欄の番号から発信します。
- オペレーターの誰かが着呼します（顧客名が表示されます）。

# まとめ

今回は、予め着信させたいオペレーターが決まっているようなケースでのワークフローの作成方法について解説しました。なお、冒頭に記載したように、[Known Agent Routing](https://www.twilio.com/docs/taskrouter/workflow-configuration/known-agent-routing)はパブリックベータの機能となりますので、今後仕様が変わる可能性があることをご了承ください。

★次の記事
[Twilio Flexで誰も応答できない場合の処理](https://qiita.com/mobilebiz/items/a28deca13b98a99c0ede)

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilio は音声通話、メッセージング（SMS /チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウド API サービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。

自己紹介|　
:--|:--
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b51a8b88-abd5-ce5e-195a-de3564ba2ae6.png" height='200' width='150'/>|高橋克己（Katsumi Takahashi） 自称「<font color='red'>赤い芸人</font>」<br />グローバル・インターネット・ジャパン株式会社　代表取締役<br />株式会社KDDIウェブコミュニケーションズ　Twilio事業部エバンジェリスト<br /><br />2001年より大手通信事業者の法人サービスの教育に携わり、企業における電話のしくみや重要性を研究。2016年よりTwilio事業部にジョインし、Twilioを使ったスマートコミュニケーションの普及活動を精力的に行っている。<br />2015 Hall of Doers<br />2019 Twilio Champions