之前用 yt-dlp 下 YouTube 会员视频,死活报错
Sign in to confirm your age。查了半天说要带 cookies。我手动从浏览器开发者工具里把Cookie请求头那一长串复制出来,贴到命令行,结果格式不对,yt-dlp 不认。折腾两小时后发现了Get cookies.txt这个浏览器扩展——一键导出符合 Netscape 格式的 cookies.txt,从此再也没有 cookie 格式错误。
这篇文章把所有获取 cookies.txt 的方法(扩展、手动、编程)和踩坑记录整理出来。
一、什么是 cookies.txt,为什么需要它
- cookies.txt 是一个纯文本文件,里面按行存储网站的 Cookie(域名、路径、名称、值、过期时间等)。
- 很多命令行工具(yt-dlp、wget、curl、aria2)支持
--cookies cookies.txt来加载浏览器中的登录状态。 - 典型场景:下载需要登录的视频(YouTube 年龄限制、B 站 1080p+)、访问需要认证的 API、抓取个人数据。
Netscape 格式长这样:
# Netscape HTTP Cookie File
.youtube.com TRUE / TRUE 1700000000 SAPISID 7Px...
.youtube.com TRUE / TRUE 1700000000 __Secure-3PSID ...
二、方法一:浏览器扩展(推荐,最省事)
支持的浏览器
Chrome / Edge / Brave / Vivaldi
Firefox
2.1 Chrome 系浏览器
扩展名称:Get cookies.txt LOCALLY(注意带 "LOCALLY" 的版本不上传数据)
安装地址:
Chrome 应用商店搜索 "Get cookies.txt LOCALLY"
或直接访问:https://chrome.google.com/webstore/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc
使用方法:
1、打开目标网站并登录。
2、点击浏览器右上角的扩展图标。
3、点击 "Export" 或 "Cookies.txt"。
4、文件自动下载为 cookies.txt。
踩坑:有些修改版 Chrome 会阻止扩展获取 Cookie,需要开启 "允许访问网站地址" 权限。
2.2 Firefox
扩展名称:cookies.txt
安装地址:Firefox 附加组件商店搜索 "cookies.txt"
使用方法:和 Chrome 类似。
为什么不推荐在线转换工具?
你的 Cookie 包含登录凭证,发给任何第三方网站就是直接把账号密码交出去。
永远只用本地扩展或本地脚本。
三、方法二:手动从开发者工具导出(无扩展权限时)
某些公司浏览器禁止安装扩展,这时候只能手动。
步骤
1、打开浏览器开发者工具(F12)。
2、切换到 Application(Chrome)或 Storage(Firefox)标签。
3、左侧找到 Cookies,点击目标网站域名。
4、你会看到一张表,每行一个 Cookie。
5、需要手动拼接成 Netscape 格式。极其繁琐,不推荐。
用 Console 脚本导出(半自动)
在开发者工具的 Console 里粘贴以下 JavaScript 代码,会自动下载 cookies.txt:
javascript
(function() {
const cookies = document.cookie.split(';').map(c => c.trim());
let output = '# Netscape HTTP Cookie File\n';
cookies.forEach(cookie => {
const [name, value] = cookie.split('=');
output += `.${location.hostname}\tTRUE\t/\tFALSE\t${Math.floor(Date.now()/1000)+86400}\t${name}\t${value}\n`;
});
const blob = new Blob([output], {type: 'text/plain'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'cookies.txt';
a.click();
})();
注意:这个方法只能拿到 document.cookie 里的 Cookie(非 HttpOnly 的)。很多关键 Cookie(如 SAPISID)标记了 HttpOnly,JS 无法读取。所以这个方法对 YouTube、Google 等网站基本无效。
四、方法三:用 Python 脚本导出(高级)
如果你熟悉 Python,可以用 browser_cookie3 库直接读取浏览器的 Cookie 数据库。
安装:
pip install browser-cookie3
导出 Chrome 的 YouTube Cookie 为 Netscape 格式:
python
import browser_cookie3
import http.cookiejar
cj = browser_cookie3.chrome(domain_name='.youtube.com')
http.cookiejar.MozillaCookieJar.save(cj, 'cookies.txt', ignore_expires=True, ignore_discard=True)
优点:能拿到 HttpOnly Cookie,且不需要打开浏览器。
缺点:需要 Python 环境,且某些 Linux 下需要关闭浏览器才能读取。
五、实践:用 cookies.txt 配合 yt-dlp
下载需要登录的 YouTube 视频:
yt-dlp --cookies cookies.txt https://www.youtube.com/watch?v=xxx
或者使用浏览器直接导入(不需要显式文件):
yt-dlp --cookies-from-browser chrome URL
这就是为什么 --cookies-from-browser 更方便——不用导出文件,yt-dlp 直接读浏览器数据库。但有些旧工具只支持文件,cookies.txt 还是必要的。
六、实践:配合 wget 或 curl
# wget
wget --load-cookies cookies.txt https://example.com/private-data
# curl
curl -b cookies.txt https://example.com/private-data
七、问题汇总
- yt-dlp: ERROR: cookies.txt: invalid cookie format
原因:文件格式不是标准的 Netscape 格式。
解决:用扩展导出的才是标准格式。手动拼凑的容易缺字段(TRUE/FALSE、域名前是否有点等)。 - Cookie 导出了,但 yt-dlp 仍然提示需要登录
原因:Cookie 可能已过期。登录态的 Cookie 过期时间很短(几小时到几天)。
解决:重新登录网站,再导出一次。或者使用 --cookies-from-browser 实时读取,每次都用最新状态。 - 扩展导出的 cookies.txt 里有大量重复行
原因:扩展导出了所有域名(包括子域名)的 Cookie,这没关系,工具会自动过滤。
解决:可以在导出的扩展界面里选择 "Only for this domain"。 - 在无图形界面的服务器上怎么获取 cookies.txt
场景:你在一台远程 Linux 服务器上跑 yt-dlp,没法打开浏览器。
解决:在你的本地电脑用扩展导出 cookies.txt,然后用 scp 传到服务器。注意:cookies.txt 包含你的登录凭证,传输时用加密通道,用完及时删除。 - 用 --cookies-from-browser chrome 报错 No such file or directory
原因:yt-dlp 找不到 Chrome 的 Cookie 数据库路径。
解决:指定配置文件位置:
yt-dlp --cookies-from-browser chrome --cookies-from-browser-path ~/.config/google-chrome/Default/Cookies URL
Windows 下类似。
- 导出后工具还是报 403 Forbidden
原因:有些网站会验证 User-Agent 和 Cookie 是否匹配。
解决:用 --user-agent 模拟浏览器的 UA,或者直接用浏览器的完整请求头。
八、安全提醒(非常重要)
cookies.txt 就是你的登录凭证,泄露给别人等于把账号送出去了。用完及时删除或加密存储。
不要上传到任何在线转换网站、GitHub、或发给他人。
在服务器上使用时,设置文件权限 chmod 600 cookies.txt。
定期清理过期的 cookies.txt 并重新导出。
九、一点小建议
1、优先用 yt-dlp 自带的 --cookies-from-browser,比手动导出文件更安全、更省事。
2、如果非要导出文件,务必用官方推荐的扩展 "Get cookies.txt LOCALLY" 或 Firefox 的 "cookies.txt" 扩展。
3、导出的 cookies.txt 可以用 head -n 5 cookies.txt 检查格式是否正确(开头应该有一行注释 # Netscape HTTP Cookie File)。
4、对于 YouTube,如果你只是为了下载不需要登录的公开视频,完全不需要 cookies。只有年龄限制、会员视频才需要。
写这篇的时候我又踩了个坑:用 Python browser_cookie3 读取 Chrome 的 Cookie,结果 Chrome 正在运行,sqlite 数据库被锁了,报错 database is locked。关掉 Chrome 后解决。但关掉 Chrome 后 Cookie 数据库里的密码可能未同步,所以最好还是用扩展导出。
最后推荐一个我的日常流程:
1、本地 Chrome 登录目标网站。
2、点击 "Get cookies.txt LOCALLY" 扩展,导出为 cookies.txt。
3、scp 到服务器。
4、在服务器上 yt-dlp --cookies cookies.txt URL。
5、任务完成后 rm cookies.txt。