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

從腳本啟動設定檔、取得偵錯端點,並讓 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,值得交代一下它的邊界。
- 它綁定 127.0.0.1,沒有任何設定能讓它監聽其他網路介面。
- 除了狀態檢查之外,每個路由都需要 Bearer 金鑰。
- 它會驗證 Host 標頭,且不送出任何 CORS 標頭,因此你日常瀏覽器中開著的網頁無法連到它。
- 機密資料只寫不讀:設定檔密碼、雙重驗證密鑰與代理密碼,查詢路由絕不會回傳。
值得照抄的模式
查詢群組中的設定檔、逐一啟動、完成工作、再停止。一次只跑幾個,而不是全部同時進行。限制在於你自己機器的記憶體,因為每個設定檔都是一個真正的瀏覽器程序。
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` 裡,比看起來更重要:乾淨地關閉才會把瀏覽器狀態寫出,而在工作階段進行中被強制終止的設定檔,可能會失去剛建立的工作階段。
