📝

Amazon Connect の CCP を自動取得する Chrome 拡張機能を作ってみた

に公開

Download and review Amazon Connect Contact Control Panel (CCP) logs - Amazon Connect
現時点では CCP ログを定期的に自動取得する機能は提供されていないため、Chrome 拡張を作ってみました。

概要

  • CCP で 5 分ごとにログを取得
  • ログ取得のために /settings に都度遷移
  • /settings から元のタブに戻る操作は手動

1. 拡張機能のフォルダとファイル作成

ローカル PC 内に任意のフォルダを作成し、以下のファイルを作成します。

  • manifest.json
  • content.js
  • background.js

今回は以下のようなフォルダ構成にしました。

CCP_AutoDownload/
├── manifest.json
├── content.js
├── background.js

2. ファイルの編集

各種ファイルの内容は以下の通りです。
content.js の your-connect-url は自身の Amazon Connect インスタンスの URL に置換します。

manifest.json
manifest.json
{
  "manifest_version": 3,
  "name": "CCP Auto Log Downloader",
  "version": "1.0",
  "description": "CCP ログを 5 分ごとに自動ダウンロード",
  "permissions": ["scripting", "activeTab", "tabs"],
  "host_permissions": ["https://*.my.connect.aws/*"],
  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [
    {
      "matches": ["https://*.my.connect.aws/*"],
      "js": ["content.js"],
      "run_at": "document_end",
      "all_frames": false
    }
  ],
  "action": {
    "default_title": "CCP Auto Log Downloader"
  }
}
content.js
content.js
try {
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.action === "downloadLog") {
      const downloadButton = document.querySelector(
        '[data-testid="ccp-settings-download-logs-button"]'
      );

      if (downloadButton) {
        downloadButton.click();
        sendResponse({
          status: "success",
          message: "ボタンをクリックしました",
        });
      } else {
        sendResponse({ status: "error", message: "ボタンが見つかりません" });
      }
    }

    if (request.action === "navigateToSettings") {
      window.history.pushState(
        null,
        "",
        "your-connect-url/ccp-v2/settings" // 例: https://sample.my.connect.aws/ccp-v2/settings
      );
      window.dispatchEvent(new PopStateEvent("popstate"));
      sendResponse({
        status: "success",
        message: "settings ページへ遷移しました",
      });
    }
  });
} catch (error) {
  console.error(error);
}

background.js
background.js
let isNavigating = false;

setInterval(() => {
  if (isNavigating) return;

  chrome.tabs.query(
    { url: "*://*.my.connect.aws/ccp-v2/settings*" },
    (settingsTabs) => {
      if (settingsTabs.length > 0) {
        chrome.tabs.sendMessage(
          settingsTabs[0].id,
          { action: "downloadLog" },
          (response) => {
            if (chrome.runtime.lastError) {
              console.error(chrome.runtime.lastError.message);
            }
          }
        );
      } else {
        const ccpUrls = [
          "*://*.my.connect.aws/ccp-v2/softphone*",
          "*://*.my.connect.aws/ccp-v2/chat*",
          "*://*.my.connect.aws/ccp-v2/task*",
        ];

        let foundTab = false;

        ccpUrls.forEach((urlPattern) => {
          if (foundTab) return;

          chrome.tabs.query({ url: urlPattern }, (tabs) => {
            if (tabs.length > 0 && !foundTab) {
              foundTab = true;
              isNavigating = true;
              const currentTab = tabs[0];

              chrome.tabs.sendMessage(
                currentTab.id,
                { action: "navigateToSettings" },
                (response) => {
                  if (chrome.runtime.lastError) {
                    console.error(chrome.runtime.lastError.message);
                    isNavigating = false;
                    return;
                  }

                  setTimeout(() => {
                    chrome.tabs.sendMessage(
                      currentTab.id,
                      { action: "downloadLog" },
                      (response) => {
                        if (chrome.runtime.lastError) {
                          console.error(chrome.runtime.lastError.message);
                        }
                        isNavigating = false;
                      }
                    );
                  }, 2000);
                }
              );
            }
          });
        });
      }
    }
  );
}, 300000); // ミリ秒で取得間隔を指定 (デフォルトは 5 分)

3. Chrome で読み込む

Chrome の拡張機能のページから手順 1 で作成したフォルダを読み込みます。

4. 動作確認

Amazon Connect の CCP を開き、5 分程度経過後に CCP ログが自動ダウンロードされれば OK です。

注意点

複数の CCP タブを開いている場合にはエラーが発生する可能性があるため、本拡張機能では複数の CCP タブを開くことを想定していません。
Amazon Connect の CCP ユーザーインターフェイスにおけるエラーのトラブルシューティング | AWS re:Post

複数の CCP が開いている
エージェントが WebSocket 接続を 5 件よりも多く開いている場合、このエラーが発生します。
なお、CCP が WebSocket 接続を開けなかった場合は、"Initialization failed" エラーが引き起こされます。

また、AWS 公式ツールではないので拡張機能の使用は自己責任でお願いします。

まとめ

今回は Amazon Connect の CCP を自動取得する Chrome 拡張機能を作ってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion