全部文章

推出 Auto:适用任意目标的统一 endpoint

Auto endpoint 会为每个 request 选择 Single、Proxy Finder 或 Browser,处理反爬虫挑战,并返回可供下次调用复用的 session。

更新内容

现在,/api/auto endpoint 是为任意 URL 获取有效 response 的最短路径。只需将其指向目标。Auto 会自动选择是通过 Single、Proxy Finder 还是 Browser 运行 request,在遇到反爬验证时自动处理,并返回一个可供下次调用复用的 session。

一个 endpoint。支持任意目标。无需你在客户端切换模式。

这就是其核心设计。本文接下来的部分将介绍它的工作原理、计费方式以及需要注意的边界情况。

工作原理

Auto 底层采用阶梯式策略(先低成本,后高成本)。在每次请求中,Auto 会逐级向上尝试,直到某一级别返回符合你 validate 规则的 response。

具体级别顺序如下:

  1. 缓存的 session。 如果 Auto 保留了来自上一次调用的同 host 热 session,会首先通过该 session 重放。这是成本最低的路径。
  2. Proxy Finder。 轮换 proxy request。适用于主要依赖 IP 声誉进行防护的站点。
  3. Browser。 完整的页面渲染,执行 JavaScript,解决反爬验证,并收集站点下发的 cookie。

一旦某个级别请求成功,Auto 会保存找到的 session:包括使用的 proxy id、站点下发的 cookie 以及 User-Agent。下次对同一 host 发起调用时,Auto 会首先尝试该 session。如果仍然有效,你只需支付低成本级别的费用,无需承担高成本。

最简调用示例:

curl -X POST "https://api.foura.ai/api/auto" \
  -H "X-API-Key: pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/data",
    "validate": { "status": { "accept": [200] } }
  }'

精简后的 response:

{
  "status": 200,
  "data": "...",
  "headers": [...],
  "meta": {
    "rung": "cache",
    "solved": false,
    "attempts": 1,
    "credits": 2
  },
  "session": {
    "proxy": "CLN1B8",
    "cookies": [{ "name": "cf_clearance", "value": "..." }],
    "userAgent": "..."
  }
}

有两个字段对后续构建至关重要。meta.rung 会标明哪个路径胜出。session 是一个三元组,可以直接传入 /api/single 调用,以便自行重放同一个出口。proxy 字段是一个不透明的 base36 ID(不包含原始 IP),可以安全记录在日志中,也便于在不同系统间传递。

实际效果

这里有两个核心指标。

对受保护站点的首次调用会运行 Browser 梯级:渲染、解题、收集 cookie 并返回页面。这大约消耗 10 个积分。一旦 Auto 为该主机缓存了可用会话,后续调用就会直接重放:通过 Single 仅需 2 个积分;如果该会话的 cookie 支持任意地址,则通过 Proxy Finder 消耗 4 个积分。因此第二次调用的成本最高可降低 5 倍,且只要会话有效,后续每次调用都维持低费率。我们在上线期间的生产环境中对此进行了实测:无需 cookie 的出口一旦确定,每次重放调用精确消耗 2 个积分,而此前每次请求走 Proxy Finder 时都需要 10 个积分。

第二个指标:失败的梯级不计费。如果 Auto 尝试了三个代理且均返回 403,直到第四个代理成功返回内容,系统仅对第四次调用计费。你只需为成功交付的内容付费,无需为搜索过程买单。

这就是核心价值所在。高成本梯级仅运行一次,后续持续运行低成本梯级,而且你无需自行编写缓存逻辑。

另外两项特性同样值得关注,它们解决了生产环境中的实际痛点:

受地理限制的目标不再浪费出口。 当某个站点对大多数出口返回 451(或法律限制拦截页)时,Auto 会学习哪些国家能够成功交付内容。在下一次调用中,它会优先从这些国家拉取新的出口,并在这些出口之间分散并发负载。这样可以避免单个幸运出口被过度请求而触发 rate limit。

