想把推特(现在叫 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 支持配置文件。新建一个 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