结论先说:限流发生时,最该保护的不是“还能不能再请求”,而是已经拿到的可用结果和它们的口径。只要把已完成部分先落盘、标记状态、隔离未完成项,就能避免限流把此前成果一起拖坏;但如果限流来自账号被封或授权被撤销,这套保护只能保住旧数据,不能恢复调用能力,需要先处理权限问题。
脚本调用博客营销软件时遇到的限流,通常有三种不同来源,处理方式并不一样。第一种是接口频率限制,表现为固定时间内返回过多请求错误,等待后可能恢复;第二种是配额耗尽,表现为当日或当周期额度用完,需要等到下一个周期;第三种是权限或账号状态变化,表现为持续拒绝,等待也不会恢复。前两种适合“保结果、缓调用”,第三种必须先解决授权,否则继续重试只会浪费已有结果的处理窗口。
判断依据可以看返回信息中的错误类型、是否所有接口都失败、以及更换到另一个已验证可用的调用身份后是否恢复。如果只有部分接口失败,通常是频率问题;如果全部失败且换身份仍失败,更可能是账号或授权层面。
脚本最容易犯的错误是把所有返回结果攒在内存或临时变量里,等全部跑完再统一写入。限流一旦发生,进程中断,前面几小时的结果可能全部丢失。更稳妥的做法是每完成一个批次就写入一次,哪怕只是写入本地文件或临时存储。
具体动作:把每个请求的结果连同时间、调用参数、状态标记一起写入。状态至少区分“已完成”“失败待重试”“失败不重试”。这样即使限流持续,你也能清楚知道哪些结果可用、哪些需要补。
这个动作的直接结果是:限流后你不需要重新跑一遍全量任务,只需要针对“失败待重试”的部分安排后续调用。下一步的决策就变成“补多少”而不是“重跑多少”。
保护已有结果不只是保存数据,还要让未完成部分能被单独识别和续跑。建议在任务开始时就把待处理对象切成固定大小的批次,并给每批一个稳定标识。限流发生后,你可以从最后一个未完成批次继续,而不是从头开始。
如果脚本支持断点续跑,确认断点记录的是“批次标识”而不是“数组下标”。下标在数据顺序变化时会错位,批次标识更稳定。这个区别在旧内容、旧系统需要退出时尤其重要:你可能只需要保留其中仍然有价值的部分,而不是把所有历史数据重新拉一遍。
假设你用脚本调用某博客营销软件,任务是对旧博客文章做批量状态查询,共 500 条,跑到第 300 条时开始持续返回频率限制错误。此时你已经有 300 条结果落盘,其中 280 条状态正常,20 条返回异常。
合理的下一步不是立刻重试全部 500 条,而是:先检查那 20 条异常是数据问题还是限流副作用;再确认剩余 200 条是否仍然值得补。如果旧系统中只有一部分内容还需要保留,那么剩余 200 条里可能只有几十条真正需要继续查询。这个判断依赖的是业务价值,而不是限流本身。
反例:如果限流原因是账号被停用或授权被撤销,那么落盘和断点续跑只能保住旧结果,无法让脚本继续调用。此时继续优化重试策略没有意义,必须先确认账号状态和授权是否仍然有效。具体工具的账号状态和授权信息需要以该工具当前实际显示为准,不能凭经验假设。
限流结束后,不要直接恢复全量任务。先做一次结果盘点:已完成部分是否完整、失败部分是否已分类、剩余部分是否仍然需要。然后只对确认需要的部分安排下一次调用。
这个收尾动作的价值在于:它把限流从一个“事故”变成一次“范围收缩”。对于需要退出旧内容、旧系统或旧合作关系的场景,限流反而提供了一个机会,让你重新确认哪些结果值得保留、哪些调用本来就不必再发。下一步动作是先导出已完成结果并标注来源批次,再决定是否对剩余部分发起新的调用。