Validate 会在每个梯级运行。 内容错误的页面(例如返回 200 状态码但正文为法律声明的地理限制拦截页)绝不会被计为成功。如果你的 validate.data.fail 包含 "legal reasons",Auto 会持续尝试,直到某个梯级通过校验。无论是缓存梯级还是其他任何梯级都必须通过验证。如果全部未通过,你将收到包含真实原因的明确失败响应。

进阶配置

在大规模使用 Auto 时,以下几个配置参数非常重要。

timeout_ms 是整个操作的总预算,而非针对单个梯级。默认值为 120 秒。Auto 会自动分配该预算:每个子调用的超时时间为 min(自身原生超时时间, 剩余预算),当剩余时间不足时梯级链将停止启动新梯级。对于交互式低延迟场景,建议设置为 20,000。对于容忍较长尾部延迟的大规模抓取,保持默认值即可。

forceProxy 默认开启。除非设置了 forceProxy: false,否则 Auto 绝不会从 FourA 的源 IP 访问目标。需要注意:某些站点(例如带有 IP 信任门控的交互式 Cloudflare)在干净的数据中心 IP 下的表现实际上优于低信任度的住宅出口。因此 forceProxy: false 可能会让特定目标的访问变得更容易,而不是更难。如果你发现特定主机频繁出现质询,可以尝试关闭该选项。

ignoreProxies 是一个客户端规避列表。传入已知失效的 proxy id(例如来自先前在你方触发 rate limit 的 session.proxy),Auto 将在所有环节跳过它们:热 session 复用、出口节点检索以及对 Proxy Finder 的子调用。这样 Auto 就不会重新选取你明确要求规避的出口节点。

meta 还支持在其基础上构建自定义仪表盘:监控哪些主机当天触发了浏览器层级、每次成功交付的平均重试次数,以及通过 challenge 的抓取与正常抓取的比例。如果某个主机的消耗突然从 2 credits 飙升到 10 credits,这就是 session 失效的信号,你可以在账单超支前及时处理。

组合全部四项特性的示例:

import requests

r = requests.post(
    "https://api.foura.ai/api/auto",
    headers={"X-API-Key": "pk_live_..."},
    json={
        "url": "https://example.com/product/9876",
        "timeout_ms": 30000,
        "forceProxy": True,
        "ignoreProxies": ["CLN1B8", "K7X9AB"],
        "validate": {
            "status": {"accept": [200]},
            "data":   {"accept": ['"price":'], "fail": ["captcha", "legal reasons"]}
        }
    }
).json()

# If Auto delivered, keep the session for the next call to this host
if r.get("status") == 200 and "session" in r:
    session = r["session"]                              # {proxy, cookies, userAgent}
    print(r["meta"]["rung"], r["meta"]["credits"], r["meta"]["attempts"])

关于 validate schema 本身,请参阅 《验证规则现已决定何为成功请求》 中的前期详解。

后续规划

目前 Auto 的路线图上有两项重点内容。

首先是 Dashboard 将支持 Session 检查功能。目前 Auto 针对每个 host 保持的 session 仅存储在服务内部,当你在本地调试异常消耗时无法进行排查。我们正在开发基于 host 的 session 视图,方便你查看缓存的 session、存活时间、剩余有效期以及每个 session 的梯级切换历史记录。此外还会提供手动丢弃 session 的按钮,便于在目标站点发生变化且确认缓存失效时进行清理。

接下来是更严格的成本控制机制。包括单次 request 的 credit 硬性上限(单次调用绝不超过 X,超额即明确报错)以及针对无需浏览器梯级场景的“仅单次模式”。这两项功能目前均处于特性开关控制阶段。

Auto 的核心价值在于免去选择调用哪款产品的负担。但这并不意味着黑盒运行。每个 response 都会返回实际采用的梯级和建立的 session。查阅这两个字段,即可准确掌握每次调用的成本构成。