跳到正文

yt-dlp:"Sign in to confirm you're not a bot" 的含义与修复方法

作者 Tunelio 团队发布于 更新于

这是 YouTube 的机器人拦截墙,不是 yt-dlp 的 bug:YouTube 判定你的请求像自动化程序,要求一个已登录、经验证的会话。快速修复:更新 yt-dlp,安装 JavaScript 运行时(Deno),改用 IPv4 重试。若仍不行,下文按真正有效的顺序讲解 cookies、PO token 和 IP 信誉,以及会让问题恶化的错误做法。

60 秒修复(先试这个)

我们看到的大多数案例由三件事解决:yt-dlp 过旧、缺少 JavaScript 运行时,或 YouTube 不信任的 IPv6 地址。在碰 cookies 之前先执行:

# 1. 更新(pip 用户:pip install -U yt-dlp)
yt-dlp -U

# 2. 安装 JS 运行时以解决 YouTube 的挑战 —— 推荐 Deno
curl -fsSL https://deno.land/install.sh | sh

# 3. 清空缓存并用 IPv4 重试
yt-dlp -4 --rm-cache-dir "https://youtu.be/dQw4w9WgXcQ"

还是被拦?继续往下读。顺序很重要:后面的每一步都比前一步更贵、风险更高,而直接跳到 cookies 是把问题变成永久性的最常见方式。

这个错误的真正含义

当 yt-dlp 向 YouTube 请求视频的播放器数据时,YouTube 会给请求打分:IP 地址及其历史、客户端是否携带有效的 Proof-of-Origin(PO)token、是否有会话 cookie,以及该地址近期的请求量。分数不佳时,YouTube 返回登录墙而不是播放器响应,yt-dlp 便打印 “Sign in to confirm you’re not a bot”。你的命令没有错,只是 YouTube 不信任来源。

为什么会发生 —— 四个真实触发因素

  • IP 信誉。数据中心网段(所有 VPS、云实例、CI runner)的评分远低于家庭网络。2026 年 8 月,在我们自己的提取集群上,大约每四个新出口 IP 就有一个在首次接触时撞上拦截墙;IPv6 更糟:YouTube 把整个 /64 当作一个单位打分,一个吵闹的邻居就会让整个网段被标记。
  • 没有 PO token。自 2024 年起,YouTube 要求由其 BotGuard JavaScript 生成的 Proof-of-Origin token。yt-dlp 只能通过外部 JS 运行时(Deno、Node、Bun)或 PO-token provider 插件获得;没有它,部分客户端会被直接拒绝。
  • 没有会话。来自被标记 IP 的匿名请求看起来就是爬虫。真实浏览器会话的 cookies 能提高评分 —— 这就是 cookies “有效” 的原因,也是 IP 足够糟时它失效的原因。
  • 请求量。同一地址每分钟数十个请求,尤其是播放列表和重试循环,即使 IP 干净也会触发基于频率的评分。

按这个顺序修复

1. 更新到最新版本(或 nightly)

YouTube 每隔几周就更改播放器和签名代码,yt-dlp 会在几天内发布对应修复。超过一个月的构建会以看似机器人验证的方式失败。发行版软件包严重滞后 —— 请用 pip 或官方二进制安装,并运行 yt-dlp -U。

2. 安装 JavaScript 运行时

当前的 yt-dlp 需要外部 JS 运行时来解决 YouTube 的挑战并生成 PO token。推荐 Deno;Node.js 和 Bun 也可以。没有它,yt-dlp 会警告缺少格式,并经常直接撞上拦截墙。用 yt-dlp -v 检查,调试头部会显示运行时那一行。

3. 强制 IPv4

yt-dlp -4 "https://youtu.be/dQw4w9WgXcQ"   # 或:--force-ipv4

如果服务器同时有两种地址族,yt-dlp 可能走 IPv6,而 YouTube 对 IPv6 的评分更严(整个 /64 视为一个单位)。仅这一个参数就能解决数量惊人的 “笔记本能用、VPS 不行” 的案例,因为笔记本通常在家庭路由器后只用 IPv4。

4. Cookies —— 用一次性会话,绝不用主账号

Cookies 告诉 YouTube 请求属于一个真实会话。从登录了备用 Google 账号的隐私窗口导出,然后关闭窗口,以免浏览器在背后轮换会话。不要导出日常账号的 cookies:从被标记 IP 反复自动化使用可能导致该账号被限流或锁定。

# 在隐私窗口中用浏览器扩展导出 cookies.txt,然后:
yt-dlp --cookies cookies.txt -4 "https://youtu.be/dQw4w9WgXcQ"

# 或直接从浏览器配置读取(适合本地一次性使用):
yt-dlp --cookies-from-browser chrome "https://youtu.be/dQw4w9WgXcQ"

Cookies 是补丁而非治疗:它们会过期,一旦 IP 本身被标记,会话也帮不上忙。如果 cookies 只能用一两天,问题在地址,不在 cookie 文件。

5. 添加 PO-token provider

当调试输出说某客户端需要 yt-dlp 无法获取的 PO token 时,安装 bgutil-ytdlp-pot-provider 之类的 provider 插件。它运行一个小型 BotGuard 服务,自动为 yt-dlp 生成 token。这是 “留在自己 IP 上” 的方案中最可靠的一个,也是最常被跳过的一个。

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

yt-dlp --extractor-args "youtube:player_client=tv" "https://youtu.be/dQw4w9WgXcQ"
# 也值得一试:android、mweb、web_embedded(各有自己的格式集)

YouTube 对每个客户端的评分不同,受信任客户端的列表每隔几周就会变化,所以这只是权宜之计。有些客户端提供不了 1080p 以上,或需要自己的 cookies。

7. 更换 IP:住宅代理或另一条网络

如果家庭网络上一台干净的笔记本不用 cookies 就能下载同一视频,那么问题就是服务器的 IP,任何参数都救不了。用 --proxy 让 yt-dlp 走住宅或移动代理,或把提取迁到地址更干净的机器上。轮换廉价的数据中心代理几乎没用 —— 它们的评分和你的 VPS 一样。

8. 放慢速度

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

重试循环是把临时挑战变成永久标记地址的最快方式。退避,把并发限制在一两个下载,永远不要在紧密循环中重试拦截墙响应。

症状 → 最可能的原因

  • 笔记本能用,VPS 不行 → IP 信誉(第 3 步,然后第 7 步)。
  • 昨天还好,今天每个视频都失败 → YouTube 改了东西;更新(第 1 步)并检查 JS 运行时(第 2 步)。
  • 用 cookies 能撑一天,之后又失败 → IP 已被标记;cookies 救不了(第 7 步)。
  • 只有部分视频或格式失败;-v 提到 PO token → PO-token provider(第 5 步)或另一个客户端(第 6 步)。
  • 只在批量运行或播放列表时失败 → 请求量评分(第 8 步)。

会让情况更糟的错误

  • 在服务器上使用个人 Google 账号的 cookies —— 被限制的可能是账号,不只是 IP。
  • 以 root 运行 yt-dlp 并使用共享、被污染的缓存;请用 --rm-cache-dir 和按用户隔离的缓存。
  • 把 cookie 文件和不该用 cookies 的客户端混用(yt-dlp 会对此警告)—— 两边的坏处都占。
  • 挑战后每隔几秒就重试;请等几分钟而不是几秒,并在两次尝试之间改变点什么。

什么时候打补丁不再划算

如果 yt-dlp 支撑的是机器人、应用或流水线而非一次性下载,这堵墙就变成了运维工作:cookie 轮换、PO-token 服务、住宅出口、每晚更新。托管 API 把这一切留在服务端,只把一个 URL 交给你的代码:

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

Tunelio 是我们自己的服务,请据此权衡这一节。坦白说:如果你每周只在家庭网络上下载几个视频,继续用 yt-dlp —— 第 1 到第 3 步足够了。如果你每周都在服务器上和这堵墙搏斗,最便宜的办法是不再自己扛这个问题。新账号可获得 100 个免费额度,无需银行卡。

来源与延伸阅读

  • yt-dlp wiki —— “How do I pass cookies to yt-dlp?” 与 PO token 指南(github.com/yt-dlp/yt-dlp/wiki)。
  • yt-dlp README —— YouTube 需要 JavaScript 运行时(推荐 Deno)。
  • bgutil-ytdlp-pot-provider —— PO-token provider 插件。
  • 我们自己的测量(Tunelio 提取集群,2026 年 8 月):新出口撞上拦截墙的比例;IPv6 /64 评分行为。

常见问题

加上 cookies 一定能解决吗?

经常可以,但撑不久。Cookies 提高请求的信任分,但会过期,而被严重标记的 IP 照样会被挑战。如果 cookies 一两天后失效,真正的问题是 IP。

用自己 Google 账号的 cookies 安全吗?

在服务器上不安全。从被标记地址的自动化使用可能让账号被限流或锁定。请在隐私窗口用备用账号,导出一次后关闭窗口。

为什么笔记本能用而服务器不行?

笔记本在信誉良好的家庭 IPv4 上;服务器在数据中心网段(常为 IPv6),YouTube 将其视为疑似机器人。先强制 IPv4,再考虑住宅出口。

什么是 PO token,我需要它吗?

由 YouTube 的 BotGuard 脚本生成的 Proof-of-Origin token,用来证明客户端是真实浏览器。部分客户端没有它会被拒绝。yt-dlp 需要 JS 运行时或 provider 插件来获取。

托管 API 会撞上同一堵墙吗?

它替你撞并在服务端处理 —— 新鲜会话、PO token 和住宅 IP —— 你的代码只会看到下载 URL。

相关指南