CloakBrowser 实测:源码级反指纹浏览器到底能过几道关
上周五跑爬虫采集数据,Playwright 脚本在 Cloudflare 面前吃了闭门羹。换了 playwright-stealth 插件,管了两天又失效。于是翻了一圈 GitHub Trending,发现了 CloakBrowser------一个直接改 Chromium C++ 源码来做反指纹的项目。20k star,一周涨了 6800+。
听起来很猛,但到底是真东西还是 star 泡沫?我花了一个周末把它跑了个遍。
传统方案为什么总被抓
先说清楚问题在哪。
浏览器自动化被检测,核心原因是 Playwright/Puppeteer 启动的 Chromium 带了太多"我是机器人"的标记。最典型的几个:
javascript
// 普通 Playwright 启动后
navigator.webdriver // true → 红牌
navigator.plugins.length // 0 → 正常浏览器有 5 个
window.chrome // undefined → 真 Chrome 一定有
现有的反检测方案分两派:
JS 注入派 (playwright-stealth、puppeteer-extra-plugin-stealth):通过 JavaScript 覆盖浏览器 API 返回值。问题是------检测方也会用 JS 来验证这些覆盖是否一致。你改了 navigator.webdriver,人家查 Object.getOwnPropertyDescriptor,发现是后注入的,照样标红。
配置修改派(undetected-chromedriver):改 Chrome 启动参数和二进制签名。问题是------每次 Chrome 大版本更新都可能失效,而且这类工具最近两年几乎停更了。
两派的共同弱点:改的都是表层,底下的 C++ 层暴露的信息没动。
CloakBrowser 怎么做的
CloakBrowser 选了一条更重的路:直接 fork Chromium 源码,在 C++ 层修改了 58 个位置。
这意味着 navigator.webdriver 不是被 JS 覆盖成 false,而是 Chromium 编译出来就是 false。检测脚本用什么手段查都查不出异常,因为它确实就是个"正常"的 Chrome。
改了哪些东西?我翻了它的 CHANGELOG,大致分这几类:
| 类别 | 具体修改 | 影响 |
|---|---|---|
| 画布渲染 | Canvas 2D / WebGL 指纹随机化 | 绕过 FingerprintJS |
| 音频 | AudioContext 采样值微调 | 绕过音频指纹 |
| GPU/显卡 | GPU 厂商和渲染器信息匹配真机 | 绕过 WebGL 指纹 |
| 网络层 | TLS 指纹(ja3/ja4)对齐真 Chrome | 绕过服务端 TLS 检测 |
| 屏幕 | 分辨率和色深匹配常见设备 | 绕过设备指纹 |
| 自动化信号 | webdriver/CDP 标记全部清除 | 绕过基础检测 |
| WebRTC | ICE candidate IP 伪装 | 防 IP 泄露 |
编译好的二进制通过 pip/npm 安装时自动下载,大约 200MB。首次启动会缓存在本地。
装起来跑一下
安装很简单:
bash
pip install cloakbrowser
或者 Node.js:
bash
npm install cloakbrowser playwright-core
写个最基础的脚本:
python
from cloakbrowser import launch
browser = launch(headless=False)
page = browser.new_page()
# 先看看基础指标
result = page.evaluate("""() => ({
webdriver: navigator.webdriver,
plugins: navigator.plugins.length,
chrome: typeof window.chrome,
languages: navigator.languages
})""")
print(result)
# {'webdriver': False, 'plugins': 5, 'chrome': 'object', 'languages': ['en-US', 'en']}
page.goto("https://bot.incolumitas.com/")
page.wait_for_timeout(5000)
page.screenshot(path="bot_test.png")
browser.close()
对比一下普通 Playwright:
python
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
page = browser.new_page()
result = page.evaluate("""() => ({
webdriver: navigator.webdriver,
plugins: navigator.plugins.length,
chrome: typeof window.chrome
})""")
print(result)
# {'webdriver': True, 'plugins': 0, 'chrome': 'undefined'}
browser.close()
pw.stop()
差别很明显。
实际检测站点跑分
光看 navigator 属性不够,得拿真实的检测站点试。我跑了 5 个:
1. reCAPTCHA v3 评分
reCAPTCHA v3 不弹验证码,而是在后台给你打分,0-1 分,0.9 以上算人类。
python
from cloakbrowser import launch
browser = launch(humanize=True) # 开启人类行为模拟
page = browser.new_page()
page.goto("https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php")
page.click("button#recaptcha-action-one")
page.wait_for_timeout(3000)
score = page.text_content(".score")
print(f"reCAPTCHA v3 score: {score}")
# 实测: 0.9
browser.close()
普通 Playwright 跑同一个页面,得分 0.1。
2. Cloudflare Turnstile
这是现在用得最多的验证方案。CloakBrowser 的 humanize 模式可以自动通过非交互式挑战,managed 挑战需要模拟一次点击。
python
browser = launch(humanize=True, headless=False)
page = browser.new_page()
page.goto("https://challenges.cloudflare.com/turnstile/demo")
page.wait_for_timeout(8000)
# 非交互式: 自动通过
# managed: 需要点击复选框
Playwright 直接被拦,显示"请验证您是人类"的死循环。
3. BrowserScan
browserscan.net 做 4 项检测:Bot Detection、Browser Fingerprint、WebRTC Leak、IP Address。CloakBrowser 拿到 4/4 NORMAL。
4. FingerprintJS
demo.fingerprint.com 的反爬虫检测也过了。普通 Playwright 秒标记为 bot。
这是检测最严格的一个站点,测 24 项指标。普通 Playwright 失败 13 项,CloakBrowser 只失败 1 项(WebDriver spec 标准接口,这个改不掉也没啥影响)。
humanize 模式值得单独说
CloakBrowser 有个 humanize=True 参数,开了以后鼠标移动走贝塞尔曲线,键盘输入有随机延迟,滚动行为模拟真人习惯。
python
browser = launch(humanize=True, human_preset="careful")
page = browser.new_page()
page.goto("https://example.com/login")
# 输入会自动带随机延迟,每个字符间隔不同
page.fill("#username", "test@example.com")
page.fill("#password", "mypassword")
# 点击走贝塞尔曲线,不是瞬移
page.click("#submit")
还可以对单次操作单独配置:
python
# 只在这次点击用 humanize
page.click("#button", human_config={"speed": "slow"})
deviceandbrowserinfo.com 的行为检测,开了 humanize 后 24/24 全过,判定 "You are human!"。
代理和指纹联动
爬虫场景经常用代理 IP。CloakBrowser 有个 geoip 功能,根据代理出口 IP 自动设置时区和语言:
python
browser = launch(
proxy="socks5://user:pass@proxy:1080",
geoip=True # 自动根据出口IP设置timezone/locale
)
这解决了一个常见问题:你用了美国 IP,但浏览器时区显示 Asia/Shanghai,这种矛盾直接暴露代理。
还支持 WebRTC IP 伪装,防止通过 WebRTC 泄露真实 IP:
python
browser = launch(
proxy="http://proxy:8080",
args=["--fingerprint-webrtc-ip=auto"] # 自动匹配代理出口IP
)
持久化 Profile
有些网站检测"空白"浏览器配置------没有 Cookie、没有浏览历史、没有缓存。CloakBrowser 支持持久化 profile:
python
from cloakbrowser import launch_persistent_context
# 第一次运行:创建 profile
ctx = launch_persistent_context("./my-profile", headless=False)
page = ctx.new_page()
page.goto("https://target-site.com")
# 登录操作...
ctx.close() # profile 自动保存
# 第二次运行:Cookie 和 localStorage 还在
ctx = launch_persistent_context("./my-profile", headless=False)
page = ctx.new_page()
page.goto("https://target-site.com")
# 已经是登录状态
这比每次都走登录流程要安全得多,因为频繁登录本身也是异常行为。
踩过的坑
-
首次下载二进制慢。200MB 的 Chromium 二进制从 GitHub 下载,国内网络可能要挂代理。下完之后就缓存了,后续启动秒开。
-
headless 模式和 headed 模式行为不完全一致。部分检测站点在 headless 下仍然能检测到差异(主要是渲染管线)。高防站建议用 headed 模式配合 Xvfb 跑。
-
和 playwright-stealth 不要混用。CloakBrowser 已经在 C++ 层做了反检测,再叠 JS 注入反而可能产生指纹矛盾,被检测到"这个浏览器做了双重伪装"。
-
Docker 里跑需要 GPU 相关参数。不然 WebGL 指纹会暴露虚拟环境:
bash
docker run --rm \
--shm-size=2g \
cloakhq/cloakbrowser cloaktest
- geoip=True 会通过代理发 HTTP 请求解析 IP。如果代理有流量计费或限速,注意这一点。可以手动指定:
python
browser = launch(
proxy="http://proxy:8080",
timezone="America/New_York",
locale="en-US"
)
和同类工具对比
| 特性 | Playwright | playwright-stealth | undetected-chromedriver | Camoufox | CloakBrowser |
|---|---|---|---|---|---|
| reCAPTCHA v3 | 0.1 | 0.3-0.5 | 0.3-0.7 | 0.7-0.9 | 0.9 |
| Cloudflare | 失败 | 偶尔通过 | 偶尔通过 | 通过 | 通过 |
| 修改层级 | 无 | JS 注入 | 配置修改 | C++(Firefox) | C++(Chromium) |
| Chrome 更新后是否失效 | - | 经常 | 经常 | 偶尔 | 偶尔 |
| 维护状态 | 活跃 | 停更 | 停更 | 不稳定 | 活跃 |
| API 兼容 | - | Playwright | Selenium | 自有 | Playwright |
Camoufox 是另一个 C++ 级方案,但它改的是 Firefox,用自己的 API。CloakBrowser 改的是 Chromium,直接兼容 Playwright API,迁移成本低------改一行 import 就行。
几个注意事项
CloakBrowser 解决的是"不被识别为机器人",但它不解决以下问题:
- 不会自动过验证码。Turnstile 非交互式可以自动过,但真正需要图像识别的验证码还是要接第三方服务。
- 不包含代理池。需要自己准备代理。
- 不保证永远不被检测。反检测和检测是对抗博弈,没有永久方案。
用在什么场景合适?数据采集、自动化测试、竞品监控、价格监测这些合法场景。拿去做灰产的别看这篇文章。
总结
CloakBrowser 从 Chromium 源码层面做反检测,不走 JS 注入和配置修改的老路。实测下来比 playwright-stealth 和 undetected-chromedriver 强不少,特别是 Cloudflare 和 reCAPTCHA v3 的通过率差距明显。
项目在 GitHub 开源(MIT 协议)。如果你现在被 Cloudflare 拦着,可以试一下。
作者:92year