Camoufox Proxy 和 GeoIP:您的出口 IP 是指纹
启用 geoip 后,Camoufox 从代理的出口 IP 派生您的时区、语言环境、坐标和伪装的 WebRTC 地址。这使得一个标记错误的代理比没有代理更显眼。
大多数 Camoufox 代理教程在设置 proxy 和 geoip=True 的两行代码时就停止了。后果是没有人写下来的:启用 geoip 后,Camoufox 从代理的出口 IP 派生您的时区、语言环境、纬度、经度和伪装的 WebRTC 地址。代理不再是网络跳跃,而成为整个身份的真实来源。提供一个标记错误或回收的出口,Camoufox 就会围绕谎言构建一个完美一致的指纹——比没有伪装的信号更强。这里是设置、用户在 Google 上搜索的错误、SOCKS5 间隙,以及如何首先检查出口。
geoip 实际上从您的代理中派生了什么
Camoufox 是一个反检测的 Firefox 构建,封装了 Playwright 的 Python API,因此代理配置是 Playwright 形状的。地理层是其与众不同之处。根据项目文档,geoip=True(或目标 IP 地址)使 Camoufox 使用目标 IP 的经度、纬度、时区、国家和语言环境,并伪装 WebRTC IP 地址——然后更进一步,从该地区的语言使用者分布中计算浏览器语言,而不是默认使用该国的官方语言。查询在一个 MaxMind 格式的数据库中运行,该数据库作为可选附加组件提供:
pip install -U "camoufox[geoip]"
python -m camoufox fetch
[geoip] 附加组件在打包意义上是可选的——文档称其在使用代理时强烈推荐,这种说法还不够。没有它,您将获得一个在主机机器的时区和语言环境上运行的隐身浏览器,而其 IP 声称位于另一个国家。以下是使用经过身份验证的 HTTP 网关的最小工作设置:
from camoufox.sync_api import Camoufox
with Camoufox(
geoip=True,
humanize=True, # cursor movement, not a fingerprint setting
headless=False,
proxy={
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER",
"password": "PASS",
},
) as browser:
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body")) # should be the exit IP, not yours
请注意 proxy 字典的形状:凭证放在单独的 username 和 password 字段中,永远不要放在 server URL 中。这是从 Playwright 继承的,也是这里经过身份验证的代理无痛的原因——没有扩展填充,没有身份验证对话框需要关闭。异步 API 通过 AsyncCamoufox 是相同的。有关如何与其他隐身堆栈进行比较,请参阅我们关于反检测框架中经过身份验证的代理支持的地图。
为什么错误的代理会暴露您
反机器人系统很少仅仅寻找一个错误的值。它们寻找矛盾——两个信号不能同时对同一个人类都是真实的。一个浏览器报告 Europe/Rome,而其 IP 定位到俄亥俄州就是一个例子。Camoufox 的 geoip 功能旨在消除这类矛盾,并且它做得很好。问题在于它总是以 IP 的利益来解决矛盾。如果数据库显示您的出口在德国,但地址是一个回收的数据中心范围,半个互联网已经将其标记为代理,Camoufox 将忠实地将您的浏览器打扮成一个德国家庭用户,坐在一个没有德国家庭用户使用过的 ASN 上。
这使得出口质量成为一个指纹问题,而不仅仅是一个阻止问题。每次运行都应该进行两个检查:出口的真实 ASN 和国家,以及 IP 是否已经携带欺诈或代理评分。我们的免费IP 质量检查器可以回答这两个问题,而在 200 多个国家的真实 ISP 范围内的住宅代理是使派生身份可信的关键。没有任何东西可以免除您下面的层——引擎仍然发出 TLS 握手,而JA3/JA4 指纹识别在您的伪装值发送之前就读取了它。

