用 X API 写删除脚本:令牌、权限范围与刷新,一次讲清
想批量删掉几年前的旧推文,很多人第一反应是去搜"删除脚本",然后卡在第一步:怎么让脚本登录上你的 X 账号。官方 API 的鉴权看着吓人,其实就三件事:令牌从哪来、令牌能用多久、它能删什么。把这三件事弄明白,后面的删除逻辑反而是最简单的部分。
一、官方 API 能删什么,不能删什么
先说清楚限制,免得白忙活。X 的 API 对删除有硬性门槛:免费层(Free)基本拿不到删除权限,调删除接口会直接返回 403。要删推文,通常得用 Pro 或更高层级,并且走用户上下文授权。API 只能删你自己账号下的推文,不能删别人的,也不能删转推里别人写的内容。
还有一条老限制经常被忽略:通过 API 一次最多处理你最近 3200 条推文范围内的内容。更早的历史,得先下载完整归档,再针对归档里的推文 ID 逐条操作。换句话说,归档和 API 是两套配合使用的工具:归档负责把老数据捞出来,API 负责按 ID 精准删除,不是二选一。
这里有个实际影响:如果你账号有上万条推文,想清掉 2015 年的内容,光靠 API 翻页是翻不到的,必须先有归档。很多人以为写了脚本就能一把梭,结果卡在根本读不到那么老的数据,就是这个原因。
二、三种令牌,别拿错
鉴权的核心是"令牌"(token)。不同场景用不同的令牌,拿错了一定返回 401。
| 令牌类型 | 怎么来 | 能删推文吗 | 适合谁 |
|---|---|---|---|
| 应用令牌(App-only Bearer) | 开发者后台直接生成 | 不能 | 只读分析、查数据 |
| 用户令牌(User Context,OAuth 1.0a) | 用户授权后换取 | 能 | 删自己推文 |
| OAuth 2.0 用户上下文 | 授权码流程换取 | 能(需对应 scope) | 新应用、网页端 |
如果你只是想删自己的旧推文,用"用户令牌"那条路最稳。应用令牌看着简单,但它只有应用的身份,没有你的身份,调删除接口会直接被拒。要区分也很简单:应用令牌通常以固定前缀开头且只跟在应用配置里;用户令牌是用户授权后换来的,和具体账号绑定。
三、权限范围(scope)怎么填才不会 401
OAuth 2.0 授权时要声明 scope。删推文需要 tweet.read 和 tweet.write,少一个都不行。很多人踩坑是把 read 写成了 readonly,或者漏了 write,结果授权成功了但一调删除就报错。这种错误特别烦:授权弹窗明明点了同意,代码却告诉你没权限。
一个实用的做法:授权完成后,把返回的权限范围打印出来核对一遍,确认同时包含读和写,再开始写删除逻辑。这一步只要 30 秒,能省下后面一小时的排查。如果返回里只有 read 没有 write,回去重新走授权流程,别在代码里瞎改。
四、令牌会过期,刷新比重新申请更省事
用户令牌不是永久的。OAuth 1.0a 的令牌相对长效,能撑很久;但 OAuth 2.0 的 access token 通常几小时就过期,需要靠 refresh token 换新。把刷新逻辑写进脚本,比每次手动去后台重新授权要省心得多。
但要注意两点。第一,refresh token 本身也要安全保存,它和 access token 一样敏感。第二,有些配置下刷新一次后旧 token 立即失效。所以脚本里建议先换到新 token、验证能用,再写回本地存储,避免刷新到一半崩了、新旧都没有的尴尬。
五、一个最小可运行示例
下面是一段思路(伪代码),重点看结构而不是某行语法。真实接口名和参数以官方文档为准。
- 用本地存好的 refresh token 换 access token;
- 读归档或数据库里的目标推文 ID 列表;
- 在每小时限速内逐条调用删除接口;
- 成功的记下来,失败的退避重试;
- 全部跑完输出一份删除报告。
限速是新手最容易翻车的地方。官方对每个接口有独立配额,删推文和读推文分开算。下面这张表是常见档位,具体数字以你账号层级为准:
| 操作 | 大致限速 | 超限后果 |
|---|---|---|
| 读单条推文 | 每 15 分钟数百次 | 返回 429,需等待 |
| 删除推文 | 每 15 分钟数十次 | 返回 429,需退避 |
| 批量读时间线 | 更低频 | 容易被限流 |
建议每删一条之后 sleep 一小段,或者按返回头里的剩余配额动态调整速度,别一口气并发打满。并发越高不代表越快,反而更容易被限流导致整体更慢。
六、把密钥留在自己机器上
最后也是最重要的一点:令牌、refresh token、API key 全都只存在你本地,不要写进会公开分享的脚本,更不要提交到公开仓库。一个常见失误是把含密钥的脚本推到了 GitHub,几小时内就被机器人扫走滥用,账号直接被封。
如果你不想自己折腾整套鉴权,也可以用本机运行的工具:上传 X 数据归档,在本地解析并标记要删的推文,再决定要不要走 API 删除。密钥始终不离开你的电脑,整体风险低很多。哪怕最后一步才用 API,前面的解析和筛选都在本地完成,敏感数据从不上传。
七、常见报错与应对
即便鉴权都正确,删推文时仍可能撞上几个固定报错。401 表示令牌失效或 scope 不对,先换令牌、再核对 scope。403 通常是层级不够,免费层调删除必现,得升级到 Pro 或更高。429 是触发限速,按返回头的剩余配额退避几秒再继续,别硬扛。把这三种报错和处理方式写进脚本日志,跑完一眼就能看出卡在哪。
还有一个容易被忽略的点:删除接口偶尔会返回成功但推文还在。遇到这种情况,别立刻重试同一条,先单独查一下这条推文的状态,确认是真删了还是接口抖动。给脚本加一个删后核对的小步骤,比盲目重试更稳,也能避免同一条被反复打、把限速打满。
关于 digital-footprint-health.shop:这是一个在本机运行的隐私体检工具,解析你的 X 归档生成风险清单,支持按条删除风险推文,全程数据不出本机。你可以在 首页 了解工作原理,或到 博客 看更多数据安全实践。
常见问题
免费 X 账号能用 API 删推文吗?
基本不能。删除接口需要 Pro 及以上层级的权限,免费层通常只能做只读操作,调删除会返回 403。
应用令牌为什么删不了我的推文?
应用令牌只有"应用身份",没有"你的身份"。删推文必须走用户上下文授权拿到的用户令牌。
为什么授权成功了还是 401?
多半是 scope 漏了 tweet.write,或者 read/write 拼写和官方不一致。授权后打印 scope 核对即可。
令牌过期了必须手动重新授权吗?
OAuth 2.0 可以用 refresh token 自动换新;把刷新逻辑写进脚本就能免手动。OAuth 1.0a 的令牌相对长效。
脚本里的密钥怎么存才安全?
只放本地文件、不进版本库、不写进会分享的代码片段;用完的日志里也别打印明文令牌。
检查你自己的 X/Twitter 数字足迹
免费本机扫描,你的归档永不离开电脑。
免费开始体检相关阅读
在浏览器里解析 200MB 的 X 归档:流式读取、内存与线程安排
不装 Node、不把归档传上服务器,只靠浏览器能不能解析一份 200MB 的 X 归档?可以,但要绕开三个硬限制:主线程阻塞、内存峰值和文件读取方式。本文讲清每个限制的成因和对应的工程做法。
删除任务的断点续传是怎么设计的
处理上万条推文的删除任务几乎一定会中断:网络掉线、电脑休眠、进程被系统回收。能续跑的删除任务和不能续跑的差别,全在检查点、幂等和状态恢复这三件事上。这篇文章拆开设计思路,并给出最小实现骨架。
X 接口限流为什么让批量删除变慢:配额机制与排队策略
批量删帖慢,慢的不是网络也不是工具,而是写操作配额的窗口计算方式。理解窗口长度、端点配额和 429 的含义之后,就能把删除从「一次性猛冲」改成「可控排队」,中断也不用从头再来。