首页 / 资讯中心 / 文章详情

Camoufox 反检测浏览器实战:内核级指纹欺骗与 AI Agent 浏览器完整指南

Camoufox 反检测浏览器实战:内核级指纹欺骗与 AI Agent 浏览器完整指南 ★ FEATURED ARTICLE
Camoufox 反检测浏览器实战内核级指纹欺骗与 AI Agent 浏览器完整指南【免费下载链接】camoufox Anti-detect browser项目地址: https://gitcode.com/gh_mirrors/ca/camoufoxCamoufox 是一个基于 Firefox 深度改造的开源反检测浏览器面向网页抓取与 AI Agent 场景。它的做法不是在页面里塞 JavaScript 去改值而是把这台机器长什么样整套身份在 C 层面报给页面再配一条页面看不见的自动化通道。适合已经用过 Playwright 或 Selenium、却被navigator.webdriver、指纹交叉校验反复拦下的开发者。一、先讲痛点为什么你的自动化脚本一眼假如果你用 Playwright 驱动一个现成浏览器去抓数据大概率已经踩过这几类坑网站一查navigator.webdriver就返回true直接判定你是机器人你用page.addInitScript或Object.defineProperty覆写了navigator.platform但对方用Object.getOwnPropertyDescriptor一检查发现这个 getter 根本不像原生函数你改了主世界却漏了iframe和Web Worker里面的navigator还是原始值前后对不上你在 HTTP 头里写了一套User-Agent页面脚本里navigator.userAgent又是另一套服务器一对就穿帮。这类问题的根子在于大多数方案是在页面上层做文章。值是被脚本临时改掉的而现代反爬系统恰恰会去校验这个值到底是不是浏览器原生报出来的。覆写痕迹、上下文不一致、头与脚本不一致任何一条都足以暴露。Camoufox 的思路反过来不改页面改浏览器本身报值的源头。这样页面调navigator.platform拿到的就是一个原生返回值而不是被 JS 拦截改过的返回值两者在检测层面是完全不同的。二、它是怎么做到的拦截在 C隔离在协议层Camoufox 能骗得干净靠的是两件互补的事把伪造值放到浏览器最底层去返回再把自动化代码藏到页面看不见的地方。1. 内核级拦截页面读到的是原生值每次启动启动器Python 或 TypeScript 包会先生成一套完整的设备身份再把它打包成一个 JSON塞进浏览器的CAMOU_CONFIG环境变量。浏览器内核里的 C 代码负责读取并返回这些值。核心就一个读取器 browser/additions/camoucfg/MaskConfig.hpp。它在进程启动时解析一次 JSON 并缓存之后所有被改造过的 Web APInavigator、screen、WebGL、字体、音频、WebRTC都直接从这里取值。节选如下// browser/additions/camoucfg/MaskConfig.hpp节选 inline const nlohmann::json GetJson() { static const nlohmann::json jsonConfig LoadJson(); // 从 CAMOU_CONFIG 解析一次并缓存 return jsonConfig; } inline std::optionalstd::string GetString(std::string_view key) { const auto* value Find(key); if (!value) return std::nullopt; return value-getstd::string(); }打个比方普通方案是站在门口对来访者网页喊你当我是 Windows而 Camoufox 是把访客登记系统本身换了——页面每问一次你是什么系统登记的 C 逻辑就如实回一句和真机行为没有任何差别。可配置的键navigator.*、screen.*、headers.User-Agent、webrtc:ipv4等在 browser/settings/properties.json 里集中声明你可以据此核对到底哪些值会被改。这里有个容易被忽略的工程细节因为页面可以对 getter 计时MaskConfig特意把每次查找压到和原生 getter 几乎相同的开销一个函数内静态量 轻量哈希索引避免读取这个值明显比标准浏览器慢本身成为指纹。2. 协议隔离页面根本看不到自动化代码Playwright 驱动 Chromium 走的是 CDPChrome DevTools Protocol驱动 Firefox 走的则是 Camoufox 里的 Juggler 模块代码在 browser/additions/juggler/。Juggler 的 page agent 跑在一个隔离执行世界isolated world里你的evaluate、选择器、init script 都在这个隔离世界里执行真实页面里既不会出现多余的 getter也不会冒出监听器。同时输入事件走的是 Firefox 自己的输入处理路径所以点击、填表对页面而言和真人操作是同一种事件类型而不是脚本伪造的事件。再叠加navigator.webdriver返回false、headless 报告成桌面细指针等补丁自动化侧的痕迹基本被抹平。一句话概括页面负责被欺骗自动化负责隐形两条线互不串味。三、快速上手安装与第一个实例安装分两步先装 Python 包再把配套浏览器构建拉下来camoufox fetch会装好这个版本配套测试过的浏览器构建并固定 fpgen 指纹模型pip install -U camoufox[geoip] camoufox fetch[geoip]这个额外依赖是geoipTrue用的需要下载 GeoIP 数据库所以一开始就带上。装完后启动一个实例和普通 Playwright 几乎一样返回的就是标准 Playwright 对象你已有的脚本基本只改启动部分即可from camoufox.sync_api import Camoufox # proxy 走代理geoipTrue 让时区/语言/地理/WebRTC 都对齐到出口 IP with Camoufox( headlessTrue, proxy{server: http://proxy.example.com:8080, username: u, password: p}, geoipTrue, ) as browser: page browser.new_page() page.goto(https://example.com)几个最常用的启动参数建议先记住这几个其余的在 python/README.md 里有完整列表参数作用典型取值headless无头 / 虚拟显示 / 虚拟 GPUTrue、virtual、virtual-gpuproxyPlaywright 代理格式{server, username, password}geoip按出口 IP 对齐时区/语言/地理/WebRTCTrueos限定抽取身份的目标系统windows、macos、linuxhumanize人类化鼠标轨迹数值则限制单次时长Truefingerprint_preset用录制的真机指纹预设替代随机抽取TrueNode.js 侧是同一套接口的移植npm install camoufox playwright-core后npx camoufox fetch用法与 Python 一致详见 typescript/README.md。四、核心能力精讲真正值钱的是一致Camoufox 能用的点很多字体、WebGL、音频、媒体设备、语音等一整套都被同源生成但决定成败的不是能改多少字段而是这些字段之间能不能互相圆上。下面挑两个最有含金量的机制展开。1. 指纹一致性为什么每个字段都要彼此对得上反爬系统会交叉校验User-Agent 说你是 64 位 Linux那navigator.platform和navigator.oscpu就不能说 ARMWebGL 报的是 Apple M 芯片navigator.hardwareConcurrency就不能是 2因为 Apple Silicon 没有 2 核的型号。任何一处对不上整台机器就不存在。Camoufox 的身份不是各字段独立随机而是先从一个模拟真实流量分布的模型fpgen抽一台真机再过一遍 python/src/camoufox/coherence.py 里的整套规则。这套规则每条都对应一条真实机器上恒成立的不变量能修复的就修修不了的比如把 Windows 的 GPU 硬塞进 macOS 身份就上报给调用方去重抽。举几个它会拦的例子Apple Silicon 的核数必须是真实出货过的档位M 系列起步就是 8 核Intel Mac 的核数不能配一块带刘海屏的面板那种面板只有 Apple Silicon 有devicePixelRatio只能落在该 OS 真实提供的缩放档位上1.818这种值会被就近修到合法值screen.availWidth不允许大于screen.width窗口outerHeight减去innerHeight必须够得着真实窗口框架的高度。理解这一点很关键单个字段看起来合理没用整台机器的字段必须构成一台真实存在的机器。这也是 Camoufox 相比自己拍脑袋拼指纹最大的差别。2. 代理地理一致性让 IP、时区、语言、WebRTC 讲同一个故事你用了代理但网站一比对就发现出口 IP 在美国Intl却说你是东八区WebRTC 还漏出国内真实 IP——这类身份与 IP 地区打架是代理场景的高频暴露点。Camoufox 的geoipTrue会穿透代理查一次出口 IP然后据此同时设定时区、语言locale按该地区通行语言挑、地理位置并授权geolocation以及把 WebRTC 的候选 IP 改写成出口 IP。也就是说你是谁和你从哪来被强行拉到同一地区服务器做交叉校验时拿到的是一组自洽的证据。3. 顺带一提GPU 与字体的同源webgl_config指定的 GPU 必须是 fpgen 针对该 OS 真实录制过的那个随便填一对别的 GPU 会直接抛错字体列表也不是随机拼的而是该 OS 某个版本的基础字体集 按真实安装概率抽取的附加字体Office 约在 60% 的 Windows 机器上而某些欧洲补充字包只有约 2.8%。字体这块的细节在 docs/FONTS.md媒体设备在 docs/MEDIA-DEVICES.md。思路都一样不是造一个值而是还原一台真机的完整画像。五、场景实战用多身份跑一个 AI AgentAI Agent 场景的核心诉求是长期挂着多个会话、每个会话都要像真人且互不串号。Camoufox 允许一个浏览器里开多个上下文每个上下文各自独立一套身份navigator、screen、WebGL、字体、语音、时区、WebRTC IP通过 docs/per-context-patches.md 描述的 per-context 机制在页面脚本运行前注入。下面是一个贴近真实形态的异步示例一个浏览器、多个 Agent 身份、各自绑不同代理并开启人类化输入import asyncio from camoufox.async_api import AsyncCamoufox, AsyncNewContext async def main(): async with AsyncCamoufox(headlessTrue, canvas_noiseTrue) as browser: # 每个 Agent 一套独立身份 独立代理humanize 让鼠标像人 alice await AsyncNewContext(browser, oswindows, proxy{server: http://p1.example.com:8080, username: u, password: p}) bob await AsyncNewContext(browser, osmacos, proxy{server: http://p2.example.com:8080, username: u, password: p}) for ctx in (alice, bob): page await ctx.new_page() await page.goto(https://chat.example.com) await page.locator(textarea).first.type(你好帮我总结一下这篇文章, delay60) asyncio.run(main())几点说明都是实战里容易踩的地方跨 OS 身份在 Linux 宿主上跑oswindows的上下文需要canvas_noiseTrue否则 Canvas/WebGL 回读的是宿主真实像素会暴露宿主系统。humanize打开后鼠标轨迹不是平滑贝塞尔曲线而是从 2356 段真人录制里挑一段变形后按原节奏回放连停顿和过冲都保留实现在 browser/additions/juggler/input/cursory/这比匀速移动更接近真人。每个身份绑各自的代理与geoip保证Alice 在美国、Bob 在德国这种多地区并行不会互相污染。六、避坑指南四个高频问题1. 现象身份报的是 macOS但 Canvas 回读像 Linux。原因像素来自真实 OS、驱动与 GPU与身份声明无关。当身份声称的不是宿主 OS 时真实像素就会露馅。 解决要么让身份就用宿主 OS并让身份声称宿主的 GPU像素自然吻合要么对另一 OS 身份开canvas_noise让回读变成随机数据。取舍逻辑见 python/README.md 的 The canvas on another OS 一节。2. 现象navigator.hardwareConcurrency报 16但页面用并行 worker 一测可用核数对不上。原因页面可以对N 个并行任务计时来反推真实可用核数报得比实测多、或比实测少都会被抓。 解决默认情况下启动器已把报告值对齐到宿主真实核数若你想保留抽到的更多核配合pin_cpu_coresTrue把浏览器实际钉到那么多核让报的和测的由构造上就一致。3. 现象明明用了代理还是被判定为代理 / 身份与 IP 地区不符。原因WebRTC 漏出真实 IP或时区、语言、出口 IP 三者地区不一致另外没走代理时机器的 IPv6 地址可能把真实位置暴露出来。 解决proxy...加geoipTrue把 WebRTC、时区、语言、地理位置一起对齐关注启动时打印的LeakWarning它会说明是因为 IPv6 地区不一致而保持开启还是已按 IPv4-only 处理。4. 现象改了ff_version或手填了某个身份字段反而更容易被识别。原因声称的 Firefox 版本与真实引擎行为对不上是可检测的手填一个真实机器不会这样组合的值本身就是异常。 解决版本默认跟随浏览器自身用config手动覆盖时凡是与真实身份冲突的值都会触发带字段名的LeakWarningi_know_what_im_doing也压不掉这一类看到就该改回。七、总结与展望把整条链路串起来看Camoufox 的骗得干净来自两点叠加一是把伪造值放到浏览器最底层去返回页面读到的是原生值而非 JS 覆写二是用 Juggler 的隔离执行世界让自动化代码在页面里彻底隐身。而让这套机制真正可靠的是身份的一致性——从 fpgen 抽一台真机再用coherence把一台真机该有的样子逐字段校准。几点务实的判断它本质是 Firefox 构建只呈现 Firefox 系身份一些 WAF 会去试探 SpiderMonkey 引擎行为这部分不是靠欺骗能变成 Chromium 的。作者自己也强调它仍可能被检测——成百上千个值必须两两吻合反爬厂商专找那一个不吻合的。所以它不是一次配置永不再被拦而是把被拦的概率压得很低、且每次都有据可查。工程上它跟 Firefox 上游走补丁升级流程见 docs/patch-upgrading-guide.mdPython / TypeScript 双接口还能用launch_server()起一个远程 Playwright 服务让其它语言也能连进来。对大多数从脚本总被拦升级到要长期稳定地跑抓取或 Agent的团队Camoufox 的价值不在于它藏得最深而在于它把一致这件事做成了默认行为而不是让你去逐字段手调。把它当成一个自带身份一致性引擎的浏览器来用往往比逐条打补丁更省心。【免费下载链接】camoufox Anti-detect browser项目地址: https://gitcode.com/gh_mirrors/ca/camoufox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站