Telegram 里关注的群组、频道经常有大量图片和视频,官方客户端一张张点"保存"既慢又烦,遇到设了"禁止保存"的频道更是无从下手。这篇介绍 tdl——一个基于 Telegram 官方 MTProto 协议的命令行下载器,多线程、速度快,能按时间/类型批量导出整个频道的媒体,连"禁止保存/转发"的内容也能下。

tdl 是什么

tdl(Telegram Downloader)是一个用 Go 写的开源命令行工具:

  • :多线程并发下载,跑满带宽,比官方客户端快几倍。
  • 批量:先把一个频道/群的消息导出成清单,再一次性全下。
  • 会绕限制:对设了"禁止保存内容"的频道,它通过 takeout 会话也能下载(仅供你自己已能看到的内容)。
  • 跨平台:Windows / macOS / Linux 都有。

安装

# Windows(用 Scoop,需先加 extras 源)
scoop bucket add extras
scoop install tdl

# macOS(用 Homebrew)
brew install telegram-downloader

# Linux / 通用:从 Releases 下载对应平台的二进制
#   https://github.com/iyear/tdl/releases
# 或用 Go 安装
go install github.com/iyear/tdl@latest

装完确认:

tdl version

第一步:登录

Telegram 在墙内被封,先准备好代理(端口换成你自己的)。tdl 的全局参数 --proxy 各子命令都能加:

# 扫码登录(手机 Telegram 扫一下,要显式加 -T qr)
tdl login -T qr --proxy socks5://127.0.0.1:7890

# 或用手机验证码登录
tdl login -T code --proxy socks5://127.0.0.1:7890

# 复用电脑上已登录的 Telegram Desktop 会话(这其实是默认方式,不加 -T 就是它)
tdl login -T desktop

小贴士:用 -n 名字 可以给会话起个命名空间,方便多账号切换,后续命令都带上同一个 -n 即可。

第二步:找到目标群/频道

列出你加入的所有会话,找到目标的 ID 或 @用户名:

tdl chat ls --proxy socks5://127.0.0.1:7890

记下目标频道的 @username(公开频道)或数字 ID(私有群)。注意:你必须先加入该群/频道,才能下载里面的内容。

第三步:导出消息清单

把目标频道里的媒体消息导出成一个 JSON 清单。可以按时间范围、消息 ID 范围过滤:

# 导出整个频道的媒体消息
tdl chat export -c @目标频道 -o tdl-export.json --proxy socks5://127.0.0.1:7890

# 只导出某个时间段(Unix 时间戳)
tdl chat export -c @目标频道 -T time -i 1704038400,1735660800 -o tdl-export.json

# 只导出最近 N 条
tdl chat export -c @目标频道 -T last -i 500 -o tdl-export.json

第四步:批量下载

拿着清单一次性全下,下载时再按文件类型筛选、设并发:

tdl dl -f tdl-export.json \
  -d ./download \
  --include jpg,png,jpeg,gif,mp4,mov \
  -t 8 -l 4 \
  --skip-same \
  --proxy socks5://127.0.0.1:7890

几个常用参数:

  • -d ./download —— 下载到哪个目录。
  • --include jpg,png,mp4,... —— 只下这些扩展名(只要图就去掉视频后缀,反之亦然);也可以用 --exclude 排除。
  • -t 8 线程数、-l 4 并发任务数 —— 别开太高,太激进容易触发 Telegram 的限速(flood wait)。
  • --skip-same —— 已下过的跳过,断点续传/增量更新靠它。
  • --continue —— 续传未完成的下载。

只下某几条

如果只想要某几条消息的媒体,不用导出清单,直接喂消息链接:

tdl dl -u "https://t.me/频道用户名/12345" \
       -u "https://t.me/频道用户名/12346" \
       --proxy socks5://127.0.0.1:7890

踩过的坑

  • 下不动 / 连不上 —— 九成是代理没配好,确认 --proxy 端口和协议(socks5/http)对得上。
  • 报 FLOOD_WAIT —— 并发开太高被限速了,把 -t/-l 调小,等一会儿再跑。
  • 私有频道下不了 —— 你得先是该频道成员;纯靠链接、没加入是下不了的。
  • “禁止保存"的频道 —— tdl 默认会用 takeout 会话尝试绕过,仍下不动可加 --takeout 显式开启。
  • 文件名乱/想自定义 —— 用 --template 定制命名,比如按 {{ .MessageID }}_{{ .FileName }} 之类的模板。
  • 多账号 —— 全程带上同一个 -n 命名空间,会话互不干扰。

最后

tdl 很强,但请只下载你有权获取的内容,尊重创作者与群组规则,下载的素材自用即可,别拿去二次传播或牟利。


命令以 tdl 当前版本为准,Telegram 接口和工具都在更新,命令失效时先 tdl -h 或看官方文档:https://docs.iyear.me/tdl/ 。