如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp
如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp
本教程基于在 Docker 中运行的 n8n 实例,指导您如何永久性地在 n8n 环境中安装 yt-dlp,并配置 Cookie 文件以解决 YouTube 和 Bilibili 等网站的登录验证和反爬虫问题。
自动化工作流示意图
📌 为什么这么复杂?
n8n 默认运行在一个”干净”的 Docker 容器中。您在服务器(宿主机)上安装的任何工具(如 yt-dlp),n8n 容器内部都无法访问。因此,我们必须构建一个自定义的 n8n 镜像,将 yt-dlp 作为 n8n 环境的一部分。
Docker 容器隔离示意图 - 展示宿主机和容器之间的关系
🚀 阶段一:永久性安装 yt-dlp 到 n8n
我们将使用 docker-compose 和一个 Dockerfile 来构建一个包含 yt-dlp 及其依赖(Python, ffmpeg)的 n8n 镜像。
步骤 1:创建 n8n 部署目录
在您的服务器上,创建一个新目录来存放您的配置文件。
1 | # 例如,在 /root/ 目录下创建一个名为 n8n-custom 的目录 |
步骤 2:创建 Dockerfile
在 /root/n8n-custom 目录中,创建一个名为 Dockerfile 的文件。
1 | nano Dockerfile |
将以下内容粘贴到文件中。此配置基于 Alpine Linux(n8n 官方镜像的基础)。
1 | # ----------------------------------------------- |
Dockerfile 代码编辑示意图
步骤 3:创建 docker-compose.yml
在相同目录下,创建 docker-compose.yml 文件。
1 | nano docker-compose.yml |
将以下内容粘贴到文件中。
1 | version: '3.8' |
步骤 4:构建并启动
在 /root/n8n-custom 目录下,运行 docker-compose。
1 | docker-compose up -d --build |
Docker 会开始构建您的新镜像(这可能需要几分钟),然后启动 n8n。
Docker 构建过程示意图
🍪 阶段二:配置 Cookie 以绕过验证
yt-dlp 访问 YouTube 或 Bilibili 时,会因为服务器的机器人检测(如 “412 Precondition Failed” 或 “Sign in to confirm”)而失败。我们必须提供 Cookie。
步骤 1:在本地获取 Cookie 文件
- 在您的本地电脑(非服务器)的 Chrome / Firefox 浏览器上,安装一个 Cookie 导出插件(例如:Get cookies.txt)
- 登录
youtube.com,点击插件图标,导出 Cookie,保存为youtube_cookies.txt - 登录
bilibili.com,点击插件图标,导出 Cookie,保存为bilibili_cookies.txt
浏览器 Cookie 导出插件示意图
步骤 2:上传 Cookie 到 n8n 数据卷
您需要将这两个 .txt 文件上传到 n8n 的持久化数据目录。
2.1 找到数据卷路径
根据我们的 docker-compose.yml,卷名是 n8n_data_custom。由于您的目录是 n8n-custom,Docker 卷的真实名称可能是 n8n-custom_n8n_data_custom。
1 | # 运行此命令找到宿主机上的确切路径 |
您会得到一个路径,例如:/var/lib/docker/volumes/n8n-custom_n8n_data_custom/_data
2.2 创建并粘贴 Cookie 内容
使用 nano 和您上一步找到的路径,创建文件并粘贴 Cookie 内容。
1 | # 创建 YouTube Cookie |
步骤 3:⚠️ 修复 Cookie 文件权限(至关重要!)
您刚刚创建的文件归 root 用户所有。n8n 容器内的 node 用户没有权限读取(或写入)它们,会导致 Permission denied 错误。
我们必须在容器内更改这些文件的所有者。
1 | # 强制使用 root 用户在容器内执行 chown (更改所有者) |
文件权限修复示意图
🎯 阶段三:在 n8n 中使用 yt-dlp
现在一切准备就绪。
步骤 1:找到 yt-dlp 的绝对路径
由于我们是通过 Dockerfile 安装的,我们需要知道它的确切路径。
1 | docker exec n8n_custom_service which yt-dlp |
它很可能会返回:/usr/bin/yt-dlp
步骤 2:在 “Execute Command” 节点中使用
在您的 n8n 工作流中,添加 Execute Command 节点。在 Command 字段中,您必须使用绝对路径和对应的 Cookie。
n8n 工作流配置示例
YouTube 示例(检查字幕):
1 | /usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt --list-subs "https://www.youtube.com/watch?v=EXAMPLE_VIDEO_ID" |
Bilibili 示例(检查字幕):
1 | /usr/bin/yt-dlp --cookies /home/node/.n8n/bilibili_cookies.txt --list-subs "https://www.bilibili.com/video/EXAMPLE_VIDEO_ID" |
🎊 常用命令参考
下载视频(最高质量)
1 | /usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt -f "bestvideo+bestaudio" "VIDEO_URL" -o "/home/node/.n8n/downloads/%(title)s.%(ext)s" |
仅下载音频
1 | /usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt -x --audio-format mp3 "VIDEO_URL" -o "/home/node/.n8n/downloads/%(title)s.%(ext)s" |
下载字幕
1 | /usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt --write-subs --sub-lang zh-CN "VIDEO_URL" |
🔧 故障排除
问题 1:Permission denied
解决方案:确保您已经执行了 chown 命令来修复 Cookie 文件权限。
问题 2:yt-dlp: command not found
解决方案:确保使用绝对路径 /usr/bin/yt-dlp,而不是 yt-dlp。
问题 3:412 Precondition Failed
解决方案:Cookie 可能已过期,需要重新导出并上传新的 Cookie 文件。
✅ 总结
- ✅ 构建了包含 yt-dlp 的自定义 n8n Docker 镜像
- ✅ 配置了 YouTube 和 Bilibili 的 Cookie 文件
- ✅ 修复了文件权限问题
- ✅ 在 n8n 工作流中成功使用 yt-dlp
您的 n8n 现在已经完全配置好了,可以稳定地使用 yt-dlp 了!🎉
📚 参考资料
如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp