如何下载推特(X)上的图片和视频:gallery-dl + yt-dlp 实战
想把推特(现在叫 X)上某个账号的图片、视频整批存下来,网页右键另存又慢又缺画质?这篇记录一套我实际跑通的方案:gallery-dl 抓图片、yt-dlp 抓视频、ffmpeg 兜底合并,配合登录 cookies 和代理,可以稳定地按账号批量下载,也能下单条推文的媒体。
工具分工
三件套各司其职,别用一个工具硬扛所有场景:
- gallery-dl —— 专做图床/相册类抓取,下 X 的图片和整个账号的 media 最顺手,文件命名、分目录都能配置。
- yt-dlp —— 万能视频下载器,X 上的视频(尤其要原画质、要合并音视频轨)交给它。
- ffmpeg —— yt-dlp 的依赖,负责把分离的视频/音频轨合并、转码。装上就行,平时不用直接调用。
安装
# Python 工具(推荐用 pip)
pip install -U gallery-dl yt-dlp
# ffmpeg:
# Windows: winget install Gyan.FFmpeg
# macOS: brew install ffmpeg
# Linux: sudo apt install ffmpeg
装完确认版本,能打印出来就说明 OK:
gallery-dl --version
yt-dlp --version
ffmpeg -version
最快上手
# 下某账号 media 标签下的全部图片(把 NASA 换成目标用户名)
gallery-dl "https://x.com/NASA/media"
# 只下某一条推文里的媒体
gallery-dl "https://x.com/NASA/status/1234567890"
# 下视频用 yt-dlp(指向具体推文)
yt-dlp "https://x.com/NASA/status/1234567890"
能跑通这几条,剩下的都是在它们上面加参数。
关键经验一:登录 cookies(最重要的一步)
X 现在对未登录访问卡得很死——不带登录态,基本只能拿到零星几条,甚至直接报错。想下整个账号、或者下需要登录才能看的内容,必须给工具喂一份你已登录的 cookies。
做法:用浏览器扩展(比如 “Get cookies.txt LOCALLY”)导出 Netscape 格式的 cookies.txt,然后:
# gallery-dl
gallery-dl --cookies cookies.txt "https://x.com/NASA/media"
# yt-dlp
yt-dlp --cookies cookies.txt "https://x.com/NASA/status/1234567890"
用小号导出 cookies,别用主号——批量抓取有被风控的风险。cookies 会过期,下不动了先重新导一份再排查别的。
关键经验二:代理
如果你的网络访问 X 不稳定,给工具单独指定代理(端口换成你自己的):
gallery-dl --proxy "http://127.0.0.1:10809" "https://x.com/NASA/media"
yt-dlp --proxy "http://127.0.0.1:10809" "https://x.com/NASA/status/123"
关键经验三:用配置文件精细控制 gallery-dl
命令行参数多了记不住,gallery-dl 支持配置文件。新建一个 gdl-config.json,把常用设置固化下来:
{
"extractor": {
"base-directory": "./X-Download",
"proxy": "http://127.0.0.1:10809",
"skip": true,
"twitter": {
"videos": true,
"retweets": false,
"quoted": true,
"replies": false,
"text-tweets": false,
"directory": ["{user[name]}"],
"filename": "{tweet_id}_{num}.{extension}"
}
}
}
几个值得说的选项:
"skip": true—— 已经下过的文件跳过,增量更新全靠它,重复跑不会浪费流量。"retweets": false/"replies": false—— 只要本人发的,不要转推和回复,干净很多。"videos": true—— gallery-dl 也顺手把视频带下来。"directory"/"filename"—— 按用户名分文件夹、按推文ID_序号命名,归档清晰。
用配置文件跑:
gallery-dl -c gdl-config.json --cookies cookies.txt "https://x.com/NASA/media"
一个偷懒的整合脚本
把"传用户名就开下"的逻辑包一层(这里给 PowerShell 版思路,bash 同理):
param([string]$Target, [switch]$Video)
# 用户名 -> media 页 URL;直接传 URL 也支持
if ($Target -match '^https?://') { $url = $Target }
else { $url = "https://x.com/$($Target.TrimStart('@'))/media" }
if ($Video) {
yt-dlp --cookies cookies.txt --proxy "http://127.0.0.1:10809" `
-o "%(uploader_id)s/%(id)s.%(ext)s" --windows-filenames $url
} else {
gallery-dl -c gdl-config.json --cookies cookies.txt $url
}
之后 .\twdl.ps1 NASA 下图片、.\twdl.ps1 NASA -Video 下视频,省得记一长串参数。
踩过的坑
- 只能下到零星内容 / 报错 —— 九成是没带 cookies 或 cookies 过期,先重导一份。
- Windows 下文件名报错 —— 推文标题里有
:、?、|这类非法字符,yt-dlp 加--windows-filenames,gallery-dl 默认会处理。 - 配置文件不生效 / 被沙箱串改 —— 工具默认读
%APPDATA%下的配置,某些应用沙箱会虚拟化这个目录。把配置放到普通路径,用gallery-dl --config-ignore -c 你的config/yt-dlp --ignore-config强制只读你指定的那份。 - 视频只有画面没声音 / 画质偏低 —— 用 yt-dlp 而不是 gallery-dl 下视频,它会自动选最高质量并用 ffmpeg 合并音视频轨。
- 下太快被限流 —— 加
--sleep/ 限制条数(gallery-dl--range 1-50、yt-dlp--playlist-items 1-50)慢点下。
最后
这套工具很强,但请只下载你有权保存的内容,尊重原作者的版权,别拿去二次传播牟利。自己存档、离线欣赏,足够了。
工具版本:gallery-dl 1.32.3 / yt-dlp 2026.06.09 / ffmpeg 8.1.1。X 的接口时常变动,命令失效时先把两个工具升级到最新:pip install -U gallery-dl yt-dlp。