← 全部文章

Proxy 端口:用户名中的定位与 Session 配置

FourA proxy 端口直接从用户名中读取网络、国家和粘性 session 配置;若有拼写错误,将返回 400 并列出有效键名。以下是完整的语法规则。

更新内容

漏掉一个字母就可能导致错误。在 proxy 用户名中输入 -contry-de,这个拼写错误就摆在眼前,看起来却和有效选项毫无二致。

FourA proxy 端口会对此返回 400 响应,并列出其支持的所有键。这是该产品的一个细节,该产品已于 9 月 15 日结束测试:为任何支持代理的客户端(浏览器、下载工具、现有的爬虫程序)提供位于我们出口节点的 proxy URL,无需编写 API 调用。在 Dashboard 中创建 proxy 用户,粘贴该字符串,隧道和流量就会像 API 请求一样计入你的套餐。

以下是完整的语法规则以及每条规则的设计原因。

工作原理

该端口运行在 proxy.foura.ai:34004,采用带 Basic 认证的 HTTP CONNECT 协议,目标端口支持 443 和 80。凭据使用 proxy 用户,特意与你的 API key 分开:proxy 握手以明文传输,并且 proxy 用户可以重置密码,而无需改动你的 API 集成代码。

凭据后面的所有内容均为 -key-value 键值对列表,顺序不限:

# Shared network, a German address, one sticky session for this job
curl -x "http://USERNAME-country-de-session-job42:PASSWORD@proxy.foura.ai:34004" \
  https://example.com

# Premium network, an Android address in Germany, held 30 minutes
curl -x "http://USERNAME-network-premium-country-de-os-android-session-s1-lifetime-30:PASSWORD@proxy.foura.ai:34004" \
  https://example.com

Shared 代表 FourA 自建出口节点:这是默认选项,已包含在您的套餐中。Premium 为住宅 IP,消耗套餐内的 Premium 流量以及额外购买的额度。在 Shared 网络上,-fallback-premium 允许在 Shared 出口无法承载连接时自动故障转移至 Premium 出口。该功能默认关闭,且仅在 Premium 额度有剩余时触发。默认开启则意味着代您决定消耗该额度。

Country 参数支持重复指定,因此 -country-de-country-fr 表示覆盖两个国家。Region、city、基于 AS 编号的网络定位、device(windows、android、ios、mac)以及 lifetime(3 到 1440 分钟)仅限 Premium 使用。在 Shared 网络上请求 city 会直接返回 400,而不是尽力交付。Shared 仅支持按国家筛选,无法进行更细粒度的定位,因为大多数情况下无法保证生效的城市过滤比没有过滤更糟糕。

-session-<name>(1 到 32 个字母、数字或下划线)用于启用会话保持:所有携带该名称的连接共享同一个 IP 地址。在 Shared 网络上,该地址在 10 分钟滑动窗口内有效,持续使用即可一直维持。在 Premium 网络上,它会保持您设定的 lifetime 时长,或遵循网络默认值。若不设置 session,每次连接都会使用新的 IP 地址。

此外还支持保存默认配置。在控制台中为 proxy 用户保存的目标定位会应用于其发起的每一次连接,因此连接字符串可以精简至仅包含凭证。用户名中的参数仍然优先应用于当前连接,any 可以覆盖已保存的值:-city-any 会让预设为慕尼黑的密钥改为请求整个德国范围。支持在 CONNECT 中添加 header 的客户端(如 curl 使用 --proxy-header)可以发送与 X-Foura-Country、X-Foura-Session 等相同的选项,且 header 的优先级高于用户名。

实际影响

大部分改进体现为您不再需要排查常见问题。

为什么请求被拒绝? 凭证验证通过后的每次拒绝都会携带一个包含单行原因说明的 X-Foura-Error header。400 错误会指出具体选项及其实际接受的值。429 错误会指明达到了套餐中的哪项配额:并发隧道数、每分钟新建隧道数,或计费周期的标准流量。

