1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# 遇到报错,需要登录 youtube 获取 cookies
yt-dlp ERROR: [youtube] uqNEthI6Df8: Sign in to confirm you’re not a bot. Use --cookies-from-browser or --cookies for the authentication. See
https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp for how to manually pass cookies. Also see
https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookies for tips on effectively exporting YouTube cookies
# 1.安装 chrome 插件: Get cookies.txt LOCALLY: https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc
# 2.打开 youtube 网站并登录, 使用以上插件下载 /youtube-dl/cookies.txt
# 3.在 'Advanced Options' 添加: --cookies /youtube-dl/cookies.txt
# 4.在 docker 安装 deno
rm -rf /root/.deno
apk update
apk add --no-cache deno
# 5.测试
yt-dlp -v \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
"https://www.youtube.com/watch?v=DOyoYgAj-GE"
# 6. 自动下载 cookies.txt
#yt-dlp \
# --cookies-from-browser chrome \
# --cookies /youtube-dl/cookies.txt \
#As of 2026, the better cookie-less approach for automated Docker use is to use yt-dlp's PO Token provider.
#yt-dlp's current documentation specifically recommends a PO Token provider plugin,
#particularly with the mweb client, rather than manually generating tokens.
yt-dlp \
--extractor-args "youtube:player_client=android_vr" \
"https://www.youtube.com/watch?v=uqNEthI6Df8"
# or
yt-dlp \
--extractor-args "youtube:player_client=web_embedded" \
"https://www.youtube.com/watch?v=uqNEthI6Df8"
|
在 Alpine Docker 中修复 yt-dlp 的 YouTube n challenge 与 Deno 错误
本文记录一次在 youtube-dl-react-viewer 的 Alpine Linux Docker 容器中,使用 yt-dlp 下载 YouTube 视频时遇到的完整排查过程。
1. 初始错误
使用 yt-dlp 下载 YouTube 视频时,出现:
1
2
3
4
|
WARNING: [youtube] n challenge solving failed: Some formats may be missing.
Ensure you have a supported JavaScript runtime and challenge solver script distribution installed.
ERROR: [youtube] The page needs to be reloaded.
|
进一步使用:
1
2
3
|
yt-dlp -v \
--cookies /youtube-dl/cookies.txt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
可以看到类似:
1
2
3
4
5
6
7
8
9
|
Optional libraries: ..., yt_dlp_ejs-0.8.0
JS runtimes: none
[youtube] [pot] PO Token Providers: none
[youtube] [jsc] JS Challenge Providers:
bun (unavailable),
deno (unavailable),
node (unavailable),
quickjs (unavailable)
|
同时日志中已经出现:
1
|
[youtube] Found YouTube account cookies
|
这说明:
cookies.txt 已经被正确读取;
yt-dlp-ejs 已安装;
- 真正缺失的是 JavaScript runtime。
对于当前版本的 yt-dlp,建议使用 Deno 作为 JavaScript runtime。
2. 确认 Docker 基础系统
进入容器后:
输出:
1
2
3
4
|
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.22.2
PRETTY_NAME="Alpine Linux v3.22"
|
因此该容器使用的是 Alpine Linux。
Alpine 的包管理器是:
而不是:
所以安装软件应该使用:
1
2
|
apk update
apk add --no-cache PACKAGE_NAME
|
3. 不建议使用 Deno 官方安装脚本
最开始尝试:
1
|
curl -fsSL https://deno.land/install.sh | sh
|
安装得到:
文件虽然存在:
1
|
ls /root/.deno/bin/deno
|
但是执行:
1
|
/root/.deno/bin/deno --version
|
却出现:
1
|
sh: /root/.deno/bin/deno: not found
|
这里的 not found 并不一定表示文件不存在。
真正的问题通常是:
- Deno 官方安装脚本下载的是 glibc/GNU Linux 二进制;
- Alpine Linux 默认使用 musl libc;
- 二进制所需要的动态加载器不存在;
- shell 最终表现为
not found。
可以通过:
1
2
3
|
apk add --no-cache file
file /root/.deno/bin/deno
|
进一步确认。
如果输出中包含类似:
1
|
interpreter /lib64/ld-linux-x86-64.so.2
|
而 Alpine 使用:
1
|
/lib/ld-musl-x86_64.so.1
|
就说明这是 glibc 与 musl 的兼容问题。
4. 正确做法:直接安装 Alpine 的 Deno
对于 Alpine,最简单可靠的方法是直接安装发行版自带的 Deno:
1
2
|
apk update
apk add --no-cache deno
|
然后检查:
1
2
|
which deno
deno --version
|
正常应该类似:
1
2
|
/usr/bin/deno
deno 2.3.1
|
如果 apk 找不到 deno,检查:
1
|
cat /etc/apk/repositories
|
确保启用了 community:
1
2
|
https://dl-cdn.alpinelinux.org/alpine/v3.22/main
https://dl-cdn.alpinelinux.org/alpine/v3.22/community
|
如果没有,可以添加:
1
2
3
4
|
echo "https://dl-cdn.alpinelinux.org/alpine/v3.22/community" >> /etc/apk/repositories
apk update
apk add --no-cache deno
|
5. 让 yt-dlp 使用 Deno
安装完成后,可以显式指定 Deno:
1
2
3
4
|
yt-dlp -v \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
成功后,调试输出应该从:
变成类似:
1
|
JS runtimes: deno-2.3.1
|
同时:
1
|
JS Challenge Providers: deno
|
也应该变为可用。
6. 新错误:Failed getting cwd
Deno 被正确识别后,又可能出现:
1
2
3
4
5
6
7
8
9
|
[youtube] [jsc:deno] Solving JS challenges using deno
WARNING: [youtube] [jsc] Error solving n challenge request using "deno" provider:
Error running deno process (returncode: 1):
error: Failed getting cwd.
Caused by:
No such file or directory (os error 2).
|
这是另一个独立问题。
cwd 是:
1
|
current working directory
|
也就是当前工作目录。
典型原因是:
- 当前 shell 位于某个目录;
- 这个目录后来被删除;
- shell 仍然保留原来的路径状态;
- Deno 启动时调用
getcwd();
- 系统返回
ENOENT;
- Deno 报:
例如,当前提示符可能仍然显示:
但此前执行过:
那么 shell 实际上已经处于一个被删除的目录中。
7. 修复 Failed getting cwd
最简单的方法:
或者:
或者:
然后确认:
例如:
再测试 Deno:
还可以进一步测试:
1
|
echo 'console.log("deno ok")' | deno run -
|
正常输出:
8. 再次测试 yt-dlp
确认当前目录有效后,再运行:
1
2
3
4
5
6
|
cd /
yt-dlp -v \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
如果问题解决,应该不再出现:
也不应该再因为 Deno 无法运行而出现:
1
|
n challenge solving failed
|
日志中应该正常看到:
1
|
[youtube] [jsc:deno] Solving JS challenges using deno
|
9. 下载字幕
如果同时需要下载字幕,可以使用:
1
2
3
4
5
6
7
8
|
yt-dlp \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
--write-subs \
--write-auto-subs \
--sub-langs "en.*,zh-Hans,zh-Hant" \
--sub-format vtt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
如果只想查看有哪些字幕:
1
2
3
4
5
|
yt-dlp \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
--list-subs \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
10. youtube-dl-react-viewer 的 Override Config
在 youtube-dl-react-viewer 中,可以将以下参数加入 Override Config:
1
|
--js-runtimes deno:/usr/bin/deno --cookies /youtube-dl/cookies.txt
|
如果同时需要字幕:
1
|
--js-runtimes deno:/usr/bin/deno --cookies /youtube-dl/cookies.txt --write-subs --write-auto-subs --sub-langs "en.*,zh-Hans,zh-Hant" --sub-format vtt
|
11. 最终排查结论
整个问题链可以总结为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
YouTube 下载失败
↓
cookies 已正确读取
↓
yt-dlp-ejs 已安装
↓
JS runtime 缺失
↓
安装 Deno
↓
官方 Deno glibc 二进制无法在 Alpine musl 上运行
↓
改用 apk 安装 Alpine 原生 Deno
↓
yt-dlp 正确识别 Deno
↓
出现 Failed getting cwd
↓
发现当前 shell 所在目录已经被删除
↓
cd 到有效目录
↓
Deno challenge solver 正常运行
|
12. 推荐的最终命令
对于 Alpine Docker + youtube-dl-react-viewer,推荐:
1
2
3
4
5
6
7
8
9
10
11
|
apk update
apk add --no-cache deno
cd /
deno --version
yt-dlp -v \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
需要字幕时:
1
2
3
4
5
6
7
8
|
yt-dlp \
--js-runtimes deno:/usr/bin/deno \
--cookies /youtube-dl/cookies.txt \
--write-subs \
--write-auto-subs \
--sub-langs "en.*,zh-Hans,zh-Hant" \
--sub-format vtt \
"https://www.youtube.com/watch?v=VIDEO_ID"
|
13. Docker 持久化建议
需要注意,在正在运行的容器中执行:
1
|
apk add --no-cache deno
|
只会修改当前容器。
如果之后重新创建容器,Deno 可能会丢失。
更可靠的方法是创建自己的 Dockerfile,例如:
1
2
3
|
FROM 原来的-youtube-dl-react-viewer-image
RUN apk add --no-cache deno
|
然后重新构建:
1
|
docker build -t youtube-dl-react-viewer-with-deno .
|
这样 Deno 会成为镜像的一部分,不会因为容器重建而丢失。