解决 yt-dlp 的 HTTP 429 Too Many Requests 错误

理解 yt-dlp 的 HTTP 429 错误
HTTP 429 Too Many Requests 表示 YouTube 已经对你的 IP 做了限速。yt-dlp 用户最常在以下场景里遇到它:批处理脚本一口气拉一个 50+ 视频的播放列表;或者共享 IP(校园、办公室、VPN 出口)当小时的请求配额已经被用完。和 403 通常是签名/令牌问题不同,429 纯粹是请求频率问题。解决思路只有三种:等、换 IP,或者别在那么短的时间里发那么多请求。
为什么会发生
YouTube 给每个 IP 设了请求配额,用来防爬。yt-dlp 默认配置下,每个视频要发好几个请求(元数据、签名解密、视频流 URL、分片)。一播放列表下来这数量就翻得很快。如果你在同一个 IP 的浏览器里同时还开着别的 YouTube 标签页,到限额的时间会比你想的更早。
常见触发点:
- 长播放列表上加
--yes-playlist但没加--sleep-interval - 并行跑多个 yt-dlp 进程
- 共享的 NAT IP(公司、宿舍、移动运营商 CGNAT)
- 多人共用的 VPN 出口节点也都在访问 YouTube
- 失败的批次不 resume,直接整体重跑
yt-dlp 这边能尝试的办法
- 等 1–6 小时,限速会自动重置。
- 加
--sleep-interval 5 --max-sleep-interval 20把节奏放慢。 - 加
--retries 10 --retry-sleep linear=10:300:30,让重试带 backoff。 - 换网络 —— 手机热点、换个 VPN 出口、回家里的网。
- 用浏览器导出的
--cookies鉴权;登录态请求的配额会稍微高一点。
这些都不会完全消除 429,只是降低撞上的概率。
改用 Any4K
Any4K 把解析放在服务端做。你的 IP 不会直接和 YouTube 通讯,所以「按用户限速」就不会以同样的方式生效。单个视频或少量视频的话,把链接粘到 any4k.com 就能下载,不用调任何 sleep-interval,也不用写重试逻辑。
在限速场景下使用 Any4K 的好处
- 个人 IP 不出去:是 Any4K 的基础设施在跟 YouTube 通讯,你只是把成品文件拉回来。
- 更高的画质上限:源支持时最高 8K。
- 多平台:YouTube、TikTok、Twitter、Instagram、Facebook、Reddit、Shorts 共用同一套界面。
- 零安装:任何浏览器都能开。
什么时候 yt-dlp 还是更合适
成百上千视频的批量归档、字幕抽取、元数据内嵌这种场景,yt-dlp 的能力是最深的。这种用法下就承认 429 是工作流的一部分,把 sleep-interval 调好即可。但如果只是单个视频或小批量,Any4K 端到端的速度更快。
结论
429 不是 bug,而是 YouTube 的流量整形。可以通过调参让 yt-dlp 跟它共存,也可以直接用 Any4K Video Downloader 这样的服务端工具,整个绕开「按 IP 限速」这件事。