您将实际遇到的 Camoufox 代理错误
三个失败主导了问题跟踪器,它们都不意味着您的凭证错误:
InvalidProxy: Failed to connect to proxy——在浏览器启动之前引发,这是 geoip 的副作用。Camoufox 通过一系列公共 IP API 解析您的出口地址,以便知道要查询什么。这些端点是 HTTPS 的,因此无法 CONNECT 隧道 TLS 的代理即使通过它的普通 HTTP 成功,也会失败(讨论 #397)。删除geoip,同一个代理“工作”——完全错误的修复。Page.goto: NS_ERROR_PROXY_CONNECTION_REFUSED——Firefox 级别的拒绝。问题 #294 为launch_server()记录了这一点:在正常启动中工作的代理字符串在浏览器作为服务器启动并通过其 WebSocket 端点驱动时失败,凭证有效。首先在直接启动中验证代理,以便知道哪个层出了问题。- geoip 加上 IPv6 出口——在同一个数据库对 IPv4 正常的情况下,查询出错(讨论 #241)。在 IPv6 池上,自己解析地址并传入。
第一个和第三个案例的干净解决方法已被记录但使用不足:geoip 接受一个 IP 地址,而不仅仅是 True。通过同一个代理自己解析出口,然后将答案交给 Camoufox。您完全跳过了内部查询,并且作为奖励,您可以记录每个会话运行在哪个出口上:
import requests
from camoufox.sync_api import Camoufox
HOST = "gate.quantumproxies.io:PORT"
USER, PASS = "USER-session-a1b2", "PASS" # sticky session id in the username
PROXY = {"server": f"http://{HOST}", "username": USER, "password": PASS}
url = f"http://{USER}:{PASS}@{HOST}" # percent-encode odd characters
# 1) resolve the exit through the same gateway and session
exit_ip = requests.get(
"https://api.ipify.org", proxies={"http": url, "https": url}, timeout=15
).text.strip()
# 2) hand Camoufox the address instead of letting it discover one
with Camoufox(geoip=exit_ip, proxy=PROXY, humanize=True) as browser:
page = browser.new_page()
page.goto("https://browserscan.net")
print("session exit:", exit_ip)
两个细节很重要。使用粘性会话,以便在步骤一中解析的 IP 在步骤二中仍然是出口——在每次请求轮换下,这些是不同的地址,派生的地理信息从第一页加载开始就是错误的。并且对包含 @、: 或 # 的凭证进行百分比编码:字典形式是免疫的,URL 形式则不是。
Camoufox 和 SOCKS5:WebRTC 和认证差距
SOCKS5 是 Camoufox 用户卡住的地方,原因比缺少功能更有趣。问题 #368 完美地描述了这一点:没有携带 UDP 的代理,WebRTC 可能会暴露您。WebRTC 通过 UDP 协商,HTTP 代理仅支持 TCP,而 SOCKS5 是唯一具有 UDP 关联模式的常见协议——这就是人们在这里特别想要它的原因。Camoufox 的答案是从 geoip 数据中伪装 WebRTC 地址,而不是路由媒体路径,这涵盖了常见的泄漏。block_webrtc 选项完全移除表面,代价是看起来像一个禁用 WebRTC 的浏览器。
经过身份验证的 SOCKS5 是更难的差距。讨论 #334 是一个用户询问技巧并报告唯一有效的方法是运行一个本地代理服务器,将浏览器流量转发到具有登录名和密码的 SOCKS5 端点。这仍然是当前的状态,并且为您留下了三个选项,按优先顺序排列:
- 通过 IP 白名单进行身份验证。将您的机器或服务器地址添加到允许列表中,SOCKS5 端点完全不需要凭证。每个 QuantumProxies 计划都公开 HTTP 和 SOCKS5 端点,并支持将白名单作为 user:pass 的替代方案,这使得这成为一行修复而不是异国情调的修复。
- 使用同一网关的 HTTP 端口。除非您特别需要 UDP,否则在字典中使用凭证的 HTTP(S) 更少麻烦。我们关于SOCKS5 与 HTTP 代理的区别的分析涵盖了何时差异重要。
- 运行一个本地中继,接受
127.0.0.1上的未经身份验证的连接,并在上游添加凭证——来自 #334 的解决方法。将 Camoufox 指向socks5://127.0.0.1:1080,让中继进行身份验证。

在您信任 geoip 之前的预检清单
- 通过代理解析出口 IP,并将其与会话 ID 一起记录。如果您无法命名运行使用的地址,就无法调试它遇到的阻止。
- 检查出口的真实国家和 ASN 与池声称的是否一致。国家不匹配会毒害每个派生信号。
- 为整个浏览器生命周期固定一个粘性会话。会话中途轮换会更改指纹计算的旧 IP 下的 IP。
- 每个池加载一次指纹测试页面,而不是每个项目一次——时区、语言环境和 WebRTC 值随出口而变化。
- 为每个目标选择
block_webrtc或基于 geoip 的 WebRTC 伪装,并在会话内保持一致。
常见问题解答
如何在 Camoufox 中设置代理?
将一个 Playwright 风格的字典传递给 Camoufox() 构造函数:proxy={"server": "http://host:port", "username": "USER", "password": "PASS"}。凭证应放在单独的字段中,而不是在服务器 URL 中。与其一起添加 geoip=True,以便时区、语言环境和坐标从该出口派生,而不是从您的主机机器派生。
Camoufox 支持 SOCKS5 代理吗?
代理字典接受 socks5:// 服务器,但经过身份验证的 SOCKS5 是已知的痛点——讨论 #334 报告本地中继是唯一可靠的路线,完整的 SOCKS5 支持仍然是一个开放的增强请求(#368)。实际的解决方法是 IP 白名单,这完全消除了凭证要求,或使用网关的 HTTP 端口。
Camoufox 中的 geoip=True 做什么?
它在 MaxMind 格式的数据库中查找出口 IP,并使用结果设置浏览器的经度、纬度、时区、国家和语言环境,伪装 WebRTC 地址,并为该地区选择一个合理的语言。它需要安装 camoufox[geoip] 附加组件。您也可以传递一个 IP 字符串而不是 True 来跳过自我发现步骤。
为什么我会收到 InvalidProxy: Failed to connect to proxy?
因为 geoip 预检查无法通过您的代理访问公共 IP API。这些端点是 HTTPS 的,因此代理必须支持 CONNECT 隧道;仅转发普通 HTTP 的网关在这里会失败,而在其他地方看似工作。通过同一代理进行 HTTPS 请求测试,或自行解析出口并将其作为 geoip="1.2.3.4" 传递。
Camoufox 的 geoip 选项是生态系统中花钱在 IP 质量上而不是更多规避代码上的最佳理由。它解决了指纹一致性中最困难的部分——使浏览器与网络一致——并自动解决了这个问题,前提是网络说的是实话。先购买出口,然后启用 geoip。如果您需要 Chromium 而不是 Firefox,同样的原则也适用于我们的Patchright 代理设置指南。这是技术指导,而不是法律建议:在法律和目标条款内进行抓取。