← 全部文章

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 密钥分开: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 为住宅地址,从套餐包含的 premium 流量及您额外购买的额度中扣除。在 shared 网络上,-fallback-premium 允许连接在 shared 出口无法承载时切换至 premium 出口。该功能默认关闭,且仅在 premium 额度尚存时生效。若默认启用,则意味着代表您做出消耗该额度的决定。

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

-session-<name>(1 到 32 个字母、数字或下划线)可实现会话粘性:携带该名称的每个连接共享同一个地址。在 shared 网络上,地址在 10 分钟滑动窗口内保持有效,只要持续使用就会一直保留。在 premium 网络上,地址保持时间为您设置的 lifetime,或网络默认值。若省略 session,每个连接都会从新地址发起。

此外还有保存的默认配置。在控制台中为 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 额度,绝不会重复叠加。在按点数计费的套餐中,端口带有自带的吉字节额度,可在账单页面进行充值。未建立隧道时不会产生任何计费。

凭据归谁所有? 凭据现在可以归属于组织,因此公司的下载程序不会因某位员工离职而中断。成员可以使用凭据并读取其密码;管理员和所有者可以轮换、禁用或重新配置目标定位;只有所有者才能将其移出。

它有什么作用? 将 Overview、Metrics 或 Activity 页面的 Product 开关切换至 Proxy:隧道会归入与 API requests 相同的结果类别,显示当前打开的数量、建立时间与流量,并按 proxy 用户、目标、出口国家或客户端 IP 进行拆分。已有地址的 session 通常在远低于一秒的时间内完成连接。

但端口只是一条管道,这也是需要权衡的地方。客户端通过隧道与目标网站直接通信,因此 unblocker、你的 validate rules 以及基于浏览器的 challenge 求解均不在该链路中。它同样按字节计费:通过已建立隧道返回的拒绝访问页面与其他数据一样计入流量,而在 API 上,未成功的 request 则不计费。常规传输走端口;遇到反爬阻拦的页面请走 API。

进阶用户指南

一旦 premium 配额耗尽,进入该网络的三种路由方式会特意返回三种不同的响应。显式指定 -network-premium 的连接会被直接拒绝并返回明确说明的 403,因为若静默改用其他网络提供服务,调用方会持续发起请求,随后在账单中查找从未生效的 premium 扣费项。fallback 机制不会触发,而保存在 proxy 用户上的 premium 默认设置则会降级至共享网络,使隧道仍能正常建立。这两种情况均未选择在该连接上产生额外费用。

以下三种组合会被直接拒绝,而非部分妥协执行:在共享网络上使用更精细的定向、-fallback-premium 与 -network-premium 同时使用,以及在已启用 fallback 的情况下使用更精细的定向。该端口仅支持 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 或供代理管理器使用的 host:port:user:pass。遇到请求被拒?在 curl 调用中添加 -sv 并 pipe 到 2>&1 | grep -i x-foura-error。所有选项均可在 proxy port 参考文档中查看,Dashboard 相关配置见 Proxy Users。

下一步计划

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

代理 URL 是现存最古老的集成契约,你的所有工具都早已原生支持。真正值得做好的从来不是隧道本身,而是前面的字符串被赋予了什么含义,以及在配置错误时会发生什么。