跳到正文

yt-dlp 403 Forbidden:为什么会发生,以及有效的修复顺序

作者 Tunelio 团队发布于

大多数 yt-dlp “HTTP Error 403: Forbidden” 是构建过旧或缺少 JavaScript 运行时 —— 不是封禁。运行 yt-dlp -U,安装 Deno,用 -4 --rm-cache-dir 重试。如果 403 仍在,本指南把每个症状对应到真实原因:强制格式、缺少 PO token、让情况恶化的 cookies,以及 YouTube 拒绝向其提供媒体的数据中心 IP。

快速修复

yt-dlp -U                                   # 或:pip install -U yt-dlp
curl -fsSL https://deno.land/install.sh | sh  # 解决 YouTube 挑战的 JS 运行时
yt-dlp -4 --rm-cache-dir "https://youtu.be/dQw4w9WgXcQ"

三条命令能解决绝大多数 403 报告。如果你的不在其中,不要开始乱加参数 —— 按下面的列表逐步排查。每一步对应一个不同的原因,而错误的一步(通常是 cookies)可能把临时的 403 变成永久的。

yt-dlp 中 “HTTP Error 403: Forbidden” 的含义

403 是 YouTube 拒绝提供它刚刚给出的东西。它可能发生在两个截然不同的位置。第一是信息请求(watch 页面或播放器 API):YouTube 甚至不告诉 yt-dlp 存在哪些格式 —— 这是对你的客户端或 IP 的信任问题。第二种更常见,是媒体请求:yt-dlp 拿到了格式列表和签名的 googlevideo.com URL,开始下载,媒体服务器却返回 403。该 URL 是针对特定客户端、IP 和 Proof-of-Origin token 签名的;只要有一项与 YouTube 预期不符,即使元数据看起来正常,下载也会被拒绝。

分清是哪一种决定了修法。加 -v 运行:如果错误出现在 “Downloading … formats” 之后或下载途中,就是媒体 403(下文第 4 到 7 步);如果在列出任何格式之前就出现,就是信息 403(第 1 到 3 步,然后看机器人拦截墙指南)。

按这个顺序修复 yt-dlp 403

1. 更新 yt-dlp

YouTube 每隔几周就更改媒体 URL 的签名和分发方式,专门用来破坏自动化客户端,而 yt-dlp 会在几天内跟进。任何超过一个月的构建都可能产生任何参数都修不好的 403。使用官方二进制或 pip —— 发行版软件包常常落后数月 —— 若稳定版尚未发布,可考虑 nightly 渠道。

2. 安装 JavaScript 运行时(Deno)

自 2025 年起,yt-dlp 需要外部 JS 运行时来解决 YouTube 的签名和挑战代码。没有它,yt-dlp 会悄悄丢失格式,或回退到会 403 的分发方式。推荐 Deno;Node.js 和 Bun 也受支持。安装后检查 yt-dlp -v 的调试头部是否列出了它。如果装过旧的 YTNsigDeno 插件,请卸载 —— 它已过时且与内置求解器冲突。

3. 清空缓存并强制 IPv4

yt-dlp -4 --rm-cache-dir "https://youtu.be/dQw4w9WgXcQ"

旧版本遗留的签名缓存会让每个视频都 403;--rm-cache-dir 会重置它。在有 IPv6 的服务器上 -4 很重要:YouTube 把整个 IPv6 /64 当作一个地址打分,2026 年 8 月在我们自己的集群上,大约十次提取中有三次返回的媒体主机拒绝 IPv6,而同一 URL 走 IPv4 却正常。

4. 停止强制指定格式

自 2026 年 8 月起,大量报告显示用 -f 强制格式(例如 -f 137+140)时出现 403,而自动选择却成功。YouTube 现在只向持有 PO token 的客户端提供某些 itag,强制 itag 会忽略这一点。去掉 -f,改用排序表达偏好:

# 偏好 1080p mp4,但不强制特定 itag
yt-dlp -S "res:1080,ext:mp4" "https://youtu.be/dQw4w9WgXcQ"

5. 尝试另一个播放器客户端

yt-dlp --extractor-args "youtube:player_client=android" "https://youtu.be/dQw4w9WgXcQ"
# 也可以:tv、mweb、web_embedded —— 各自的签名与信任方式不同

YouTube 按客户端签名媒体 URL,能拿到干净 URL 的客户端集合经常变化。切换客户端是合理的权宜之计,不是永久修复;有些客户端最高只到 720p,或需要自己的 cookies。留意 -v 输出中的 “requires a PO token” —— 那条信息指向第 6 步,而不是继续换客户端。

6. 提供 PO token

部分格式和客户端只在携带由 YouTube BotGuard 脚本生成的 Proof-of-Origin token 时才提供。有 JS 运行时的 yt-dlp 可以为部分客户端生成;其余的请安装 provider 插件(bgutil-ytdlp-pot-provider),它运行一个小型 token 服务,yt-dlp 会自动调用。缺少 token 的经典迹象:360p 正常,1080p 及以上媒体 403。

7. Cookies —— 谨慎使用,且不要作为第一步

