3步跑通抖音/TikTok批量下载工具:从单链接到服务器部署的完整指南
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
DouK-Downloader(原 TikTokDownloader)是一款基于 HTTPX 的免费抖音/TikTok 批量下载工具:支持账号作品、合集、图集、评论数据、直播拉流等 40 余项功能,内置 Cookie 鉴权、断点续传与作品下载记录,可以按"个人终端 → 团队 API → 生产容器"三档逐步演进。按需求跳转:
- 🚀 只下几个作品:看「最短路径上手」,4 个命令跑通
- 🌐 给团队提供下载接口:看「进阶实战」第 2 档 Web API 模式
- 🏭 7×24 无人值守:看「进阶实战」第 3 档 Docker 部署
一、为什么你需要一个下载器:三个具体痛点
抖音/TikTok 的短链并不直接包含文件地址,分享链接需要跳转解析才能提取出 19 位数字作品 ID;私密账号的发布作品必须携带已登录 Cookie 才能获取数据,且登录账号还需关注该私密账号;批量请求受平台频控约束,连续高频访问会触发限流。这三点恰好是本项目设计对应的三块能力:
| 痛点 | 项目对策 | 相关参数 |
|---|---|---|
| 短链跳转、ID 提取 | 内置链接提取器,自动展开短链 | src/link/extractor.py |
| Cookie 失效导致数据缺失 | 剪贴板写入 + 后台周期刷新任务 | cookie/cookie_tiktok |
| 批量下载易漏易重 | 断点续传 + 作品 ID 记录跳过 | max_retry: 5、Record 开关 |
二、最短路径上手:四步跑通
第 1 步:获取源码。
git clone https://gitcode.com/GitHub_Trending/ti/TikTokDownloader cd TikTokDownloader第 2 步:创建虚拟环境并安装依赖,建议 Python 3.12 或更高版本。
python -m venv venv source venv/bin/activate pip install -r requirements.txt第 3 步:启动程序,首次运行会展示免责声明(输入 YES 确认)并自动在项目根目录生成settings.json。
python main.py启动后主界面长这样,选择「终端交互模式」进入功能菜单:
第 4 步:写入 Cookie 再开始下载。参考 Cookie获取教程 复制 Cookie 到剪贴板,回到主菜单选择「从剪贴板读取 Cookie」;随后进入「终端交互模式」→「批量下载链接作品」,粘贴作品链接即可下载。
三、核心机制拆解:三个模块看清原理
3.1 短链解析:从分享链接到 19 位作品 ID
一句话概括:先用请求器展开短链跳转,再用正则表从地址中抠出作品 ID。
src/link/extractor.py中的关键代码,规则表 + 分发逻辑一目了然:
detail_id = compile(r"\b(\d{19})\b") # 作品 ID detail_link = compile( r"\S*?https://www\.douyin\.com/(?:video|note|slides)/([0-9]{19})\S*?" ) async def run(self, text, type_="detail", proxy=None): text = await self.requester.run(text, proxy) # 先展开短链 match type_: case "detail": return self.detail(text) case "user": return self.user(text)3.2 并发与容错:信号量限流 + Range 续传
一句话概括:全局信号量把并发钉死在 4 个任务,请求头天然携带 Range 支持续传,失败按max_retry上限自动重试。
src/downloader/download.py的类级信号量是并发的总闸门:
class Downloader: semaphore = Semaphore(MAX_WORKERS) # MAX_WORKERS = 4src/custom/internal.py中所有下载请求默认携带续传头,配合settings.json里的"chunk": 2097152(2MB 分块)与"max_retry": 5(重试上限 5 次),大文件断网后重启即可从中断处继续:
DOWNLOAD_HEADERS = { "Accept": "*/*", "Range": "bytes=0-", "Referer": "https://www.douyin.com/?recommend=1", "User-Agent": USERAGENT, }3.3 配置驱动:一份 settings.json 管住所有行为
一句话概括:账号清单、命名规则、存储格式全部落盘在settings.json,程序每次启动自动补齐缺失参数。
# settings.json 核心字段(默认值节选自 src/config/settings.py) "accounts_urls": [{"mark": "", "url": "", "tab": "post", "earliest": "", "latest": "", "enable": True}], "name_format": "create_time type nickname desc", "chunk": 2097152, # 每次接收 2MB "timeout": 10, # 单请求 10 秒 "max_retry": 5, # 单文件最多重试 5 次 "storage_format": "" # 设为 csv/xlsx/sqlite 则持久化元数据启用主菜单里的「作品下载记录」后,已下载作品 ID 会写入本地数据库,二次运行自动跳过,这是"增量同步"的全部秘密。
四、进阶实战:三档部署配置要点
4.1 个人:终端交互 + 定时增量
配置要点:把常用账号写进settings.json的accounts_urls(tab可选 post 发布 / favorite 喜欢 / collection 收藏),mark填自定义标识避免昵称变更导致文件混乱。
"accounts_urls": [ {"mark": "tech", "url": "https://www.douyin.com/user/xxx", "tab": "post", "enable": true} ]python main.py提示:主菜单里把「作品下载记录」切到启用状态,配合
earliest/latest两个日期字段,每周重跑一次即可只补新作品。Cookie 只在失效后需要重写,并非每次运行都要更新。
4.2 小团队:Web API 模式做共享服务
配置要点:主菜单选择「Web API 模式」,程序基于 FastAPI 在127.0.0.1:5555起服务,所有接口都要带token请求头鉴权,接口清单可访问/docs或/redoc查阅。
curl -H "token: 你的token" \ -X POST http://127.0.0.1:5555/douyin/comment \ -d '{"detail_id": "0123456789", "pages": 2}'警告:服务默认只绑定本机地址。如需开放给局域网同事,请确保 token 已正确配置,避免无鉴权接口暴露;采集页数用
pages控制,避免单请求翻页过深触发频控。
4.3 生产环境:Docker 容器 + 代理
配置要点:仓库自带 Dockerfile,镜像内数据统一落在/app/Volume,只需挂载一个卷即可持久化 Cookie、下载记录与已存文件。
docker build -t dok-downloader . docker run -p 5555:5555 -v dok_volume:/app/Volume -it dok-downloader在settings.json配置proxy(TikTok 平台对应proxy_tiktok)做 IP 轮换,max_pages限制单次翻页深度。
警告:容器无法访问宿主机浏览器,「从浏览器读取 Cookie」不可用,Cookie 必须走剪贴板或配置文件写入;
max_pages保持 0(不限)时,喜欢/收藏类任务可能耗时很长,建议显式设值。
五、故障排查决策树
下载失败先对号入座,90% 的问题落在前三个分支:
- 解析失败:短链已过期或页面改版,提取不到 19 位作品 ID 时只能换有效链接
- 无权限数据:私密账号未登录,或登录 Cookie 未关注目标账号
- 请求被限流:降低批量频率,走
proxy轮换出口 IP - 文件不完整:网络抖动超过
max_retry(默认 5 次)上限,调大后重跑 - 命名乱:
name_format组合的字段过长,调整desc_length(默认 64)/name_length(默认 128)
六、进阶避坑:两个反直觉的"正确做法"
误区一:把并发调得越高越好。src/custom/static.py里MAX_WORKERS = 4不是保守,而是平台频控下的平衡点——单 IP 的请求频率阈值通常比你的出口带宽先被触发,并发从 4 拉到 10 时,失败重试反而吃掉带宽,实际吞吐不升反降。建议先保持 4,确认日志无大量重试后再小步上调。
误区二:断点续传可以替代下载记录。Range 续传只保"单文件",不保"任务级"——批量任务中断后重跑,跳过已下载作品靠的是 Record 记录的作品 ID。关掉记录功能再重跑,等于把整个账号作品从头再下一遍。另外timeout默认 10 秒、max_size为 0 表示不限制大小,随意改成极小值会直接截断长视频,改参数前先看一眼src/config/settings.py的默认值注释。
七、延伸学习路线
- 链接解析:src/link/extractor.py、src/link/requester.py
- 接口层(账号/评论/直播/搜索各一文件):src/interface/
- 下载执行与进度:src/downloader/download.py
- 配置与校验逻辑:src/config/settings.py、src/config/parameter.py
- 加密参数(已停更,需自备生成代码):src/encrypt/
- Web API 服务实现:src/application/main_server.py
- Cookie 获取图文教程:docs/Cookie获取教程.md
- 容器化:Dockerfile
掌握顺序建议:先读extractor.py搞懂"链接怎么变 ID",再读download.py搞懂"文件怎么落盘",最后看settings.py把所有可调参数过一遍——这条线走完,你就能独立完成参数调优和二次开发了。
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考