Twitter API 429、403、401 错误:原因与解决方法
解决 X (Twitter) API 的 429 Too Many Requests、403 Forbidden 和 401 Unauthorized 错误:每个状态码在官方 X API 和 TwexAPI 上分别代表什么、该看哪些响应头、什么时候可以重试。
简短回答: 429 表示请求太多,需要等待;403 表示凭据有效,但没有权限做这件事;401 表示凭据缺失或错误。只有 429 等一等就能恢复。403 和 401 不改请求、凭据或权限,重试多少次都是同样的错误。
| 状态码 | 含义 | 先检查什么 | 能重试吗? |
|---|---|---|---|
| 429 Too Many Requests | 触发了速率限制、用量上限或账号每日上限 | x-rate-limit-reset 或 Retry-After 响应头 |
✅ 等到提示的时间后 |
| 403 Forbidden | 已通过认证,但无权调用这个接口、执行这个操作或访问这个账号 | 应用权限、令牌类型、授权范围、Credits、目标账号 | ❌ 先解决权限问题 |
| 401 Unauthorized | 凭据缺失、无效、过期或签名错误 | Authorization 头,以及用的是哪个 key 或 token |
❌ 先修正凭据 |
不管你是直接调 API,还是在工具里看到报错,处理方法都一样。Request failed with status code 401、status code 429 这类提示来自 HTTP 客户端(比如 n8n 和很多 Node.js 机器人使用的 axios),里面的状态码就是你调用的那个 API 返回的,含义相同。
先确认是哪个 API 返回的错误
同一个状态码,来源不同,原因也不同:
- 官方 X API(
api.x.com或api.twitter.com):错误遵循 X 开发者平台关于应用、项目、OAuth 和限流窗口的规则。 - TwexAPI(
api.twexapi.io):错误与你的 TwexAPI key、Credits,以及写操作时提供的 X 会话有关。完整列表见 TwexAPI 错误码参考。 - x.com 网页或 X App:浏览时出现的 “Rate limit exceeded” 来自 X 对你账号的限制,和任何开发者 API 都无关。
Twitter API 429 Too Many Requests
官方 X API
X 按接口限流,窗口通常是 15 分钟或 24 小时,并且按应用和按用户分别计算。每个响应都带有三个响应头:
| 响应头 | 含义 |
|---|---|
x-rate-limit-limit |
当前窗口允许的请求数 |
x-rate-limit-remaining |
当前窗口剩余的请求数 |
x-rate-limit-reset |
窗口重置时间(Unix 时间戳) |
超出限制时,X 返回 HTTP 429。旧的 v1.1 风格响应体会带错误码 88 和 Rate limit exceeded;新的 problem 响应使用 rate-limit-exceeded 类型。如果是账号用量达到上限而不是限流窗口用完,则返回 usage-capped。
解决方法:
- 等到
x-rate-limit-reset再请求。 提前重试只会再拿到一个429。 - 盯住
x-rate-limit-remaining。 在它归零之前就放慢速度,而不是等到报错。 - 留意每日上限。 发帖、点赞等部分写接口有按应用或按用户计算的 24 小时上限,等几分钟不会重置。
- 做缓存,把请求分散开。 不要反复拉取同一个资料或推文,也不要让所有任务都在整点同时启动。
在按量计费的 X API 上,限流和计费是分开的。请求没超限也照样计费,所以缓存既省配额也省钱。
TwexAPI
TwexAPI 的 429 可能是请求被限速,也可能是写操作时触发了 X 账号的上限(例如 X 错误码 344 发帖限制,或 502 每日私信上限)。有 Retry-After 响应头或 retry_after 字段时按它等待。账号的每日上限要等到重置周期结束,短暂重试没有用。退避和分页安全恢复见 速率限制。
浏览器里的 x.com 或 X App
X 会限制每个账号能加载的内容量。刷时间线时看到 “Rate limit exceeded”,先等一会儿再刷新,关掉多余的标签页和自动刷新插件,避开很多人共用的网络或 VPN 出口。如果只是想免登录看公开主页,可以用免费的 Twitter 查看器。
Twitter API 403 Forbidden
403 表示 X 或 TwexAPI 认出了你的凭据,但拒绝了这个请求。原样重试只会得到同样的 403。
官方 X API
| 原因 | 典型表现 | 解决方法 |
|---|---|---|
| 应用未加入项目或没有访问权限 | client-forbidden 问题类型;旧响应为错误码 453(“You currently have access to a subset of…”) |
使用挂在 Project 下的应用的密钥,并确认账号的访问级别包含该接口 |
| 令牌类型不对 | 用仅应用(app-only)Bearer Token 发帖、点赞、关注或发私信 | 改用用户上下文令牌:OAuth 1.0a 的 access token 和 secret,或 OAuth 2.0 用户令牌 |
| 缺少权限或授权范围 | 只读应用的用户令牌,或缺少 tweet.write 等 scope 的 OAuth 2.0 令牌 |
把应用权限改为 Read and write(需要私信再加 Direct Messages),然后重新生成 access token 和 secret,或让用户重新授权 |
| 资源受保护或不可用 | not-authorized-for-resource 问题类型 |
目标账号已设为私密或内容受限;请求当前用户能看到的内容 |
| 重复或受限的操作 | 发帖内容重复、推文限制了回复、已经点过赞 | 修改内容,或先确认当前状态再重试 |
修改应用权限不会更新已经生成的令牌。改成 Read and write 后必须重新生成用户令牌,否则发帖还是会返回 403。
TwexAPI
TwexAPI 返回 403 通常是以下几种情况:
- Credits 用完了:用 Get Balance 查余额,在 控制台 充值。
- 目标账号私密或被封禁:只有获批的关注者能看到它的帖子。请改为请求公开账号。
- 账号或操作受限:写操作用的 X 账号被封禁或锁定、推文限制了回复(X 错误码
433),或该操作需要 X Premium。
每条报错信息及对应解决方法见 错误码参考。
Twitter API 401 Unauthorized
401 表示请求没能证明你的身份。先修正凭据,原样重试永远不会成功。
官方 X API
- 请求头格式错误:仅应用请求必须是
Authorization: Bearer <token>。漏了Bearer前缀、多了引号、环境变量末尾带换行,都会返回401。 - 凭据已重新生成或被吊销:在开发者后台重新生成密钥后,旧密钥立即失效。所有保存了旧密钥的地方都要更新。
- 凭据组合不对:OAuth 1.0a 需要 consumer key 和 secret,再加上用户的 access token 和 secret。混用两个应用的密钥,或在需要 token 的地方填了 API key,都会返回
401。 - OAuth 1.0a 签名错误:错误码
32(Could not authenticate you)通常是签名不对。检查参数的 URL 编码,并确认服务器时间准确;时间戳偏差会让签名失效。 - OAuth 2.0 用户令牌过期:用户访问令牌会过期。申请
offline.accessscope,用 refresh token 换新令牌。
TwexAPI
- API key 缺失或错误:请求头使用
Authorization: Bearer YOUR_API_KEY,key 从 控制台 获取。详见 身份验证。 - 写接口上的 X 会话过期:发帖、点赞或私信时返回
Invalid auth_token或 X 错误码32,说明你在cookie里提供的 X 会话凭据过期了。更新它即可,你的 API key 没问题。
只重试能成功的请求
下面这个 Python 函数只重试 429 和临时性的 5xx,其他状态码直接返回。它同时支持 Retry-After(TwexAPI 和大多数 HTTP API)和 x-rate-limit-reset(官方 X API):
import random
import time
import requests
def request_with_retry(method, url, max_attempts=5, **kwargs):
for attempt in range(max_attempts):
response = requests.request(method, url, timeout=30, **kwargs)
if response.status_code != 429 and response.status_code < 500:
return response # success, or a 4xx that waiting won't fix
wait = None
retry_after = response.headers.get("Retry-After", "")
reset_at = response.headers.get("x-rate-limit-reset", "")
if retry_after.isdigit():
wait = int(retry_after)
elif reset_at.isdigit():
wait = max(0, int(reset_at) - time.time()) + 1
if wait is None:
wait = min(300, 5 * 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
return response
分页读取时,遇到 429 后要用同一个游标重试,不要跳到下一页。写操作在重发之前,先确认帖子、点赞或私信是否已经成功;超时不代表操作失败。
如果真正的问题是官方限额
如果你的应用读数据时总是撞上 429,或者按次计费的账单涨得比数据量还快,可以比较一下按量计费的第三方 API。TwexAPI 读取推文约每 1,000 条 0.05 美元,只需 API key,无需配置 OAuth;官方 X API 每读取 1,000 条帖子收费 5 美元。详见 TwexAPI 与官方 X API 对比 和 X API 价格计算器。TwexAPI 与 X Corp. 无关联,也未获其认可。
Twitter API 429、403、401 常见问题
Twitter API 的 429 要等多久?
等到 x-rate-limit-reset 指示的时间,通常在 15 分钟以内。发帖等有 24 小时上限的接口,要等到每日窗口重置。在 TwexAPI 上,按 Retry-After 或 retry_after 等待。
用 X API 发推为什么返回 403 Forbidden?
通常是因为令牌没有写权限:可能用的是仅应用 Bearer Token,或应用设置为只读,或用户令牌是在开启 Read and write 之前生成的。打开写权限,重新生成用户令牌,并用用户上下文认证发帖。
n8n 里的 “Request failed with status code 401” 是什么意思?
说明 X API 或 TwexAPI 拒绝了该 HTTP 节点里的凭据。检查 Authorization 头是否为 Bearer 加有效的 key 或 token、凭据是否被重新生成过,以及写操作是否使用了用户上下文凭据。TwexAPI 的可用配置见 n8n 指南。
403 和 429 有什么区别?
429 是请求太多,需要等待;403 是根本不允许发这个请求。429 等一等就好,403 需要改权限、授权范围、Credits 或请求的目标。
Twitter 错误码 88 是什么意思?
X 错误码 88 表示 Rate limit exceeded,随 HTTP 429 一起返回。等到 x-rate-limit-reset 之后再发下一个请求。
Twitter 错误码 32 是什么意思?
X 错误码 32 表示 Could not authenticate you,随 HTTP 401 一起返回。在官方 API 上通常是 OAuth 1.0a 签名或令牌有误;在 TwexAPI 的写接口上,表示你提供的 X 会话凭据已过期。
相关页面
- Twitter API 错误码参考:TwexAPI 的所有状态码和 X 错误码及解决方法
- 速率限制:退避、
Retry-After和分页安全恢复 - 错误处理:MCP、SDK 和写操作的恢复
- 身份验证:API key 和 X 会话凭据