daijro/camoufox

GitHub: daijro/camoufox

基于 Firefox 深度定制的高隐蔽性反检测浏览器,通过 C++ 层指纹伪装和 Playwright 沙箱隔离实现绕过反机器人检测的自动化与网页抓取。

Stars: 5712 | Forks: 518

Camoufox

一款用于网页抓取的隐蔽、极简、自定义构建的 Firefox 浏览器 🦊

Camoufox 是一款开源的反检测浏览器,支持强大的指纹注入和反机器人规避。

daijro%2Fcamoufox | Trendshift

## Firefox 版本升级通知 当前主分支基于 Firefox v146 构建。这是一项实验性更改,可能包含一些错误。如果您是从源代码构建且需要稳定的生产版本,请使用 `releases/135` 分支。 FF146 目前仅支持 MacOS。Linux 支持将在下周推出,Windows 支持预计在 1 月底前推出。 请参阅 [Beta 测试指南](docs/beta-testing-ff146.md) 获取测试 FF146 的说明。 [[⤵︎ 简介](#introduction)] # 简介 Camoufox 是一款现代且有效的开源解决方案,用于避免机器人检测和智能指纹轮换。 ## 亮点 - **对反机器人系统不可见** 🎭 - 页面代理(Page agent)对 JavaScript 检测隐藏。有关更多详细信息,请参阅 [隐蔽页面](https://camoufox.com/stealth)。 * **指纹注入与轮换(非 JS 注入!)** - 所有 navigator 属性(设备、操作系统、硬件、浏览器等) ✅ - 屏幕尺寸、分辨率、窗口和视口属性 ✅ - 地理位置、时区、语言环境和 Intl 伪装 ✅ - 协议级别的 WebRTC IP 伪装 ✅ - 语音、语音播放速率等 ✅ - 还有更多! - **反图形指纹识别** - WebGL 参数、支持的扩展、上下文属性和着色器精度格式 ✅ - 字体伪装和反指纹识别 ✅ * **生活质量功能** - 拟人化的鼠标移动 🖱️ - 拦截并规避广告 🛡️ - 无 CSS 动画 💨 - 精简并优化内存效率 ⚡ - [PyPi 包](https://pypi.org/project/camoufox/) 用于更新和自动指纹注入 📦 - 保持与最新 Firefox 版本同步 🕓 ## 指纹注入 在 Camoufox 中,数据在 C++ 实现层被拦截,这使得通过 JavaScript 检查无法检测到这些更改。 要伪装单个指纹属性,请将包含属性的 JSON 传递给 [Python 接口](https://github.com/daijro/camoufox/tree/main/pythonlib#camoufox-python-interface): ``` >>> with Camoufox(config={"property": "value"}) as browser: ``` 用户未设置的配置数据将使用 [BrowserForge](https://github.com/daijro/browserforge) 指纹自动填充,该指纹模拟现实世界流量中设备特征的统计分布。 [[查看已实现的属性](https://camoufox.com/fingerprint/)] ## Python 用法 Camoufox 与您现有的 Playwright 代码兼容。您只需更改浏览器初始化方式。 **同步 API** ``` from camoufox.sync_api import Camoufox with Camoufox() as browser: page = browser.new_page() page.goto("https://example.com") ``` **异步 API** ``` from camoufox.async_api import AsyncCamoufox async with AsyncCamoufox() as browser: page = await browser.new_page() await page.goto("https://example.com") ``` [[安装与用法](https://camoufox.com/python/)] ## 功能特性 以下是 Camoufox 中实现的补丁和功能列表。 ### 指纹伪装 - Navigator 属性伪装(设备、浏览器、语言环境等) - 支持模拟屏幕尺寸、分辨率等 - 伪装 WebGL 参数、支持的扩展、上下文属性和着色器精度格式 - 伪装内部和外部窗口视口大小 - 伪装 AudioContext 采样率、输出延迟和最大声道数 - 伪装设备语音和播放速率 - 伪装可用的麦克风、网络摄像头和扬声器数量 - 网络标头(Accept-Languages 和 User-Agent)经过伪装以匹配 navigator 属性 - 协议级别的 WebRTC IP 伪装 - 地理位置、时区和语言环境伪装 - Battery API 伪装 - 等等。 ### 隐蔽补丁 - 避免主世界执行泄漏。所有页面代理 JavaScript 均被沙箱化 - 避免框架执行上下文泄漏 - 修复 `navigator.webdriver` 检测 - 通过指针类型修复 Firefox 无头模式检测 ([#26](https://github.com/daijro/camoufox/issues/26)) - 移除可能泄漏的反缩放/元视口处理补丁 - 使用非默认的屏幕和窗口大小 - 重新启用 Fission 内容隔离 - 重新启用 PDF.js - 更改其他可能泄漏的配置属性 - 拟人化光标移动 ### 反字体指纹识别 - 自动为您的 User Agent 使用正确的系统字体 - 捆绑 Windows、Mac 和 Linux 系统字体 - 通过随机偏移字母间距来防止字体度量指纹识别 ### Playwright 支持 - 针对最新 Firefox 的 Playwright 自定义实现 - 用于规避机器人检测的各种配置补丁 ### 精简/优化 - 剥离/禁用了*很多很多* Mozilla 服务。运行速度比原始 Mozilla Firefox 更快,且内存占用更少 (200MB) - 来自 LibreWolf 和 Ghostery 的补丁,有助于移除遥测和臃肿软件 - 来自 PeskyFox、LibreWolf 等的精简配置 - 来自 FastFox 的速度和网络优化 - 移除所有 CSS 动画 - 极简主题化 - 等等。 ### 插件 - 通过将路径列表传递给 `addons` 属性,无需调试服务器即可加载 Firefox 插件 - 添加了带有自定义隐私过滤器的 uBlock Origin - 不允许插件打开标签页 - 插件在隐私浏览模式下自动启用 - 插件自动固定到工具栏 - 通过 uBO 预取修复 DNS 泄漏 ### Python 接口 - 根据现实世界的分布自动生成并将唯一的设备特征注入 Camoufox - WebGL 指纹注入与轮换 - 根据您的目标操作系统使用正确的系统字体、子像素抗锯齿和微调 - 通过根据代理的目标区域计算目标地理位置、时区和语言环境,避免代理检测 - 根据代理目标区域的语言使用者分布计算并伪装浏览器的语言 - 远程服务器托管,以便与支持 Playwright 的其他语言一起使用 Camoufox - 内置虚拟显示缓冲区,以便在无头服务器上以有头模式运行 Camoufox - 切换图像加载、WebRTC 和 WebGL - 等等。 # 隐蔽概述 ## Camoufox 如何隐藏其自动化库 在 Camoufox 中,Playwright 的所有内部页面代理代码都被沙箱化和隔离。这使得页面无法通过 Javascript 检查来检测 Playwright 的存在。 通常,Playwright 会向页面注入一些 JavaScript,例如 `window.__playwright__binding__`,并执行查询元素、评估 javascript 或运行初始化脚本等操作,这些操作可能会被网站检测到。在 Camoufox 中,这些操作在页面之外的隔离范围内处理。换句话说,网站不再能“看到”Playwright 通常会注入的任何 JavaScript。这彻底阻止了 Playwright 的痕迹。 然而,即使隐藏了其自动化库,Camoufox 也无法免受指纹轮换不一致的影响。这仍然需要维护以发现和修复问题。 ### 页面交互 反机器人系统还会运行客户端脚本来监控您的行为。例如,它们会寻找鼠标移动、点击、滚动以及动作之间的时间间隔的模式。 Camoufox 通过其拟人化鼠标移动算法尽最大努力。自然运动算法最初来自 [riflosnake 的 HumanCursor](https://github.com/riflosnake/HumanCursor),并已在 C++ 中重写并进行了修改,以实现更具距离感知的轨迹。 然而,这并不完美。如果分析足够复杂,它仍然可能被检测到。(未来待完善) ## Camoufox 如何轮换身份 除了隐藏自动化库之外,您的身份也必须在每个实例中进行随机化,以避免速率限制和检测。如果每次都明显是您,那么轮换 IP 地址就毫无意义。有数千种因素构成了您唯一的**指纹**。现在,您访问的任何网站都可以看到您在 Linux 上使用 Chrome,运行在 NVIDIA GeForce RTX 4090 上。 ### 市场份额分布 即使您为每个运行的机器人实例轮换 IP,Web 访问防火墙仍然可以使用机器学习来分析传入的 Web 流量,以检测其是否异常。如果 Linux 市场份额是 5%,然后突然变成 20%,这就是一个危险信号。他们将无条件要求所有 Linux 用户完成验证码。 Camoufox 使用 [BrowserForge](https://github.com/daijro/browserforge) 的指纹生成器来模拟现实世界流量中设备数据的统计分布。例如,Camoufox 将在 5% 的时间内使您的浏览器看起来像 Linux 用户。在这 5% 中,它将在 9.5% 的时间内伪装成 2560x1440 的屏幕分辨率,在 27.5% 的时间内伪装成 Intel HD GPU。 ### Camoufox 如何被检测到? Camoufox 可以伪装具有正确市场份额的指纹。然而,**指纹也必须在内部保持一致。** 使用 Apple M1 GPU 的 Windows User Agent、使用 Windows DirectX 渲染器的 MacOS User Agent 以及具有桌面屏幕分辨率的移动设备都是不可能的,并且会被标记为可疑。 在必须更改以创建可信伪装指纹的数千个可能数据点中,每个更改必须与其他更改保持一致,Camoufox 并不总能成功。反机器人提供商一遍又一遍地测试 Camoufox 以找到哪怕 1 个独特的不一致之处,然后他们立即更新其后台脚本以对其进行测试。 ## Camoufox 与其他解决方案相比如何? ### 基于 JavaScript 的解决方案 过去,开发者尝试注入 JavaScript 来伪装这些值,但这并不可靠,因为 JavaScript 无法伪装所有内容。覆盖不完整会导致指纹不一致。例如,如果您的网络请求的 User Agent 与您的 navigator 的 User Agent 不匹配,反机器人系统将标记您。 此外,所有注入的 JavaScript 在某种程度上都是可检测的。反机器人系统可以检查 `Object.getOwnPropertyDescriptor` 是否显示了被覆盖的属性,函数的 `toString()` 是否不再返回 `[native code]`(表明它被劫持了),或者窗口上下文中的数据是否与工作线程上下文不匹配。变通方法只能到此为止,但如果您搜索得足够深入,总会有一种方法可以检测到 JS 注入。 #### Camoufox 的方法 由于 Camoufox 在浏览器的 C++ 实现级别拦截调用,因此所有被劫持的对象和属性都显示为本机。没有可被检测到的 JavaScript 劫持。 Camoufox 还尝试使用 Browserforge 生成一致且可信的指纹。然而,这仍然可以通过复杂的指纹检测方法(如数据不匹配)检测到。
### 基于 CDP 的库 CDP (Chrome DevTools Protocol) 是内置于 Chromium 和 Firefox 中的自动化协议。然而,CDP 不屑于隐藏它是自动化协议的事实,并在页面范围内公开了其大部分功能。一些常见的方法是检查 `navigator.webdriver` 是否为 true,捕捉读取堆栈调试器的行为,检查 ChromeDriver 注入到文档对象中以进行内部通信的变量等等。 #### Camoufox 的方法 虽然 Playwright 使用 CDP 来控制 Chromium,但它使用 _Juggler_ 来控制 Firefox。Juggler 是在 Firefox 支持 CDP 之前开发的自定义协议([原始仓库](https://github.com/puppeteer/juggler))。它是 Firefox 中的一个独特模块,而不是其核心浏览器的一部分。这使得更容易编辑和控制向页面显示的内容。 Camoufox 为 Juggler 打了补丁,为其提供自己的隔离“副本”以供使用。Playwright 可以自由地读取和编辑其自己的页面版本。对它来说一切似乎都正常工作,但真实页面完全不受这些更改的影响。页面也无法检测到何时正在读取内容(通过劫持 getter 等技巧)或何时添加了监听器以监视元素。 此外,Juggler 通过 Firefox 的原始用户输入处理程序直接发送其输入,这意味着它们的处理方式与您正常使用浏览器完全相同。Camoufox 还对 Firefox 的无头模式打了补丁,使其看起来与在正常窗口中运行一样。但作为后备方案,如果无头模式发生泄漏,Python 库可以在[虚拟显示器](https://camoufox.com/python/virtual-display/)中运行 Camoufox。

