名称: camoufox-stealth
描述: 使用 Camoufox(定制版 Firefox)在隔离容器中实现 C++ 级别的反机器人浏览器自动化。可绕过 Cloudflare Turnstile、Datadome、Airbnb、Yelp 等防护。优于仅进行 JS 层面修补的 Chrome 方案(如 undetected-chromedriver、puppeteer-stealth)。适用于标准 Playwright/Selenium 被拦截的场景。
元数据:
openclaw:
emoji: "🦊"
requires:
bins: ["distrobox"]
env: []
C++ 级别的反机器人规避方案,使用 Camoufox —— 一个将隐身补丁直接编译进浏览器本身的定制 Firefox 分支,而非通过 JavaScript 后期附加。
| 方案 | 检测层级 | 工具 |
|---|---|---|
| Camoufox (本技能) | C++ 编译补丁 | 浏览器内置的不可检测指纹 |
| undetected-chromedriver | JS 运行时补丁 | 可通过时序分析检测 |
| puppeteer-stealth | JS 注入 | 页面加载后应用补丁 = 可被检测 |
| playwright-stealth | JS 注入 | 存在相同限制 |
Camoufox 在源代码层面修补 Firefox —— WebGL、Canvas、AudioContext 指纹是真实被伪造的,而非通过 JavaScript 覆盖来掩盖,后者可被反机器人系统检测到。
puppeteer-stealth 或 undetected-chromedriver 已失效| 工具 | 层级 | 最佳适用场景 |
|---|---|---|
| Camoufox | C++ 补丁 | 所有受保护网站 - Cloudflare、Datadome、Yelp、Airbnb |
| curl_cffi | TLS 指纹伪造 | 仅 API 端点 - 无需 JS 执行,速度极快 |
所有脚本均在 pybox distrobox 容器中运行以实现隔离。
⚠️ 请明确使用 python3.14 - pybox 容器可能安装了多个 Python 版本,且各自安装了不同的包。
# 在 pybox 容器中安装工具(使用 python3.14)
distrobox-enter pybox -- python3.14 -m pip install camoufox curl_cffi
# Camoufox 浏览器会在首次运行时自动下载(约 700MB 的 Firefox 定制版)
浏览器模式 (Camoufox):
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py "https://example.com" --headless
仅 API 模式 (curl_cffi):
distrobox-enter pybox -- python3.14 scripts/curl-api.py "https://api.example.com/endpoint"
┌─────────────────────────────────────────────────────────┐
│ OpenClaw 代理 │
├─────────────────────────────────────────────────────────┤
│ distrobox-enter pybox -- python3.14 scripts/xxx.py │
├─────────────────────────────────────────────────────────┤
│ pybox 容器 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Camoufox │ │ curl_cffi │ │
│ │ (Firefox) │ │ (TLS 伪造) │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
数据中心 IP(AWS、DigitalOcean 等)在 Airbnb/Yelp 上会立即被封锁
必须使用住宅或移动代理:
# 代理配置示例
proxy = "http://user:pass@residential-proxy.example.com:8080"
查看 references/proxy-setup.md 了解代理配置详情。
Airbnb/Yelp 等网站会进行行为分析。为避免检测:
⚠️ 旧的 --headless 标志可被检测。可选方案:
headless="new"(Chrome 109+)# Xvfb 方案 (Linux)
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99
python scripts/camoufox-fetch.py "https://example.com"
| 问题 | 解决方案 |
|---|---|
| 立即显示“访问被拒绝” | 使用住宅代理 |
| Cloudflare 验证循环 | 尝试使用 Camoufox 而非 Nodriver |
| 浏览器在 pybox 中崩溃 | 安装缺失的依赖:sudo dnf install gtk3 libXt |
| TLS 指纹被拦截 | 使用 curl_cffi 并设置 impersonate="chrome120" |
| 出现 Turnstile 复选框 | 添加鼠标移动,增加等待时间 |
ModuleNotFoundError: camoufox |
使用 python3.14,而非 python 或 python3 |
greenlet 段错误 (退出码 139) |
Python 版本不匹配 - 明确使用 python3.14 |
libstdc++.so.6 错误 |
NixOS 库路径问题 - 在 pybox 中使用 python3.14 |
pybox 容器可能安装了多个 Python 版本,且各自拥有独立的 site-packages:
# 检查哪个 Python 安装了 camoufox
distrobox-enter pybox -- python3.14 -c "import camoufox; print('OK')"
# 错误用法(可能使用了不同的 Python)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py ...
# 正确用法(明确指定版本)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py ...
如果遇到段错误或导入错误,请始终明确使用 python3.14。
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py \
"https://www.airbnb.com/rooms/12345" \
--headless --wait 10 \
--screenshot airbnb.png
distrobox-enter pybox -- python3.14 scripts/camoufox-fetch.py \
"https://www.yelp.com/biz/some-restaurant" \
--headless --wait 8 \
--output yelp.html
distrobox-enter pybox -- python3.14 scripts/curl-api.py \
"https://api.yelp.com/v3/businesses/search?term=coffee&location=SF" \
--headers '{"Authorization": "Bearer xxx"}'
持久化会话允许跨运行复用认证状态,无需重复登录。
# 1. 交互式登录(打开有头浏览器)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \
--profile airbnb --login "https://www.airbnb.com/account-settings"
# 在浏览器中完成登录,然后按 Enter 键保存会话
# 2. 在无头模式下复用会话
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \
--profile airbnb --headless "https://www.airbnb.com/trips"
# 3. 检查会话状态
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \
--profile airbnb --status "https://www.airbnb.com"
| 标志 | 描述 |
|---|---|
--profile NAME |
用于会话存储的命名配置文件(必需) |
--login |
交互式登录模式 - 打开有头浏览器 |
--headless |
在无头模式下使用已保存的会话 |
--status |
检查会话是否有效 |
--export-cookies FILE |
将 Cookie 导出为 JSON 备份 |
--import-cookies FILE |
从 JSON 文件导入 Cookie |
~/.stealth-browser/profiles/<name>/700,文件 600_、-(1-63 个字符)脚本通过多种信号检测会话是否过期:
/login, /signin, /auth如果在 --headless 模式下检测到登录墙,您将看到:
🔒 登录墙信号:url-path, password-form
请使用 --login 重新运行以刷新会话。
由于 --login 需要可见的浏览器,您需要进行显示转发:
X11 转发 (推荐):
# 使用 X11 转发连接
ssh -X user@server
# 运行登录(浏览器将在您的本地机器上打开)
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \
--profile mysite --login "https://example.com"
VNC 替代方案:
# 在服务器上:启动 VNC 会话
vncserver :1
# 在客户端:连接到 VNC
vncviewer server:1
# 在 VNC 会话中:运行登录
distrobox-enter pybox -- python3.14 scripts/camoufox-session.py \
--profile mysite --login "https://example.com"
⚠️ Cookie 等同于凭证。 请像对待密码一样对待配置文件目录:
- 配置文件目录权限为 chmod 700(仅所有者)
- Cookie 导出文件权限为 chmod 600
- 不要在不安全的渠道共享配置文件或导出的 Cookie
- 考虑对备份进行加密
| 限制 | 原因 |
|---|---|
| localStorage/sessionStorage 无法导出 | 使用浏览器配置文件替代(可自动处理) |
| IndexedDB 不可移植 | 存储在浏览器配置文件中,无法通过 Cookie 导出 |
| 不支持并行访问同一配置文件 | v1 版本无文件锁;每个配置文件使用一个进程 |