额度属于谁? 属于账户。隧道数和新建次数按账户统一计算,而不是按 proxy 用户计算,因此添加新凭证不会获得额外额度。传输字节计入套餐带宽,Premium 字节计入该总量内的 Premium 额度,而非叠加计算。在按积分计费的套餐中,端口包含自带的 GB 流量,可在“计费”页面进行充值。未建立隧道时不计费。

凭证归谁所有? 凭证现在可以归组织所有,因此某位员工离职不会导致公司的下载服务中断。成员可以使用并查看其密码;管理员和所有者可以轮换、禁用或重新配置目标定位;只有所有者可以将其移出组织。

**它有什么作用?**在 Overview、Metrics 或 Activity 上将 Product 开关切换为 Proxy:隧道具有与 API request 相同的结果分类、当前打开的数量、建立耗时和流量,并按 proxy user、目标、出口国家或 client IP 进行细分。已分配地址的 session 通常能在 1 秒内完成连接。

但该端口本质上是一根管道,这也是权衡所在。你的客户端通过该隧道与目标站点通信,因此浏览器配置文件、你的 validate rules 和交互式页面处理均不在该路径中。它还会计量字节:通过已建立隧道返回的拒绝页面与其他数据一样计入流量字节,而在 API 上,未成功的 request 则不计费。普通数据传输走端口;将有反爬阻拦的页面交给 API 处理。

高级用户指南

当高级配额耗尽后,进入该网络的三种路由会故意返回三种不同的响应。显式指定 -network-premium 的连接会被拒绝并返回明确说明的 403,因为如果静默降级路由,调用方会持续请求,随后在账单中查找从未生效的高级线路扣费。回退机制根本不会触发,而保存在 proxy user 上的高级默认设置会降级到共享网络,因此隧道仍会打开。这两种情况都没有选择为该连接付费。

有三种组合会被直接拒绝,而不是部分执行:共享网络上的精细定向、-fallback-premium 与 -network-premium 同时使用,以及在启用回退时使用精细定向。该端口仅支持 CONNECT,因此转发普通 http:// request 而非建立隧道的客户端会收到 405(curl 使用 --proxytunnel 建立隧道)。通过该端口驱动的浏览器应始终携带 session 名称,因为单次页面加载就会打开数十个连接。

多个 worker 各自使用独立地址?为每个 worker 分配独立的 session 名称:

import requests

TEMPLATE = "http://USERNAME-country-de-session-{name}:PASSWORD@proxy.foura.ai:34004"

def worker_session(name):
    proxy = TEMPLATE.format(name=name)
    s = requests.Session()
    s.proxies = {"http": proxy, "https": proxy}
    return s

workers = [worker_session(f"w{i}") for i in range(4)]
print(workers[0].get("https://example.com").status_code)

Dashboard 同样支持规模化操作:设置 Sticky,选择数量,Connection string 标签页便会为每个地址列出一行,格式可为 URL 或适用于 proxy 管理器的 host:port:user:pass。遇到请求被拒绝感到困惑?在 curl 调用中添加 -sv 并 pipe 到 2>&1 | grep -i x-foura-error。所有选项均可在 proxy 端口参考中找到,Dashboard 端相关内容请见 Proxy Users。

下一步计划

我们基于 proxy users 构建的第一个客户端就是我们自己的产品。FourA Chrome 扩展程序让你的浏览器通过其中一个 proxy 进行连接:选择网络和国家/地区,打开开关,状态栏就会显示目标网站所看到的地址。目前它处于 beta 阶段,未上架 Chrome Web Store,可在开发者模式下从 Dashboard 的 Tools 中安装。后续规划中,组织计费已列入公开路线图,这在当前架构下很重要,因为组织的 proxy user 会直接向该组织的当前所有者计费。

Proxy URL 是存在时间最久的集成契约,你拥有的每个工具早已支持该协议。真正值得做好的从来不是隧道本身,而是前面的字符串被赋予了什么含义,以及配置错误时会发生什么。