隐身浏览器是什么
为什么有的网站能一眼认出你是"机器人"?又如何让它看不见?
网站的"火眼金睛"
想象你开着一辆车去商场。商场门口有个保安,他不仅看你的脸,还检查你的车牌号、轮胎花纹、后视镜角度、甚至你握方向盘的姿势。只要任何一项和他数据库里的"可疑清单"匹配,他就拦住你。
网站也在做同样的事——它们检查你的浏览器的浏览器指纹、自动化痕迹、鼠标轨迹,来判断你是一个真人还是一个机器人(Bot)。
这就像"间谍"和"安检"的较量:网站是安检,Bot 检测就是X光机。CloakBrowser 就是一套伪装工具,让你的自动化程序在 X 光机下看起来像个普通旅客。
CloakBrowser 是什么
CloakBrowser 是一个"隐身浏览器"——它基于 Chromium(Chrome 的内核),但对底层代码做了 57 处修改,让自动化程序看起来完全像一个真人在操作浏览器。
指纹伪装
修改浏览器的 57 个特征(画布、音频、字体、GPU 等),让每次访问看起来像不同的真实用户
行为模拟
用贝塞尔曲线模拟人类鼠标移动,用随机延迟模拟打字节奏,连"打错字再改"都模拟了
即插即用
直接替换 Playwright 或 Puppeteer,只需要改一行代码就能使用
只需三行代码
如果你已经在用 Playwright,换成 CloakBrowser 只需要改一行导入:
from cloakbrowser import launch
browser = await launch(headless=True)
page = await browser.new_page()
await page.goto("https://example.com")
从 CloakBrowser 包中导入启动函数
启动一个"看不见窗口"的隐身浏览器
打开一个新的标签页
让浏览器访问这个网址
Headless 模式让浏览器在后台运行,不弹出窗口。这对于自动化任务(比如批量抓取数据)特别有用。但普通的 headless 浏览器会暴露"我不是真人"的信号——CloakBrowser 会在 C++ 层面修复这些信号。
启动时发生了什么?
当你写下 launch() 时,背后发生了一场精心编排的"伪装派对":
检验理解
CloakBrowser 和普通 Playwright 的关键区别是什么?
如果你已经有一个用 Playwright 写的自动化脚本,迁移到 CloakBrowser 需要改多少代码?
反检测攻防战
网站怎么发现你是 Bot?CloakBrowser 又怎么让 Bot 变成"隐形人"?
一场永不停歇的军备竞赛
想象你在玩捉迷藏。藏的人(Bot)每次被发现,都会想出新的藏法;找的人(网站)每次被蒙混过关,都会升级搜索策略。这就是 Bot 检测和反检测之间的军备竞赛。
大多数反检测工具(比如 Puppeteer Stealth)是用 JS 注入来伪装的。但网站也能用 JS 来检测你的伪装——这就变成了"用 JS 骗 JS"的猫鼠游戏。CloakBrowser 的策略完全不同:它直接修改浏览器的 C++ 源代码。
网站的"安检清单"
网站通过以下方式检测你是不是 Bot。每一项都像一个"检查站":
Canvas 指纹
让浏览器画一张隐藏的图片,检查每个像素的颜色——不同电脑画出来会有细微差异,以此识别你
Audio 指纹
让浏览器处理一段声音信号,检查输出波形的微小差异——每台电脑的声卡处理结果都不一样
WebGL 指纹
检查你的显卡型号、3D 渲染能力——每张显卡的渲染结果都略有不同
WebRTC 泄露
即使你用了代理,WebRTC 可能直接暴露你的真实 IP 地址——这是许多反检测工具忽略的漏洞
自动化信号
navigator.webdriver、window.chrome 缺失、CDP 痕迹——这些"我是机器人"的标签需要全部抹掉
硬件特征
CPU 核心数、内存大小、屏幕分辨率、触摸能力——这些硬件参数组合起来也是指纹
C++ 补丁 vs JS 注入
CloakBrowser 的核心创新在于它的修补方式。其他工具在网页层面做伪装,CloakBrowser 在浏览器引擎层面做修改:
// 在网页里插入一段 JS 来骗检测
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// 直接在 Chromium 源码里改
// third_party/blink/renderer/...
if (IsAutomationEnabled()) {
return false; // 永远返回"不是机器人"
}
JS 注入就像是给间谍穿了一件外套——外套外面看着像普通人,但一做"X光检查"(检测注入痕迹),就会暴露。网站可以通过检查 Object.getOwnPropertyDescriptor 来发现属性被篡改过。而 C++ 补丁是直接修改了"骨骼"——从里到外都是伪装后的身份。
当网站尝试检测时
网站执行一段 JavaScript 来检查你的浏览器。看看 CloakBrowser 是怎么拦截这个检查的:
检验理解
为什么 CloakBrowser 的 C++ 补丁比 JS 注入更可靠?
如果网站同时使用 Canvas 指纹、WebGL 指纹和自动化信号检测,CloakBrowser 能应对吗?
启动引擎
当你写下 launch(),幕后发生了哪些精密操作?
启动就像发射火箭
发射一枚火箭不是按一个按钮就完事了——需要检查燃料、校准轨道、加载载荷、倒计时。CloakBrowser 的启动过程也一样精密:
定制的 Chromium 有没有下载好?校验 SHA-256 确保文件没被篡改
如果配了代理,解析代理 URL(支持 HTTP 和 SOCKS5),自动检测时区和地理位置
创建随机种子,生成 57 个隐身参数(指纹、平台、GPU 等)
用 Playwright(或 Patchright)启动浏览器,传入所有隐身参数
如果开了 humanize 模式,给鼠标和键盘操作加上"人类节奏"
定制浏览器的下载管理
CloakBrowser 不用普通的 Chrome——它用的是经过 57 处 C++ 修改的定制版 Chromium。这个文件大约 200MB,下载和管理工作全靠 download.py:
def ensure_binary() -> Path:
if local := os.environ.get("CLOAKBROWSER_BIN"):
return Path(local)
cached = _cache_dir() / _binary_name()
if cached.exists() and _sha256_ok(cached):
return cached
return _download_binary(cached)
定义"确保浏览器可用"的函数
如果用户指定了自定义路径,直接用那个
返回用户指定的路径
计算缓存目录中二进制文件的路径
如果文件存在且 SHA-256 校验通过,直接用缓存
返回缓存的文件路径
否则,从 GitHub Releases 下载新文件
SHA-256 就像文件的"防伪标签"——如果有人篡改了这个 200MB 的浏览器文件(比如植入了恶意代码),校验就会失败,CloakBrowser 会拒绝使用它。这保证了你运行的是一个安全的、未被篡改的浏览器。
隐身参数是怎么生成的
每次启动时,CloakBrowser 都会生成一套全新的"假身份"。这个身份从哪来?答案是一个随机种子(Seed):
def get_default_stealth_args() -> list[str]:
seed = random.randint(10000, 99999)
args = [
f"--fingerprint-seed={seed}",
f"--fingerprint-platform={platform}",
]
return args
定义生成隐身参数的函数
随机生成一个 5 位数的种子(10000 到 99999)
组装启动参数列表
传入种子——它决定了所有指纹细节
传入伪装的平台类型(比如把 Linux 伪装成 Windows)
返回完整的参数列表
--fingerprint-seed=42871
种子决定了所有指纹参数:画布噪点、GPU 型号、屏幕分辨率、字体列表...
--fingerprint-platform=windows
即使你的服务器是 Linux,网站也会认为你用的是 Windows
--disable-features=AutomationControl
关闭 Chrome 的"自动化模式"标志,抹除最明显的 Bot 痕迹
完整启动流程
从你写下 launch() 到浏览器窗口打开,中间经历了这些步骤:
检验理解
为什么 CloakBrowser 要对下载的 Chromium 做 SHA-256 校验?
在 CloakBrowser 的启动流程中,哪个参数决定了所有的指纹细节?
指纹系统详解
一个随机种子如何编织出完美的假身份?
用种子编织一个"虚拟人"
想象你有一个"角色生成器"——输入一个数字(种子),它就能自动生成一个完整的人物档案:身高、体重、发色、声音特征、行走姿态...所有属性都从这一个数字推导出来,而且同一个数字永远生成同一个角色。
CloakBrowser 的种子就是这么工作的。种子 42871 生成的是:
种子 42871 生成的虚拟身份
平台伪装:Linux 变 Windows
这是指纹系统最巧妙的部分之一。大多数自动化程序运行在 Linux 服务器上,但普通用户很少用 Linux 浏览网页。所以 CloakBrowser 会把 Linux 伪装成 Windows:
if sys.platform == "darwin":
platform = "macos"
else:
platform = "windows"
# macOS 保留真实平台
# Linux/Windows 都伪装成 Windows
如果系统是 macOS(苹果电脑)...
平台参数设为 "macos"
否则(Linux 或 Windows)...
统一伪装成 "windows"
macOS 用户很常见,不需要伪装
Linux 太显眼——网站会怀疑为什么一个"普通用户"在用 Linux
macOS 用户很常见,伪装反而可能引入不一致。Windows 用户占了绝大部分市场份额(~73%),是最安全的伪装目标。这就是"融入人群"的策略——把自己变成最不起眼的那一个。
一致性是关键
伪装最怕的不是某个指纹不对,而是指纹之间互相矛盾。想象一个人说他来自海南,但口音像东北的、身份证号是北京的——矛盾太多了。
CloakBrowser 的种子系统确保所有指纹参数来自同一个"世界":
检验理解
为什么 CloakBrowser 用种子(而不是完全随机的值)来生成指纹?
如果指纹系统把 GPU 伪装成 NVIDIA RTX 3060,但字体列表包含了 Linux 专有字体,会发生什么?
模拟人类行为
光有假指纹还不够——你还得"演"得像一个真人
指纹只是第一关
想象你伪造了一张完美的身份证,通过了门口的安检。但进去之后,你的行为暴露了你——你走路太快、从不眨眼、每次都走完全相同的路线。
高级 Bot 检测不仅检查"你是谁"(指纹),还检查"你怎么动"(行为)。CloakBrowser 的 humanize 模式就是专门应对这类检测的。
你的鼠标轨迹本身就是一种指纹。Bot 的鼠标走直线、瞬间到达、完美居中——真人的鼠标走曲线、有时会偏移、偶尔还会停顿。这种"行为指纹"比浏览器指纹更难伪造,因为它需要理解人类的物理运动规律。
三大行为模拟引擎
鼠标:贝塞尔曲线
真人的鼠标不会走直线——它走的是弯弯曲曲的贝塞尔曲线。每次移动的路径都不一样,还有随机的中途停顿和微小的抖动。
键盘:节奏与失误
真人打字不是匀速的——有些按键快、有些慢,偶尔还会按错然后删除重打。CloakBrowser 模拟了这种不精确性,包括真实的"打错→退格→重打"流程。
滚动:物理惯性
真人的滚动有加速、匀速、减速、回弹——像物理世界中的惯性运动。Bot 的滚动要么不动要么匀速跳转,一眼就能看出来。
怎么开启人类行为模拟
只需要在 launch 时加上一个参数:
browser = await launch(
headless=True,
humanize=True,
human_preset="default",
)
启动一个隐身浏览器
在后台运行,不显示窗口
开启人类行为模拟!
使用默认的"人类特征"预设(有多个预设可选)
结束配置
CloakBrowser 内部会对 Playwright 的鼠标和键盘方法做猴子补丁(Monkey Patch),把原本"机器人式"的操作替换成"人类式"的操作:
page.click()
不再是瞬间移动+点击,而是:贝塞尔曲线移动 → 微小偏移 → 按下 → 随机延迟 → 释放
page.type()
不再是匀速输入,而是:随机间隔(30-170ms)→ 偶尔打错 → 退格 → 重打正确的字符
page.mouse.move()
不再是直线移动,而是:生成随机控制点 → 绘制贝塞尔曲线 → 沿曲线移动,带微小抖动
贝塞尔曲线:鼠标的"人类弧度"
Bot 的鼠标从 A 点到 B 点走直线(下左)。真人的鼠标走曲线,路径带有自然的弧度和微偏(下右):
直线,瞬间到达
贝塞尔曲线,自然弧度
真人的手臂是通过关节运动的——肩膀、手肘、手腕。这种关节运动自然产生的轨迹就是贝塞尔曲线。CloakBrowser 用随机控制点模拟不同人的手臂长度、运动习惯,每次轨迹都不一样。