01

隐身浏览器是什么

为什么有的网站能一眼认出你是"机器人"?又如何让它看不见?

网站的"火眼金睛"

想象你开着一辆车去商场。商场门口有个保安,他不仅看你的脸,还检查你的车牌号、轮胎花纹、后视镜角度、甚至你握方向盘的姿势。只要任何一项和他数据库里的"可疑清单"匹配,他就拦住你。

网站也在做同样的事——它们检查你的浏览器的浏览器指纹自动化痕迹、鼠标轨迹,来判断你是一个真人还是一个机器人(Bot)

💡
Aha! 时刻

这就像"间谍"和"安检"的较量:网站是安检,Bot 检测就是X光机。CloakBrowser 就是一套伪装工具,让你的自动化程序在 X 光机下看起来像个普通旅客。

CloakBrowser 是什么

CloakBrowser 是一个"隐身浏览器"——它基于 Chromium(Chrome 的内核),但对底层代码做了 57 处修改,让自动化程序看起来完全像一个真人在操作浏览器。

🎭

指纹伪装

修改浏览器的 57 个特征(画布、音频、字体、GPU 等),让每次访问看起来像不同的真实用户

🖱️

行为模拟

用贝塞尔曲线模拟人类鼠标移动,用随机延迟模拟打字节奏,连"打错字再改"都模拟了

🔌

即插即用

直接替换 Playwright 或 Puppeteer,只需要改一行代码就能使用

只需三行代码

如果你已经在用 Playwright,换成 CloakBrowser 只需要改一行导入:

CODE

from cloakbrowser import launch

browser = await launch(headless=True)
page = await browser.new_page()
await page.goto("https://example.com")
            
白话翻译

从 CloakBrowser 包中导入启动函数

启动一个"看不见窗口"的隐身浏览器

打开一个新的标签页

让浏览器访问这个网址

ℹ️
为什么用 headless=True?

Headless 模式让浏览器在后台运行,不弹出窗口。这对于自动化任务(比如批量抓取数据)特别有用。但普通的 headless 浏览器会暴露"我不是真人"的信号——CloakBrowser 会在 C++ 层面修复这些信号。

启动时发生了什么?

当你写下 launch() 时,背后发生了一场精心编排的"伪装派对":

检验理解

CloakBrowser 和普通 Playwright 的关键区别是什么?

如果你已经有一个用 Playwright 写的自动化脚本,迁移到 CloakBrowser 需要改多少代码?

02

反检测攻防战

网站怎么发现你是 Bot?CloakBrowser 又怎么让 Bot 变成"隐形人"?

一场永不停歇的军备竞赛

想象你在玩捉迷藏。藏的人(Bot)每次被发现,都会想出新的藏法;找的人(网站)每次被蒙混过关,都会升级搜索策略。这就是 Bot 检测和反检测之间的军备竞赛。

💡
核心洞察

大多数反检测工具(比如 Puppeteer Stealth)是用 JS 注入来伪装的。但网站也能用 JS 来检测你的伪装——这就变成了"用 JS 骗 JS"的猫鼠游戏。CloakBrowser 的策略完全不同:它直接修改浏览器的 C++ 源代码。

网站的"安检清单"

网站通过以下方式检测你是不是 Bot。每一项都像一个"检查站":

🔍

Canvas 指纹

让浏览器画一张隐藏的图片,检查每个像素的颜色——不同电脑画出来会有细微差异,以此识别你

🔊

Audio 指纹

让浏览器处理一段声音信号,检查输出波形的微小差异——每台电脑的声卡处理结果都不一样

🖥️

WebGL 指纹

检查你的显卡型号、3D 渲染能力——每张显卡的渲染结果都略有不同

🌐

WebRTC 泄露

即使你用了代理,WebRTC 可能直接暴露你的真实 IP 地址——这是许多反检测工具忽略的漏洞

🤖

自动化信号

navigator.webdriverwindow.chrome 缺失、CDP 痕迹——这些"我是机器人"的标签需要全部抹掉

🧬

硬件特征

CPU 核心数、内存大小、屏幕分辨率、触摸能力——这些硬件参数组合起来也是指纹

C++ 补丁 vs JS 注入

CloakBrowser 的核心创新在于它的修补方式。其他工具在网页层面做伪装,CloakBrowser 在浏览器引擎层面做修改:

JS 注入(其他工具)

// 在网页里插入一段 JS 来骗检测
Object.defineProperty(navigator, 'webdriver', {
  get: () => undefined
});
            
C++ 补丁(CloakBrowser)

// 直接在 Chromium 源码里改
// third_party/blink/renderer/...
if (IsAutomationEnabled()) {
  return false;  // 永远返回"不是机器人"
}
            
⚠️
为什么 JS 注入靠不住?

JS 注入就像是给间谍穿了一件外套——外套外面看着像普通人,但一做"X光检查"(检测注入痕迹),就会暴露。网站可以通过检查 Object.getOwnPropertyDescriptor 来发现属性被篡改过。而 C++ 补丁是直接修改了"骨骼"——从里到外都是伪装后的身份。

当网站尝试检测时

网站执行一段 JavaScript 来检查你的浏览器。看看 CloakBrowser 是怎么拦截这个检查的:

🌐
网站 JS
⚙️
Chromium C++
🎭
指纹补丁
点击"下一步"开始

检验理解

