抖音TikTok下载工具DouK-Downloader实战指南
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
DouK-Downloader(历史名称 TikTokDownloader)是一款完全开源的抖音/TikTok 作品下载与数据采集工具,基于 HTTPX 异步网络库实现,覆盖作品文件下载、结构化数据采集、直播录制与 Web API 服务化四类使用场景。本文按"交接说明"的方式组织:先盘点它能做什么、明确不能做什么,再给出从安装到首次下载的完整路径,最后拆解到源码级的数据流、核心模块与生产部署要点。
第一幕:能力与边界盘点
定位:双平台下载与采集的一站式方案
项目解决的核心痛点是:免抓包、免逆向地批量获取抖音/TikTok 的作品文件与结构化数据。能力按使用场景分组如下:
| 使用场景 | 具体能力点 |
|---|---|
| 作品下载 | 抖音视频/图集/实况/动图、最高画质;TikTok 视频原画/图集;动态/静态封面、音乐 |
| 账号维度 | 抖音账号发布/喜欢/收藏/收藏夹作品批量下载;TikTok 账号发布/喜欢作品;多账号批量 |
| 链接维度 | 批量下载链接作品;后台监听剪贴板,新链接自动入队下载 |
| 直播录制 | 获取抖音/TikTok 直播拉流地址,调用 ffmpeg 录制直播视频 |
| 数据采集 | 作品评论、合集/合辑、账号详细数据、综合/视频/用户/直播四类搜索、抖音热榜 |
| 工程能力 | 增量下载、断点续传、多线程、自动跳过已下载、CSV/XLSX/SQLite 持久化、代理请求、局域网远程访问、Web API 调用 |
功能清单的完整来源是 README 的「项目功能」列表,全部逻辑集中在 src/ 下,可读可改。
四项弃用或失效功能,不要依赖
⚠️ 以下功能在 README 或源码中有明确标注,使用当前版本时请将其从依赖清单中划掉:
| 功能 | 状态 | 原因 |
|---|---|---|
| Web UI 交互模式 | 重构中 | 代码尚未更新,菜单选中后仅提示"该功能正在重构",见 TikTokDownloader.py 的disable_function(约第 138-145 行) |
| 内置加密参数算法 | 已过期失效、不再维护 | 为合规不再维护 xBogus/aBogus 等内置算法(src/encrypt/),部分功能可能无法正常工作,需自行准备生成代码 |
| 从浏览器读取 Cookie | 已弃用 | README 删除线标注;主菜单对应代码已注释(TikTokDownloader.py 约第 114、118 行) |
| 扫码登录获取 Cookie | 已失效 | README 删除线标注;主菜单对应代码已注释 |
第二幕:从安装到第一次下载
安装:Python 3.12 下限与两条等价路径
环境硬指标只有一条:Python 不低于3.12。Windows 10 及以上、macOS、Linux 均可运行;README 推荐 Windows 11 自带终端以获得最佳交互体验。获取源码后,pip 与 uv 两条路径任选其一:
git clone https://gitcode.com/GitHub_Trending/ti/TikTokDownloader cd TikTokDownloader pip install -r requirements.txt python main.py # 或 uv 路径(README 推荐):uv sync --no-dev && uv run main.pyrequirements.txt 即技术栈本身:httpx[socks]异步请求与代理、rich彩色终端、fastapi/uvicorn服务化、pydantic数据校验、aiosqlite/openpyxl持久化、aiofiles异步文件读写。
写入 Cookie:唯一必填的身份凭证
💡 Cookie 是浏览器端身份凭证,决定接口权限和视频画质,仅需在失效后重写,不是每次运行都要写。获取步骤参考 docs/Cookie获取教程.md:
- 浏览器访问抖音网页版(可选无痕模式),可登录可跳过;
- 按 F12 打开开发人员工具,切到「网络」选项卡,勾选「保留日志」;
- 筛选框输入
cookie-name:odin_tt; - 点击任意作品的评论区触发请求,选取一个数据包;
- 全选并复制请求头中
Cookie的完整值。
两点补充:Cookie 未登录时,账号页、私密账号作品等接口会直接失败,私密账号还需要登录账号已关注对方;画质偏低时优先怀疑 Cookie 过期。
3 分钟拿到第一个下载结果
- 运行
python main.py,首次启动看到项目标题与免责声明后输入YES回车(该选择持久化,仅首次出现); - 主菜单选择
手动输入 Cookie (抖音),粘贴 Cookie 回车(也可选从剪贴板读取 Cookie,复制后直接回车); - 返回主菜单,选择
终端交互模式; - 依次选择
批量下载链接作品(抖音)→手动输入待采集的作品链接; - 粘贴一个抖音作品链接回车,等待进度条走完,文件落在
root/folder_name目录(默认Download/),文件名含创建时间、作品类型、账号昵称、作品描述; - 任意菜单直接回车返回上级,输入Q或q结束程序。
最小可运行示例:
python main.py # 终端交互模式 -> 批量下载链接作品(抖音) # -> 手动输入待采集的作品链接 -> 粘贴作品链接回车 # 产物出现在 Download/ 目录,文件名按 name_format 规则生成settings.json 参数逐项过一遍
首次启动会在项目根目录自动生成settings.json,生成逻辑是 settings.py 的__create(约第 151-162 行),全部默认值定义在同文件Settings.default(约第 21-121 行);读取时缺失参数会自动补齐并回写。修改后必须重启程序才生效,不支持热加载。旧版本字段有自动映射(rename_params,约第 122-143 行):default_mode→run_command、update_cookie→douyin_platform、update_cookie_tiktok→tiktok_platform、original_cover→static_cover。
| 参数名 | 默认值 | 一句话作用 | 修改建议 |
|---|---|---|---|
cookie/cookie_tiktok | "" | 抖音/TikTok 身份凭证,支持字符串或字典 | 登录后从浏览器写入,失效再更新 |
root | "" | 储存根路径,非法则回退项目根目录 | 填已存在的目录 |
folder_name | "Download" | 顶层下载目录名 | 保持简单,避免非法字符 |
name_format | "create_time type nickname desc" | 作品文件命名模板 | 从七键组合,见下文详解 |
storage_format | "" | 数据持久化格式(CSV/XLSX/SQLite 等) | 纯采集场景必须配置,否则不落盘 |
download | true | 是否下载文件 | 只采数据设为false |
max_pages | 0(等价 99999) | 分页请求次数上限 | 控制喜欢/收藏的拉取量 |
proxy/proxy_tiktok | "" | 平台代理地址 | 启动时自动测连,失败即忽略 |
timeout/max_retry | 10/5 | 请求超时(秒)/失败重试次数 | 范围 2-10 秒、0-5 次 |
max_size/chunk | 0/2MB | 单文件大小上限/接收数据块大小 | chunk 范围 128KB-2MB |
music/dynamic_cover/static_cover | 均false | 是否额外下载音乐或封面 | 按需开启 |
run_command | "" | 启动时预执行的功能指令 | 免去重复选菜单 |
ffmpeg | "" | ffmpeg 可执行文件路径 | 下载直播必填 |
desc_length/name_length/truncate | 64/128/50 | 描述/文件名截断长度与智能截断阈值 | 一般不动 |
校验逻辑集中在 parameter.py,对行为影响最大的五个参数逐个说明:
- cookie:
__check_cookie(约第 280-287 行)同时接受字典与字符串,非法类型记警告并返回空值。它是账号页、私密作品、最高画质三条链路的共同前提。 - root:
__check_root(约第 368-382 行)先判目录是否存在,再尝试在父目录下创建,都不行才回退项目根路径并写警告日志——文件"消失"时先查这里。 - name_format:
__check_name_format(约第 404-415 行)要求每个键都在NAME_KEYS(约第 55-63 行)的七个键内:id/desc/create_time/nickname/uid/mark/type,任一非法即整体回退默认组合,不做部分保留。 - max_pages:
__check_max_pages(约第 525-535 行)中0与非正整数统一按 99999 处理。喜欢/收藏接口只返回发布日期而非操作日期,程序必须拉全量再筛选,此参数是唯一的量级阀门。 - proxy:
__check_proxy(约第 453-502 行)启动时实际请求平台页面测连,超时或报错直接返回None,代理静默失效;在日志里找"代理测试成功/失败"确认。
第三幕:内部机制与生产化
部署形态:容器一行起服务与 Web API 接口模式
Docker 容器。镜像有三种获取方式:用仓库根目录 Dockerfile 本地构建(双阶段构建,python:3.12-bullseye 编译依赖后复制到 python:3.12-slim 最终镜像,EXPOSE 5555、VOLUME /app/Volume);或拉取官方推送镜像joeanamier/tiktok-downloader、ghcr.io/joeanamier/tiktok-downloader:
docker run --name tiktok-dl -p 5555:5555 \ -v tiktok_downloader_volume:/app/Volume -it joeanamier/tiktok-downloader docker start -i tiktok-dl能力差异:容器无法访问宿主机文件系统与本地浏览器,从浏览器读取 Cookie等依赖宿主环境的功能不可用(README 明确说明),其余功能异常需向作者反馈。
Web API 接口模式。主菜单选择Web API 模式,程序在0.0.0.0:5555启动 FastAPI 服务,常量SERVER_HOST/SERVER_PORT定义于 static.py(约第 10、13 行),服务实现在 main_server.py 的APIServer.run_server(约第 82-101 行)。访问http://127.0.0.1:5555/docs或/redoc可查阅自动生成的交互文档:
鉴权机制:每个接口经token_dependency(约第 46-51 行)读取请求头中的token,交由 function.py 的is_valid_token()(第 73 行)校验,失败返回HTTP 403。项目默认无需令牌(该函数恒返回True);公开部署时建议在此处设置固定令牌防恶意请求,并可用/token接口测试有效性。调用示例:
from httpx import post data = {"detail_id": "0123456789", "pages": 2} resp = post("http://127.0.0.1:5555/douyin/comment", json=data, headers={"token": ""}) print(resp.json())🔧 生产化各一句:多实例请复制整个项目文件夹隔离运行;对外暴露前挂一层反向代理终结 TLS 并做限流;长期运行将 uvicorn 日志重定向到文件落盘。
一条完整下载链路
数据流一句话串起:用户输入经 link/extractor.py 的Extractor/ExtractorTikTok(约第 13、166 行)解析短链为完整链接,interface/ 下各接口类发起分页请求,extract/extractor.py 统一提取字段,downloader/ 先写入临时文件夹再移动至储存文件夹,storage/ 按storage_format持久化数据(csv/xlsx/sqlite/mysql/text 五个实现),调度中枢是 TikTokDownloader.py 的主菜单分发与run_command直达——run()(约第 430 行)先过免责声明,再进入main_menu(约第 273 行)。
三个核心模块与两个工程细节
- 调度层
TikTokDownloader(TikTokDownloader.py):菜单项在__update_menu(约第 111-136 行)注册,每项绑定处理方法;另开守护线程periodic_update_params(约第 439-447 行),以COOKIE_UPDATE_INTERVAL = 15 * 60秒(static.py 第 16 行)为周期自动刷新加密参数并回写 Cookie,免去手动维护时效性字段。 - 接口层
API模板(template.py):统一generate_params(约第 95 行)/request_data(约第 248 行)/check_response(约第 221 行)三段式,子类 account.py、detail.py、comment.py、live.py、search.py、hot.py 各自只关心 URL 与游标规则;终端菜单的功能入口定义在 main_terminal.py 的__function(约第 141 行起)。 - 下载层
Downloader(download.py):semaphore = Semaphore(MAX_WORKERS)(第 45 行)限制并发,MAX_WORKERS = 4(static.py 第 2 行);__update_headers_range(约第 938 行)支持 Range 断点续传;request_file(约第 584 行)先落临时目录,save_file(约第 845 行)完成后再移入目标目录,避免半成品污染归档。
两个值得单独读的工程设计:
- 重试与退避:retry.py 的
Retry.retry装饰器(约第 10-23 行)按max_retry上限循环重试,每次失败后await wait()智能延时,失败达上限才终止任务并置finished标记。智能延时机制同样用于降低整体请求频率,避免打满平台限流。 - 文件完整性校验:static.py 的
FILE_SIGNATURES(第 29-54 行)内置 jpg/png/mp4/mov/webp 等文件的头魔数与偏移量,下载完成后据此校验真实类型并纠正后缀,对应 README 功能列表中的"文件完整性处理机制"。
排障速查与运维纪律
| 现象 | 原因 | 解法 |
|---|---|---|
| 数据获取失败、视频清晰度偏低 | Cookie 失效或未登录 | 重新写入 Cookie;私密账号需已关注对方的登录 Cookie |
| 文件没出现在预期目录 | root为非法路径,已回退项目根目录 | 查运行日志中 root 警告,改为已存在目录后重启 |
| 代理配置了却没生效 | 启动时代理测连失败,程序自动忽略 | 先手动验证代理可用,再确认日志出现"代理测试成功" |
| 批量喜欢/收藏作品很慢 | 接口只返回发布日期,需拉全量再筛选 | 用max_pages控制请求页数,缩小日期区间 |
| 升级后旧作品"丢失" | 旧版本数据在_internal/Volume,新版未继承 | 按 README 更新方案一,将旧版_internal/Volume复制到新版_internal |
| 多开实例行为异常 | 项目未针对多开优化 | 复制整个项目文件夹,各开独立实例 |
三条运维纪律:终止程序或 ffmpeg 一律按Ctrl + C,不要直接点终端关闭按钮;批量下载收藏作品模式仅支持当前登录 Cookie 对应账号,暂不支持多账号;本项目明确不支持付费作品下载,请勿就此提出需求。
DouK-Downloader 适用于个人作品归档、中小规模账号数据采集、Web API 服务化集成三类场景,双平台能力完整且全部逻辑可读可改。使用前请完整阅读 README 末尾的免责声明,理解并接受全部条款;本项目使用必须自行遵守相关法律法规与平台规则,因数据采集与下载行为产生的一切法律责任由使用者自行承担。
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考