构建系统

### 概述 以下是构建系统及其关联的 make 命令的图表: ``` graph TD FFSRC[Firefox Source] -->|make fetch| REPO subgraph REPO[Camoufox Repository] PATCHES[Fingerprint masking patches] ADDONS[uBlock & B.P.C.] DEBLOAT[Debloat/optimizations] SYSTEM_FONTS[Win, Mac, Linux fonts] JUGGLER[Patched Juggler] end subgraph Local REPO -->|make dir| PATCH[Patched Source] PATCH -->|make build| BUILD[Built] BUILD -->|make package-linux| LINUX[Linux Portable] BUILD -->|make package-windows| WIN[Windows Portable] BUILD -->|make package-macos| MAC[macOS Portable] end ``` 这最初基于 LibreWolf 构建系统。 ## 构建 CLI 首先,使用 Git 克隆此仓库: ``` git clone --depth 1 https://github.com/daijro/camoufox cd camoufox ``` 接下来,使用以下命令构建 Camoufox 源代码: ``` make dir ``` 之后,您必须引导您的系统才能构建 Camoufox。您只需执行一次此操作。通过运行以下命令完成: ``` make bootstrap ``` 最后,您可以使用以下命令构建并打包 Camoufox: ``` python3 multibuild.py --target linux windows macos --arch x86_64 arm64 i686 ```
CLI 参数 ``` Options: -h, --help show this help message and exit --target {linux,windows,macos} [{linux,windows,macos} ...] Target platforms to build --arch {x86_64,arm64,i686} [{x86_64,arm64,i686} ...] Target architectures to build for each platform --bootstrap Bootstrap the build system --clean Clean the build directory before starting Example: $ python3 multibuild.py --target linux windows macos --arch x86_64 arm64 ```
### 使用 Docker Camoufox 可以在所有平台上通过 Docker 构建。 1. 创建包含 Firefox 源代码的 Docker 镜像: ``` docker build -t camoufox-builder . ``` 2. 将 Camoufox 补丁构建到目标平台和架构: ``` docker run -v "$(pwd)/dist:/app/dist" camoufox-builder --target --arch ```
如何使用我的本地 ~/.mozbuild 目录? 如果您想使用主机的 .mozbuild 目录,可以改用以下命令来运行 docker: ``` docker run \ -v "$HOME/.mozbuild":/root/.mozbuild:rw,z \ -v "$(pwd)/dist:/app/dist" \ camoufox-builder \ --target \ --arch ```
Docker CLI 参数 > ``` Options: -h, --help show this help message and exit --target {linux,windows,macos} [{linux,windows,macos} ...] Target platforms to build --arch {x86_64,arm64,i686} [{x86_64,arm64,i686} ...] Target architectures to build for each platform --bootstrap Bootstrap the build system --clean Clean the build directory before starting Example: $ docker run -v "$(pwd)/dist:/app/dist" camoufox-builder --target windows macos linux --arch x86_64 arm64 i686 ```
构建产物现在将出现在 `dist/` 文件夹下。 ## 开发工具 此仓库在 scripts/developer.py 下附带了一个开发者 UI: ``` make edits ``` 补丁可以通过此处进行编辑、创建、移除和管理。 ### 如何制作补丁 1. 在开发者 UI 中,点击 **Reset workspace**。 2. 根据需要在 `camoufox-*/` 文件夹中进行更改。您可以使用 `make build` 和 `make run` 测试您的更改。 3. 完成更改后,点击 **Write workspace to patch** 并保存补丁文件。 ### 如何处理现有补丁 1. 在开发者 UI 中,点击 **Edit a patch**。 2. 选择您想要编辑的补丁。您的工作区将重置为所选补丁的状态。 3. 完成更改后,点击 **Write workspace to patch** 并覆盖现有的补丁文件。 ## 泄漏调试 这是一个流程图,展示了我在不反混淆 WAF Javascript 的情况下确定泄漏的过程。该方法将 Camoufox 的功能逐步重新引入 Firefox 的源代码中,直到测试网站标记为止。 此过程需要 Linux 系统,并假设您已安装 Firefox 构建工具(见[此处](https://github.com/daijro/camoufox?tab=readme-ov-file#build-cli))。
查看流程图... ``` flowchart TD A[Start] --> B[Does website flag in the official Firefox?] B -->|Yes| C[Likely bad IP/rate-limiting. If the website fails on both headless and headful mode on the official Firefox distribution, the issue is not with the browser.] B -->|No| D["Run make ff-dbg(1) and build(2) a clean distribution of Firefox. Does the website flag in Firefox **headless** mode(4)?"] D -->|Yes| E["Does the website flag in headful mode(3) AND headless mode(4)?"] D -->|No| F["Open the developer UI(5), apply config.patch, then rebuild(2). Does the website still flag(3)?"] E -->|No| G["Enable privacy.resistFingerprinting in the config(6). Does the website still flag(3)?"] E -->|Yes| C G -->|No| H["In the config(6), enable FPP and start omitting overrides until you find the one that fixed the leak."] G -->|Yes| I[If you get to this point, you may need to deobfuscate the Javascript behind the website to identify what it's testing.] F -->|Yes| K["Open the developer UI, apply the playwright bootstrap patch, then rebuild. Does it still flag?"] F -->|No| J["Omit options from camoufox.cfg(6) and rerun(3) until you find the one causing the leak."] K -->|No| M[Juggler needs to be debugged to locate the leak.] K -->|Yes| L[The issue has nothing to do with Playwright. Apply the rest of the Camoufox patches one by one until the one causing the leak is found.] M --> I ``` #### 引用的命令 | # | 命令 | 描述 | | --- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | (1) | `make ff-dbg` | 设置带有最小补丁的原始 Firefox。 | | (2) | `make build` | 构建源代码。 | | (3) | `make run` | 运行构建的浏览器。 | | (4) | `make run args="--headless https://test.com"` | 在无头模式下运行 URL。所有重定向将打印到控制台以确定测试是否通过。 | | (5) | `make edits` | 打开开发者 UI。允许用户应用/撤销补丁,并查看当前应用了哪些补丁。 | | (6) | `make edit-cfg` | 在默认系统编辑器中编辑 camoufox.cfg。 |
## 致谢 精简与参考: - [LibreWolf](https://gitlab.com/librewolf-community/browser/source):精简补丁和构建系统灵感 - [BetterFox](https://github.com/yokoffing/BetterFox):速度和精简首选项 - [Ghostery](https://github.com/ghostery/user-agent-desktop):精简参考([禁用引导](https://github.com/daijro/camoufox/blob/main/patches/ghostery/Disable-Onboarding-Messages.patch)) 网页抓取与测试: - [riflosnake/HumanCursor](https://github.com/riflosnake/HumanCursor):原始的拟人化光标移动算法,移植到 C++ - [CreepJS](https://github.com/abrahamjuliot/creepjs), [Browserleaks](https://browserleaks.com), [BrowserScan](https://www.browserscan.net/) - 宝贵的泄漏测试网站 UI 主题: - [Jamir-boop/minimalisticfox](https://github.com/Jamir-boop/minimalisticfox):启发了 Camoufox 的极简 CSS 主题 [(链接)](https://github.com/daijro/camoufox/blob/main/settings/chrome.css)
标签:Camoufox, Canvas指纹, DNS 解析, Firefox, Python爬虫, WebGL伪装, WebRTC IP欺骗, 匿名浏览, 反检测浏览器, 反爬虫对抗, 开源浏览器, 指纹伪造, 机器人规避, 模拟用户行为, 浏览器定制, 浏览器指纹, 爬虫框架, 特征检测, 网络安全, 请求拦截, 逆向工具, 隐私保护