feder-cr/invisible_playwright

GitHub: feder-cr/invisible_playwright

一款在 C++ 源码层面对 Firefox 进行深度修补的反指纹自动化浏览器,能通过所有主流机器人与指纹检测,并作为 Playwright 的直接替代品无缝接入现有自动化流程。

Stars: 148 | Forks: 21

# invisible_playwright [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![Firefox 150.0.1](https://img.shields.io/badge/firefox-150.0.1-orange.svg)](https://www.mozilla.org/firefox/) [![GitHub 发布](https://img.shields.io/github/v/release/feder-cr/invisible_playwright.svg)](https://github.com/feder-cr/invisible_playwright/releases) [![GitHub star](https://img.shields.io/github/stars/feder-cr/invisible_playwright.svg?style=social)](https://github.com/feder-cr/invisible_playwright/stargazers) 一款经过补丁修改的 Firefox,**100% 兼容 Playwright**,能够通过目前互联网上最严格的浏览器指纹检测。 ## 结果 ### Google reCAPTCHA v3 - **0.90 / 1.0** 顶级分数。Google 将该会话归类为“极大概率是真人”。大多数反检测技术栈的得分通常停滞在 0.3-0.7 之间。 ![reCAPTCHA 得分 0.90](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/71aaae09ab074333.png) ### Fingerprint Pro - **机器人:未检测到,VPN:否,篡改:否,开发者工具:未检测到** FingerprintJS Pro 的全套 Smart Signals 检测将所有标记均置为“未检测到”。浏览器被正确识别为 Windows 10 上的 Firefox 150。置信度得分为 0.9。 ![FingerprintPro 未检测到](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/fc6f274c21074334.png) ### CreepJS - **0 个谎言**,指纹内部自洽 在无头模式提示、伪造值和真实渲染输出之间没有任何矛盾。这个“0 个谎言”正是击败大多数反检测浏览器的关键:只要有一处不一致(例如 Chrome 的 User-Agent + Firefox 的 WebGL),信任评分就会崩溃。 ![CreepJS 0 个谎言](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d3d47314e4074335.png) ### BrowserLeaks WebRTC - **无公网 IP 泄露** WebRTC srflx 地址为代理出口 IP;主机候选为私有局域网地址。即使在配置了自身 ICE 服务器的页面上,真实的公网 IP 也绝不会通过 STUN 泄露。原版 Firefox 会通过 WebRTC mDNS 泄露真实的本地 IP —— 而 invisible_playwright 不会。 ![WebRTC 无泄露](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/832f1054f9074336.png) ### bot.sannysoft.com - **所有检查均通过** 每一项均显示绿色:WebDriver 不存在,缺少 Chrome 独有属性,插件/MIME/语言数组自洽,Permissions API 正确,iframe/源窗口检查通过。 ![Sannysoft 全绿](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/6047c1acdc074336.png) ## 为什么它如此强大 **大多数反检测浏览器都是在 JavaScript 层面对 Chromium 进行修补的** —— 它们通过注入脚本来覆盖 `navigator`、`WebGLRenderingContext.getParameter`、canvas API 等等。这存在两个致命问题: 1. **JS 补丁是可被检测的。** 反机器人系统会枚举原生函数的 `.toString()`,检查描述符的可配置性,比较属性枚举顺序,并监视原型修改。每一个补丁都会留下其自身的指纹。CreepJS 正是基于此构建了一整套“谎言检测器”。 2. **Chromium 本身现在变得可疑。** 基于住宅代理的机器人流量绝大多数是基于 Chromium 的,因此检测器默认将所有 Chromium 特征的流量视为高风险。而且其中起关键作用的部分(TLS 堆栈、渲染器进程)在正式版 Chrome 中并非完全开源 —— 各种派生版本要么继承了 Chromium 的所有特征,要么在可见层面上发生了偏移。 **invisible_playwright 在 C++ 层面对 Firefox 进行了修补。** 伪造的值通过正常的 Gecko 路径返回 —— 没有 JS 垫片,没有重写,也没有 `Object.defineProperty`。**从页面的角度来看,浏览器只是在陈述事实。** 反机器人谎言检测器根本找不到任何可乘之机。 invisible_playwright **连贯且一致地伪造了所有关键层级**: | 层级 | 我们的操作 | 为何重要 | |-------|-----------|-----------------| | Navigator / 硬件 | C++ 覆盖:UA、oscpu、languages、hardwareConcurrency、deviceMemory、存储配额 | 自我描述在每个 API 中都保持一致 | | 屏幕 / 窗口 / 指针 | C++ 补丁:屏幕宽高、outerSize 边界、媒体查询 device-size、指针/悬停/触摸功能 | `screen.*`、`window.outer*`、CSS `@media (pointer: fine)` 全部保持一致 | | CSS 系统颜色 | 40 个 `ui.*` Win32 调色板覆盖 | 系统颜色的 `getComputedStyle()` 与真实的 Windows 匹配 | | GPU / WebGL | C++ 补丁:供应商、渲染器、扩展白名单、整数/浮点参数、着色器精度、readPixels 噪声 | 匹配真实的 Windows ANGLE,精确到枚举值 | | Canvas 2D | C++ 补丁:逐像素替换 + 几何跳过掩码噪声 + TextMetrics 方差 | 击败 canvas 哈希和文本_metrics 指纹识别 | | 字体 / DirectWrite | C++ 补丁:字体系列白名单 + 伪造的权威列表 + 每个系列的宽度缩放 + DWrite 设置 | 字体枚举与真实的 Win10 匹配;canvas 文本哈希保持稳定 | | 音频 | C++ 补丁:sampleRate + output latency + max channels + AnalyserNode/DynamicsCompressor 噪声 | AudioContext 指纹可以非常精准地对用户进行分桶 | | 语音合成 | C++ 补丁:伪造的语音列表 | `navigator.speechSynthesis.getVoices()` 与伪装的操作系统匹配 | | WebRTC | C++ 补丁 (nICEr):srflx 地址交换 + 合成 srflx 回退 + 私有局域网主机候选 | 真实的公网 IP 绝不会通过 STUN 泄露 | | 时区 | C++ 补丁:通过 BrowsingContext 实现的 per-Realm TZ(无 IPC pref 竞争) | `Date.getTimezoneOffset()`、`Intl.DateTimeFormat` 与伪装的地理位置匹配 | | DevTools 检测 | C++ 补丁:`Debugger.stealthMode` + Juggler `Runtime.js` + 线程 Actor | 即使挂载了 debugger,FP Pro 的 `developer_tools` 结果依然为“未检测到” | | SOCKS5 认证 | C++ 补丁 | 原版 Playwright+Firefox 根本无法进行协商 | | DNS | 默认通过 SOCKS 代理路由 | 使用住宅网关时无 DNS 泄露 | | 鼠标运动 | Juggler `PageHandler.js` 内部的贝塞尔曲线,每个路径点约 10 ms | 即使是 `page.click(selector)` 也能像真人一样移动鼠标 | | 虚拟桌面上的 GPU | 针对 FF150 替代桌面沙箱回归问题的偏好设置驱动变通方案 | 即使在无头模式 / 多工作者大规模测试中,WebGL 渲染器也能正常填充 | | Fission 导航 | C++ 补丁:`nsDocShell` + `CanonicalBrowsingContext` Juggler 导航修复 | `page.goto()` 在 FF150 的各种代理边缘情况下均保持可靠 | | about:newtab 竞争 | 围绕 `new_page()` 的异步包装器休眠 | 在 FF150 上不会出现“Navigation interrupted by about:newtab”错误 | | 代理可靠性 | Juggler `PageHandler.equalsExceptRef` 拆分 try/catch | 使用 Evomi 等代理时不会出现虚假的“Invalid url”错误 | 所有这些都由偏好设置驱动 —— 二进制文件中没有硬编码的值。您只需更改一个偏好设置,就可以改变对应的伪造值。 ## 对比分析 商业反检测浏览器(Multilogin、GoLogin、AdsPower、Kameleo、Dolphin Anty、Browserbase)提供的是修补过的 Chromium,并在 JavaScript 层覆盖指纹。这就是它们的上限 —— 而且这个上限很低。 | | invisible_playwright | Multilogin / GoLogin | AdsPower / Dolphin | Browserbase | |---|---|---|---|---| | 引擎 | Firefox (开源) | Chromium 派生版 | Chromium 派生版 | Chromium | | 补丁深度 | C++ 源码 | JS 覆盖 | JS 覆盖 | JS 覆盖 | | `.toString()` 干净 | ✅ 原生 Gecko 路径 | ❌ 可被检测的垫片 | ❌ 可被检测的垫片 | ❌ 可被检测的垫片 | | Canvas / WebGL | ✅ C++ 层级 | ⚠️ JS 覆盖 | ⚠️ JS 覆盖 | ⚠️ JS 覆盖 | | SOCKS5 认证 | ✅ 已修补 | ⚠️ 视情况而定 | ⚠️ 视情况而定 | ❌ | | 自托管 | ✅ | ❌ SaaS | ❌ SaaS | ❌ 云端 | | reCAPTCHA v3 得分 | **0.90** | ~0.3-0.6 | ~0.3-0.5 | ~0.3-0.5 | | FP Pro - 机器人检测 | ✅ 未检测到 | ❌ 已检测 | ❌ 已检测 | ❌ 已检测 | | FP Pro - 篡改 | ✅ 未检测到 | ❌ 已检测 | ❌ 已检测 | ❌ 已检测 | | FP Pro - VPN 标记 | ✅ false | ❌ true | ❌ true | ❌ true | | CreepJS 谎言数 | ✅ 0 | ❌ 多个 | ❌ 多个 | ❌ 多个 | ## 安装 ``` pip install invisible-playwright python -m invisible_playwright fetch # one-time ~100 MB download, SHA256-verified ``` 支持的平台:**Windows x86_64**,**Linux x86_64**。 ## 用法 ### 每个会话随机指纹 **100% 兼容 Playwright** —— 支持同步和异步,包含所有方法,零 API 改动。如果您已经在使用 Playwright,只需修改两行代码即可切换: ``` - from playwright.sync_api import sync_playwright - with sync_playwright() as p: - browser = p.firefox.launch() + from invisible_playwright import InvisiblePlaywright + with InvisiblePlaywright() as browser: ``` 每个会话都会从真实的 Firefox 遥测数据(GPU / 音频 / 字体 / 约 400 个其他字段)中获取一个独特且连贯的指纹,并且浏览器内置了贝塞尔曲线鼠标轨迹。 **同步** ``` from invisible_playwright import InvisiblePlaywright with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser: page = browser.new_page() page.goto("https://example.com") page.click("#submit") # mouse arcs to the button on a Bezier curve ``` **异步** ``` from invisible_playwright.async_api import InvisiblePlaywright async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser: page = await browser.new_page() await page.goto("https://example.com") await page.click("#submit") ``` 这里的 `browser` 对象是 `playwright.sync_api.Browser` / `playwright.async_api.Browser` —— 所有 Playwright 方法均可直接原样使用。 ### 每个会话随机指纹 ``` from invisible_playwright import InvisiblePlaywright with InvisiblePlaywright() as browser: page = browser.new_page() page.goto("https://creepjs-api.web.app") ``` 每次调用都会抽样生成一个新的连贯配置文件。记录 seed 以便重现感兴趣的运行结果: ``` sf = InvisiblePlaywright() with sf as browser: print("seed =", sf.seed) # ... ``` ### 可重现的指纹 ``` with InvisiblePlaywright(seed=42) as browser: ... # same GPU, same canvas hash, same audio context, every run ``` ### 代理 ``` proxy = { "server": "socks5://gate.example.com:1080", "username": "user", "password": "pass", } with InvisiblePlaywright(proxy=proxy) as browser: ... ``` 支持的协议:`socks5`、`socks4`、`http`、`https`。所有协议均支持身份验证(SOCKS5 通过修补的 `nsProtocolProxyService.cpp` 实现,HTTP/HTTPS 通过 Playwright 实现)。默认情况下,DNS 通过代理进行路由,不会发生本地泄露。 ### 固定特定指纹字段 默认情况下,所有信息均由 `seed` 生成。要强制指定特定值,同时保持其余部分由 seed 派生,请执行以下操作: ``` with InvisiblePlaywright( seed=42, pin={ "gpu.renderer": "ANGLE (NVIDIA, NVIDIA GeForce RTX 4090 Direct3D11)", "gpu.vendor": "Google Inc. (NVIDIA)", "screen.width": 2560, "screen.height": 1440, "hardware.concurrency": 16, }, ) as browser: ... ``` 可固定键的完整列表、固定如何与贝叶斯采样器交互,以及常见模式,请参阅 **[docs/pinning.md](docs/pinning.md)**。 ## CLI ``` invisible_playwright fetch # download the binary if missing invisible_playwright path # print the absolute path to the cached binary invisible_playwright version # wrapper and binary versions invisible_playwright clear-cache # remove all cached binaries ``` ## 许可证 MIT - 详见 [LICENSE](LICENSE)。修补后的 Firefox 二进制文件基于 MPL-2.0(Firefox 上游许可证)分发。生成该二进制文件的针对 mozilla-central 的 C++ 补丁位于 [feder-cr/firefox-stealth](https://github.com/feder-cr/firefox-stealth)。
标签:Bot检测, CreepJS, Cybersecurity, DNS 解析, ESC4, FingerprintJS, Firefox, Google搜索, OSINT, Playwright, Python, reCAPTCHA, Selenium替代, WebRTC, Web自动化, 代理, 反指纹检测, 反爬虫, 后渗透, 无后门, 无文件攻击, 浏览器指纹, 爬虫框架, 特征检测, 绕过检测, 网络安全, 逆向工具, 隐私保护, 隐身浏览器