为什么 CloakBrowser 的 C++ 补丁比 JS 注入更可靠?

如果网站同时使用 Canvas 指纹、WebGL 指纹和自动化信号检测,CloakBrowser 能应对吗?

03

启动引擎

当你写下 launch(),幕后发生了哪些精密操作?

启动就像发射火箭

发射一枚火箭不是按一个按钮就完事了——需要检查燃料、校准轨道、加载载荷、倒计时。CloakBrowser 的启动过程也一样精密:

1
检查浏览器二进制文件

定制的 Chromium 有没有下载好?校验 SHA-256 确保文件没被篡改

2
解析代理配置

如果配了代理,解析代理 URL(支持 HTTP 和 SOCKS5),自动检测时区和地理位置

3
生成隐身参数

创建随机种子,生成 57 个隐身参数(指纹、平台、GPU 等)

4
启动定制 Chromium

用 Playwright(或 Patchright)启动浏览器,传入所有隐身参数

5
注入人类行为模拟(可选)

如果开了 humanize 模式,给鼠标和键盘操作加上"人类节奏"

定制浏览器的下载管理

CloakBrowser 不用普通的 Chrome——它用的是经过 57 处 C++ 修改的定制版 Chromium。这个文件大约 200MB,下载和管理工作全靠 download.py

CODE · 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 下载新文件

💡
Aha! SHA-256 校验

SHA-256 就像文件的"防伪标签"——如果有人篡改了这个 200MB 的浏览器文件(比如植入了恶意代码),校验就会失败,CloakBrowser 会拒绝使用它。这保证了你运行的是一个安全的、未被篡改的浏览器。

隐身参数是怎么生成的

每次启动时,CloakBrowser 都会生成一套全新的"假身份"。这个身份从哪来?答案是一个随机种子(Seed)

CODE · config.py

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() 到浏览器窗口打开,中间经历了这些步骤:

👤
用户代码
📦
下载管理
🌍
GeoIP
🚀
Playwright
点击"下一步"开始

检验理解

为什么 CloakBrowser 要对下载的 Chromium 做 SHA-256 校验?

在 CloakBrowser 的启动流程中,哪个参数决定了所有的指纹细节?

04

指纹系统详解

一个随机种子如何编织出完美的假身份?

用种子编织一个"虚拟人"

想象你有一个"角色生成器"——输入一个数字(种子),它就能自动生成一个完整的人物档案:身高、体重、发色、声音特征、行走姿态...所有属性都从这一个数字推导出来,而且同一个数字永远生成同一个角色。

CloakBrowser 的种子就是这么工作的。种子 42871 生成的是:

种子 42871 生成的虚拟身份

🖥️
GPU: RTX 3060
📐
屏幕: 1920x1080
🎨
Canvas 噪点
🔊
Audio 指纹
🧠
CPU: 8 核
🔤
字体列表
点击任意组件,查看它的伪装细节

平台伪装:Linux 变 Windows

这是指纹系统最巧妙的部分之一。大多数自动化程序运行在 Linux 服务器上,但普通用户很少用 Linux 浏览网页。所以 CloakBrowser 会把 Linux 伪装成 Windows:

CODE · config.py

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 专有字体,会发生什么?

05

模拟人类行为

光有假指纹还不够——你还得"演"得像一个真人

指纹只是第一关

想象你伪造了一张完美的身份证,通过了门口的安检。但进去之后,你的行为暴露了你——你走路太快、从不眨眼、每次都走完全相同的路线。

高级 Bot 检测不仅检查"你是谁"(指纹),还检查"你怎么动"(行为)。CloakBrowser 的 humanize 模式就是专门应对这类检测的。

💡
Aha! 行为指纹

你的鼠标轨迹本身就是一种指纹。Bot 的鼠标走直线、瞬间到达、完美居中——真人的鼠标走曲线、有时会偏移、偶尔还会停顿。这种"行为指纹"比浏览器指纹更难伪造,因为它需要理解人类的物理运动规律。

三大行为模拟引擎

🖱️

鼠标:贝塞尔曲线

真人的鼠标不会走直线——它走的是弯弯曲曲的贝塞尔曲线。每次移动的路径都不一样,还有随机的中途停顿和微小的抖动。

⌨️

键盘:节奏与失误

真人打字不是匀速的——有些按键快、有些慢,偶尔还会按错然后删除重打。CloakBrowser 模拟了这种不精确性,包括真实的"打错→退格→重打"流程。

📜

滚动:物理惯性

真人的滚动有加速、匀速、减速、回弹——像物理世界中的惯性运动。Bot 的滚动要么不动要么匀速跳转,一眼就能看出来。

怎么开启人类行为模拟

只需要在 launch 时加上一个参数:

CODE

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 点走直线(下左)。真人的鼠标走曲线,路径带有自然的弧度和微偏(下右):

BOT 方式
A B

直线,瞬间到达

真人方式
A B

贝塞尔曲线,自然弧度

ℹ️
为什么贝塞尔曲线?

真人的手臂是通过关节运动的——肩膀、手肘、手腕。这种关节运动自然产生的轨迹就是贝塞尔曲线。CloakBrowser 用随机控制点模拟不同人的手臂长度、运动习惯,每次轨迹都不一样。

检验理解

为什么光有指纹伪装还不够,还需要行为模拟?

CloakBrowser 怎么让你的代码自动获得"人类行为"——而不需要你重写任何操作代码?