Cookies 能解决信息 403(“Sign in to confirm you’re not a bot”),但可能制造媒体 403:维护者指出传入 cookies 后部分格式会变得不可用,而从仍在打开的浏览器导出的 cookie 文件会在浏览器轮换会话时失效。若确实需要,从登录了备用账号的隐私窗口导出,关闭窗口,再传入 --cookies cookies.txt。绝不要在服务器上使用主账号。

8. 退避并更换 IP

yt-dlp --sleep-requests 2 --sleep-interval 5 --max-sleep-interval 15 --limit-rate 2M ...

批量运行会被限流成 403;加入 sleep 并限制并发。如果家庭网络上的干净笔记本能下载同一视频而服务器不能,原因就是服务器的 IP 信誉 —— 用 --proxy 走住宅代理,或把提取迁到别处。廉价数据中心代理的评分和你的 VPS 一样,几乎没用。

症状 → 原因

  • 列出任何格式之前就 403 → 信息级拒绝:更新(1)、JS 运行时(2),然后看拦截墙指南。
  • 昨天还好,今天每个视频立即 403 → YouTube 改了东西:更新(1)、清缓存(3)。
  • 第一块下载成功,随后 403 → 签名 URL 与请求它的客户端/IP/token 不匹配;不要相信成功的第一块。换客户端(5)、PO token(6)。
  • 只有 1080p 及以上 403,360p 正常 → 受 PO token 门控的格式(6)或强制 itag(4)。
  • 笔记本能用,VPS 上 403 → IP 信誉和/或 IPv6(3,然后 8)。
  • 只在播放列表或批量运行时 403 → 限流(8)。
  • 加了 cookies 后立刻开始失败 → cookies 就是原因(7):移除它,或从已关闭的隐私窗口重新导出。

为什么服务器和 IPv6 更常遇到 403

YouTube 把数据中心网段(AWS、GCP、Azure、所有 VPS 提供商)视为疑似自动化,向它们提供更少的格式、更多的挑战和更多的拒绝。来自我们提取集群的两个数字(2026 年 8 月):大约每四个新出口 IP 就有一个在首次接触时遭遇挑战;大约十次提取中有三次返回的 googlevideo 主机在 IPv6 上不可达或拒绝,而 IPv4 正常。这就是同一命令在笔记本上成功、在服务器上失败的原因 —— 也是 -4 值得最先尝试的原因。

常见错误

  • 把 cookies 传给每个客户端,包括不该使用它们的客户端 —— yt-dlp 会对此警告;请听从。
  • 以 root 运行并使用共享、陈旧的缓存;请用 --rm-cache-dir 和按用户的配置。
  • 照搬旧教程强制 itag(-f 137+140),而不是用 -S 排序。
  • 403 后在紧密循环中重试,把临时拒绝变成被标记的 IP。
  • 还在用去年的发行版软件包,读论坛帖子而不是更新。

什么时候打补丁不再划算

如果 yt-dlp 位于机器人、应用或流水线内部,这场 403 之舞 —— 更新、运行时、PO token、cookie 卫生、干净 IP —— 就是反复出现的运维成本。托管 API 把这一切留在服务端,一次请求返回下载 URL:

curl "https://tunelio.dev/create?url=https://youtu.be/dQw4w9WgXcQ&quality=1080p" \
  -H "Authorization: Bearer tnl_your_api_key"
# → { "url": "https://…/tunnel?id=…&sig=…", "file_size_str": "58.11 MB", "status": "ok" }

Tunelio 是我们自己的服务,请据此看待本节。家庭网络上的偶尔下载,第 1 到 3 步足够,yt-dlp 仍是正确的工具。对于任何在服务器上无人值守运行的东西,通常不再自己扛这个问题更便宜。新账号可获得 100 个免费额度,无需银行卡。

来源与延伸阅读

  • yt-dlp issue #14680 —— “FIXED: [Youtube] ERROR: unable to download video data: HTTP Error 403: Forbidden”。
  • yt-dlp issue #17395 —— 下载时间歇性 403(开放的跟踪 issue)。
  • yt-dlp README —— JavaScript 运行时要求(推荐 Deno)与 extractor-args 参考。
  • yt-dlp wiki —— PO token 指南与 “How do I pass cookies to yt-dlp?”。
  • 我们自己的测量(Tunelio 提取集群,2026 年 8 月):IPv6 媒体主机拒绝率与首次接触挑战率。

常见问题

Cookies 能修复 403 吗?

它们修复的是登录墙类型的拒绝,不是媒体类型。Cookies 甚至会造成媒体 403:让部分格式不可用,或在浏览器轮换会话时失效。最后再用,且要从已关闭的隐私窗口导出。

403 是我的 IP 造成的吗?

在服务器上经常如此:数据中心和 IPv6 地址被评为疑似机器人。如果家庭网络上的笔记本用同一命令成功,原因就是 IP —— 先试 -4,再考虑住宅出口。

为什么一夜之间就坏了?

YouTube 更改了播放器或签名代码,你的 yt-dlp 已过时。更新,用 --rm-cache-dir 清空缓存,并确认已安装 JavaScript 运行时。

前面一部分能下载,然后 403 —— 这是什么?

签名的媒体 URL 与 YouTube 预期的客户端、IP 或 PO token 不匹配;第一块下载成功并不证明 URL 有效。切换客户端、提供 PO token,并避免强制 itag。

相关指南