PowerScan
ZH

用本地 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` 中停止配置文件,比看上去重要得多:正常关闭才会把浏览器状态写出,而在会话中途被强行结束的配置文件,可能会丢失刚刚建立的会话。

全部文章 · 开始扫描