PowerScan
TC

用本機 API 自動化瀏覽器設定檔

自動化 · 閱讀約 8 分鐘 · 作者:PowerOps

圖片:Unsplash

從腳本啟動設定檔、取得偵錯端點,並讓 Playwright 或 Puppeteer 連上一個已經附帶身分與代理的瀏覽器。

自動化防偵測瀏覽器常被說成是個難題。其實不然,前提是工具交給你的是自動化函式庫早就知道怎麼使用的那樣東西:偵錯端點。

整體樣貌

PowerOps 執行一個綁定在迴環位址的 HTTP API。你的腳本請它啟動某個設定檔;它會以該設定檔的身分、儲存與代理啟動瀏覽器,並回傳執行中瀏覽器的 WebSocket 端點。你的腳本再用 Playwright、Puppeteer 或任何支援 DevTools 協定的工具連上該端點。

自動化函式庫完全不需要知道什麼是指紋。等它連上時,環境早已建立完成。

啟動設定檔

curl -s -H "Authorization: Bearer $POWEROPS_API_KEY" \
  http://127.0.0.1:50326/status

除了狀態檢查之外,每個路由都需要 Bearer 金鑰。啟動瀏覽器會回傳要連線的端點:

curl -s -X POST \
  -H "Authorization: Bearer $POWEROPS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"profileId": "..."}' \
  http://127.0.0.1:50326/browser/start

連接你的函式庫

import { chromium } from "playwright";

const res = await fetch("http://127.0.0.1:50326/browser/start", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.POWEROPS_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ profileId }),
});

const { ws } = await res.json();

// The profile's identity, storage and proxy are already in place.
const browser = await chromium.connectOverCDP(ws);
const [context] = browser.contexts();
const page = context.pages()[0] ?? await context.newPage();

await page.goto("https://example.com");

重點在那行註解。你的腳本裡沒有任何指紋設定,因為設定環境不是腳本的工作。它屬於設定檔,不論設定檔是由人點擊某一列開啟,還是由凌晨三點的排程工作開啟,都維持不變。

API 涵蓋的範圍

如何維持僅限本機

一個驅動著登入帳號之瀏覽器的 API,值得交代一下它的邊界。

值得照抄的模式

查詢群組中的設定檔、逐一啟動、完成工作、再停止。一次只跑幾個,而不是全部同時進行。限制在於你自己機器的記憶體,因為每個設定檔都是一個真正的瀏覽器程序。

const { profiles } = await api("/profiles?groupId=" + groupId);

for (const batch of chunk(profiles, 5)) {
  await Promise.all(batch.map(async (profile) => {
    const { ws } = await api("/browser/start", { profileId: profile.id });
    try {
      await doTheWork(ws);
    } finally {
      await api("/browser/stop", { profileId: profile.id });
    }
  }));
}

把停止設定檔放在 `finally` 裡,比看起來更重要:乾淨地關閉才會把瀏覽器狀態寫出,而在工作階段進行中被強制終止的設定檔,可能會失去剛建立的工作階段。

所有文章 · 開始掃描