最近发现一个开源项目,叫 CloakBrowser。
做过爬虫或自动化的人应该都遇到过这个问题:Cloudflare 拦截、reCAPTCHA 打低分、FingerprintJS 识别出机器人。
市面上的解决方案大多是 JS 注入或者改配置参数,用一段时间就失效了。
CloakBrowser 的思路完全不同。
直接改 Chromium 的 C++ 源码,重新编译成二进制。
不是在浏览器启动后注入 JS 去伪造 navigator.webdriver,也不是靠 --disable-blink-features=AutomationControlled 这种 flag。而是在编译阶段就把指纹信息改掉,包括 canvas、WebGL、音频、字体、GPU、屏幕尺寸、WebRTC、网络时序、CDP 输入行为,一共 57 处补丁。
检测系统看到的是一个"真实的浏览器",因为它本来就是一个真实的浏览器。
测试结果比较直观:
检测项 | 原版 Playwright | CloakBrowser |
|---|---|---|
reCAPTCHA v3 分数 | 0.1(机器人) | 0.9(人类) |
Cloudflare Turnstile | 失败 | 通过 |
FingerprintJS | 被识别 | 通过 |
BrowserScan | 被识别 | 4/4 正常 |
navigator.webdriver | true | false |
UA 字符串 | HeadlessChrome | Chrome/146.0.0.0 |
playwright-stealth、undetected-chromedriver、puppeteer-extra 这类工具的共同问题是:补丁打在表面,检测系统盯的也是表面。
Chrome 每次更新,JS 注入的方式可能就失效了。更麻烦的是,反爬系统已经开始检测"补丁本身",比如某些特定的 JS 覆盖模式、flag 组合,反而成了机器人的特征。
CloakBrowser 的源码级补丁不存在这个问题,因为没有任何运行时注入的痕迹。
这是它最大的优点之一,API 和 Playwright 完全兼容,改一行 import 就够了:
# 之前
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch()
# 之后
from cloakbrowser import launch
browser = launch()
剩下的代码一行不用改。
JavaScript 同样支持:
import { launch } from 'cloakbrowser';
const browser = await launch();
const page = await browser.newPage();
await page.goto('https://protected-site.com');
await browser.close();
安装也很直接:
pip install cloakbrowser
# 或
npm install cloakbrowser playwright-core
第一次运行会自动下载约 200MB 的定制 Chromium 二进制,之后缓存在本地,不需要额外配置。
指纹管理
每次启动会自动生成随机指纹种子,GPU 型号、屏幕尺寸、硬件参数全部自动伪造,每次启动都是一个新身份。
如果需要模拟"回访用户"(对 reCAPTCHA Enterprise 很重要),可以固定种子:
browser = launch(args=["--fingerprint=12345"])
同一个种子每次产生完全一致的指纹,在同一个站点反复访问时不会显得可疑。
人类行为模拟
加一个参数,鼠标移动、键盘输入、滚动行为全部变成人类模式:
browser = launch(humanize=True)
鼠标走贝塞尔曲线、键盘有每个字符的时间间隔、偶尔打错字再自我纠正、滚动有加速和减速过程。
不需要改任何业务代码,底层自动替换。
代理 + 时区自动匹配
这个细节很多人忽略。用了代理但时区还是 UTC、语言还是 en-US,这本身就是机器人信号。
browser = launch(proxy="http://user:pass@proxy:8080", geoip=True)
geoip=True 会通过代理出口 IP 自动检测时区和语言,同时注入 WebRTC IP 防泄漏,一个参数解决三个问题。
持久化 Profile
from cloakbrowser import launch_persistent_context
ctx = launch_persistent_context("./my-profile", headless=False)
Cookie、localStorage、缓存跨会话保留,避免被识别为无痕模式,也能积累浏览历史让 Profile 看起来更真实。
遇到 DataDome、Kasada、Akamai 这类强度更高的反爬系统,推荐的完整配置是:
browser = launch(
proxy="http://your-residential-proxy:port", # 住宅 IP,数据中心 IP 直接被 IP 信誉封掉
geoip=True, # 时区和语言匹配代理出口
headless=False, # 有头模式,部分站点能检测无头
humanize=True, # 人类行为
)
Linux 服务器上还需要额外安装字体包,Kasada 和 Akamai 会在隐藏 canvas 上渲染 emoji 然后对比哈希值,Docker 镜像里已经预装了。
reCAPTCHA 分数低的常见原因
page.wait_for_timeout() 会发送 CDP 命令,reCAPTCHA 能检测到。
换成原生 sleep:
# 有问题的写法
page.wait_for_timeout(3000)
# 正确写法
import time
time.sleep(3)
另外,表单填写用 page.type() 而不是 page.fill(),前者模拟真实键盘事件,后者直接设值,行为分析会发现差异。
和 AI Agent 框架集成
browser-use、Crawl4AI、Scrapling、Stagehand、LangChain 都支持,两种方式:框架直接用 CloakBrowser 的二进制,或者 CloakBrowser 先启动再通过 CDP 连接。
playwright-stealth | Camoufox | CloakBrowser | |
|---|---|---|---|
补丁层级 | JS 注入 | C++(Firefox) | C++(Chromium) |
reCAPTCHA v3 | 0.3-0.5 | 0.7-0.9 | 0.9 |
Playwright API | 原生 | 不支持 | 原生 |
维护状态 | 基本停滞 | 不稳定 | 活跃 |
Camoufox 是最接近的竞品,但基于 Firefox,Playwright 生态的兼容性差一些,而且 2026 年初刚回归,还在 beta 阶段。
目前 GitHub 4300 星,MIT 协议,二进制有单独的许可条款(禁止再分发,但使用免费)。
项目还在活跃维护,最近刚升级到 Chromium 146。
对做数据采集、自动化测试、AI Agent 的人来说,值得关注。