请求直接返回 403 或 429 这类状态码一般对应哪些限制机制

有时候系统不跟你讲道理,而是直接给两种“硬错误”:

接口一调用就 403,怎么换参数都一样;
脚本刚提一点并发,整片 429,“Too Many Requests”;
更离谱的是,同样代码、同样账号,有时正常、有时秒返回错误。

大概印象里:

  • 403 = 禁止访问
  • 429 = 请求太多

但真到落地,你更需要知道的是:它们各自对应的是哪一类限制?自己到底踩了哪条线?

这篇就讲三个问题:

  1. 403 / 429 常见分别对应哪些机制
  2. 怎么快速判断自己撞的是哪一类
  3. 多账号 / 脚本 / 代理场景下,访问策略要怎么改,才能少撞硬墙

==============================

一、403 和 429 各自“在说什么”

先把直觉调一下:

  • 403 多半在说:“不允许你这样访问。”
  • 429 多半在说:“你太吵了,先停一停。”

(1)403 常见对应的限制

常见三大类:

① 权限 / 鉴权问题

  • 未登录、Cookie / Token 失效
  • 有登录,但角色没这个接口权限
  • 访问内网接口、白名单资源

本质:你是谁,或者你宣称的身份,不符合当前操作。

② IP / 区域限制

  • 某地区不开放(合规、牌照)
  • 某些 IP 网段被拉黑
  • 某些代理出口被标记为高风险来源

本质:你“从哪来”被拒绝。

③ WAF / 防火墙拦截

  • UA、Referer、Header 很“脚本味”
  • 请求体命中安全规则(疑似注入、恶意抓取)
  • 历史异常太多,被安全系统拉黑

本质:你的“请求长相”被判不安全。


(2)429 常见对应的限制

429 几乎都和“节奏 / 配额”有关:

① QPS(每秒请求数)超限

  • 单 IP 每秒最多 N 次
  • 单账号每秒最多 N 次
  • 超出就 429

② 时间窗口内总量超限

  • 每分钟 / 小时 / 日请求量上限
  • 超额度后,在窗口结束前都返回 429

③ 并发连接数限制

  • 同一来源最多同时开多少连接
  • 超出时,要么排队,要么直接 429

④ 平台自保护

  • 服务器整体压力高,自动降低单个来源限额
  • 你刚好撞在“限额收紧”的时间段里

本质:你“多快、多密、多并发”这三件事踩线了。

==================================

二、怎么判断自己到底是踩了哪一条

别只是盯着状态码骂系统,可以按下面三个维度快速定位。


1 看响应内容:权限 vs 频率

很多平台会在响应体里给出暗示:

  • 403 的 body / message 常见关键词:
    permission / forbidden / not allowed / auth / token / geo / region / ip
  • 429 的 body 常见关键词:
    rate limit / too many requests / quota / retry-after / frequency

粗分思路:

  • 出现 permission / auth / role → 大概率账号 / 权限问题
  • 出现 geo / region / IP → 多半是出入口 / 区域限制
  • 出现 rate / quota / retry-after → 典型限流

2 换账号 / 换 IP / 换节奏试一次

三个小实验很有用:

  • 同 IP 换账号:
    只有部分账号 403 → 账号 / 权限 / 风控问题
  • 同账号换 IP:
    只有部分出口 403 或成功率极低 → 出口 / 线路问题
  • 频率砍半再试:
    429 明显减少 → 节奏就是罪魁祸首

3 看“时间维度”的规律

  • 高峰时段大量 429,低峰很少 → 平台整体限流 + 你节奏激进
  • 批量任务一跑,立刻 429 飙升 → 你自己的脚本在挤配额
  • 换代理供应商 / 换出口后突然 403 多 → 新出口画像不干净

这些规律,基本就是系统在告诉你:是哪种行为在触发防护。

c4f348db 660c 4056 9bb7 8946ae23e1cc md

=============================================

三、多账号 + 代理场景下,最容易“自己放大” 403 / 429

如果你在搞跨境、多账号、脚本,下面几件事非常容易踩雷。


1 把太多账号、太多请求堆在同一出口

  • 同一 IP 挂二三十个号
  • 同一时刻批量登录、批量拉数
  • 高危操作(搜索、改价、下单)都从一个出口打出去

平台视角:这条线像一台“脚本机”。
结果:IP 先进风控池,后面挂在这条线上的号一起受牵连,403 / 429 一路飞。


2 用错“身份”调错接口(403)

  • 普通号去打仅限管理员的接口
  • 直接调用内网 API 没走正常授权
  • Session 已失效但脚本继续狂调

平台用 403 告诉你:不是服务挂了,是你不该来。


3 没把限流写进设计,只在嘴上说“别太快”

  • 开发阶段手动点几下,当然没问题
  • 上线直接把并发翻几倍,没有 QPS / 退避限制
  • 收到 429 还立刻重试,把配额用得更快

结果:一段时间“好像都能跑”,真正想放量时,被 429 按在地上摩擦。

=================================

四、遇到 403 / 429,怎么“改姿势”少挨打


1 先把“谁能调什么”写清楚(针对 403)

  • 明确不同账号可以访问的接口范围,按角色 / 场景分清楚
  • 脚本不要用主号到处乱打高权限接口
  • 登录尽量走正常流程,按前端逻辑带上 Cookie / Token / UA 等信息

这一步做完,很多莫名其妙的 403 会直接消失。


2 把“频率策略”写进代码(针对 429)

  • 为每个接口设上限:
  • 单 IP QPS 上限
  • 单账号 QPS 上限
  • 总体 QPS 上限
  • 按时间窗口做节流:
  • 每秒 / 每 10 秒 / 每分钟的调用量限制
  • 收到 429 时采用退避重试:
  • 例如间隔 1s → 3s → 10s
  • 而不是原地疯狂重试

一句话:用节奏换寿命,用总耗时换成功率。


3 把“出口策略”做成配置,而不是大家乱配

  • 高价值链路(登录、支付、投放后台)走更稳、更干净的出口
  • 只拉公开数据的爬虫、历史报表,用成本更友好的线路
  • 不同业务用不同出口池,不要所有流量挤在一条线上互相拖累

这块如果靠自己写一堆代理脚本,很容易乱。
更好的做法是用一层专门的出网基础设施托底,比如 穿云代理

  • 在穿云后台按业务建线路池:
  • 登录池、运营池、爬虫池、灰度测试池等
  • 每个池单独设:地区、线路类型(机房 / 住宅 / 原生住宅)、轮换规则、会话时长、并发上限
  • 通过穿云面板看每个池的成功率、403 / 429 占比、延迟曲线
  • 某条线路表现差,一键剔除,不用到每台机器改代理配置

上层业务只关心:
“这类请求走哪个池子”,
具体哪条 IP、如何轮换、如何健康检查,都交给穿云代理托底。

========

403 和 429 不是随机坏运气,而是平台明确在说:

  • 403:你现在的身份 / 出口 / 接入方式不行了;
  • 429:你现在的请求节奏和额度使用方式不行。

当你:

  • 把权限和访问路径理顺;
  • 把限流和退避策略写进代码;
  • 用穿云代理这样的统一出口,把不同业务拆到不同、可控的线路池上,

这两类状态码就不再是“今天怎么又出问题了”的玄学,
而是可以被监控、被解释、被慢慢优化掉的信号。

系统不是在“针对你”,而是在提醒你:
——该换一种更像正常用户、更可持续的使用方式了。