抖音 TikTok 批量下载工具 DouK-Downloader 完全实操指南:从 Cookie 配置到 Docker 生产部署
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
DouK-Downloader(历史项目名 TikTokDownloader)是一款完全开源的抖音 / TikTok 批量下载与数据采集工具,基于 HTTPX 异步网络模块编写,一套程序同时覆盖账号作品批量下载、链接作品下载、评论与搜索数据抓取、直播拉流、剪贴板监听下载,并可以通过 FastAPI 以 Web API 服务形态部署。这篇文章面向已经会pip install、docker run但对项目内部结构不熟悉的用户,带你走完一条完整路径:判断它适不适合你的场景 → 最短时间跑起来 → 把 Cookie 和配置改成你要的样子 → 按真实业务落地 → 容器化部署成长期服务。
先确认边界:它哪些能办、哪些办不了
在投入配置时间之前,先把能力边界看清楚。项目历史名为TikTokDownloader,现在叫DouK-Downloader,下面按业务域梳理它当前的实际能力:
| 业务域 | 能做的事 |
|---|---|
| 文件下载 | 抖音视频 / 图集 / 实况 / 动图、最高画质视频、TikTok 原画与图集、动态或静态封面、背景音乐 |
| 账号维度 | 抖音账号发布 / 喜欢 / 收藏 / 收藏夹作品,TikTok 账号发布 / 喜欢作品,账号详情数据 |
| 链接维度 | 抖音 / TikTok 链接批量下载、剪贴板监听自动下载 |
| 数据采集 | 作品评论与回复、合集 / 合辑作品、账号详细数据、综合 / 视频 / 用户 / 直播四类搜索、抖音热榜 |
| 直播 | 抖音 / TikTok 拉流地址获取,调用ffmpeg录制直播 |
| 工程能力 | 增量下载、断点续传、已下载跳过、csv/xlsx/sqlite持久化、代理请求、局域网访问、Web API |
然后是必须提前知道的限制,这几条会直接决定你的方案选型:
⚠️ 项目内置的加密参数算法已过期失效且不再维护,部分功能可能无法正常工作;如果用到相关功能,需要自行准备加密参数生成代码。
⚠️ Web UI 交互模式正在重构,当前进入只会提示"该功能正在重构";「从浏览器读取 Cookie」已弃用,「扫码登录获取 Cookie」已失效,两者都不要指望。
⚠️ 明确不支持付费作品下载;「批量下载收藏作品」只支持当前登录 Cookie 对应的单账号;程序未做多实例优化,想并行跑两套任务要复制整个项目文件夹。
最短路径:第一次把程序跑通
环境门槛只有一个:Python ≥ 3.12。依赖清单在 requirements.txt,核心技术栈是httpx[socks](异步 HTTP 加 SOCKS 代理)、rich(终端交互)、fastapi+uvicorn(Web API)、pydantic(数据模型)、aiosqlite(配置数据库)、openpyxl(XLSX 导出)、lxml(页面解析)、pyperclip(剪贴板)、aiofiles(异步文件 IO)。
git clone https://gitcode.com/GitHub_Trending/ti/TikTokDownloader cd TikTokDownloader依赖安装两条路线任选,官方推荐uv:
# 路线 A:uv(推荐) uv sync --no-dev uv run main.py # 路线 B:pip + venv python -m venv venv # Windows 激活:venv\Scripts\activate;Linux / macOS:source venv/bin/activate pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt python main.py程序真正的入口是 main.py:创建TikTokDownloader实例并await run(),同时捕获KeyboardInterrupt和CancelledError实现优雅退出。
首次启动时程序会打印项目信息和免责声明,输入YES确认——这个选择会写进数据库持久化,以后不再问(逻辑见 src/application/TikTokDownloader.py)。之后进入主菜单,能看到 Cookie 写入、终端交互模式、后台监听模式、Web API 模式、下载记录开关、日志开关、版本检查、语言切换(zh_CN/en_US)等选项:
两处交互约定贯穿全程,先记住:
- 直接回车 = 返回上级菜单,输入
Q或q= 退出程序; - 任何时候想终止程序或
ffmpeg,按Ctrl + C,不要直接点终端关闭按钮,否则临时目录清理逻辑不会执行。
另外两条平台注意事项:Windows 用户建议用 Windows 11 自带的 Windows 终端获得最佳交互体验;macOS 上如果下载的是未签名可执行文件,首次运行前在终端执行xattr -cr 项目文件夹路径移除安全标记。
让它真正为你工作:Cookie 与 settings.json
一次性把 Cookie 拿对写进配置
Cookie 是这套程序唯一但关键的"钥匙"。官方推荐路径(完整图文教程见 docs/Cookie获取教程.md):
- 打开浏览器(建议无痕窗口),访问抖音网页版并登录账号——不登录也能拿,但已登录 Cookie 的数据权限和可下载分辨率更高;
- 按
F12打开开发人员工具,切到网络选项卡,勾选保留日志; - 在筛选器输入
cookie-name:odin_tt,然后点开任意作品的评论区触发请求,选中任意一个数据包; - 完整复制请求头中
Cookie的值到剪贴板。
⚠️ 教程里在控制台执行
document.cookie的方法拿不到 httpOnly 字段,官方明确标注该方法不适用本项目,请以网络面板复制为准。
写入程序有两条路,抖音和 TikTok 各自独立存储(对应配置项cookie/cookie_tiktok):
- 手动输入 Cookie:选中后粘贴内容;
- 从剪贴板读取 Cookie:Cookie 已在剪贴板,选中后直接按回车。
写入后的使用要点:Cookie 只在失效后才需要重写,不是每次运行都要写;下载不到原画或数据请求失败时,第一反应应该是换 Cookie。另外程序内置一个周期性线程,每 15 分钟自动刷新msToken、tt_wid等易变参数并回写 Cookie(间隔常量COOKIE_UPDATE_INTERVAL = 15 * 60定义在 src/custom/static.py),这些参数你不需要手动管。
把 settings.json 改成生产可用的样子
首次运行会在项目根目录生成settings.json(生成与缺参补齐逻辑见 src/config/settings.py)。所有参数经 src/config/parameter.py 逐一校验后才生效,注意一个排障要点:非法值不报错,而是静默回退默认值——改错了配置,日志里看到的往往是回退提示而不是错误。
默认配置几乎不可用,典型部署需要动的是这几组字段:
文件落盘组
| 字段 | 默认值 | 说明 |
|---|---|---|
root | ""(回退到项目根目录的Download文件夹) | 文件落盘根路径 |
folder_mode | false | 是否按账号 / 合集建文件夹归档 |
name_format | "create_time type nickname desc" | 文件名模板,可用键:id/desc/create_time/nickname/uid/mark/type |
split | "-" | 文件名分隔符 |
desc_length/name_length | 64/128 | 描述与文件名截断长度 |
music/static_cover/dynamic_cover | false | 是否下载音乐、静态封面、动态封面 |
max_size | 0(不限) | 单文件字节上限 |
download | true | 只采集数据不落地文件时设为false |
网络组:proxy/proxy_tiktok(代理地址,程序会先用代理请求平台首页做连通性测试,失败或超时则自动忽略该代理)、timeout(默认 10 秒)、max_retry(默认 5 次)、chunk(默认2097152,2MB 分块)、max_pages(默认0,表示不封顶;喜欢 / 收藏类接口必须全量拉取后才能做日期筛选,给这类任务设个上限能省很多时间)。
存储与平台组:storage_format(留空 = 采集数据不持久化,可选csv/xlsx/sqlite)、ffmpeg(直播录制依赖的可执行文件路径)、live_qualities(直播画质)、douyin_platform/tiktok_platform(两个平台的功能总开关)、browser_info/browser_info_tiktok(请求指纹,含User-Agent、webid、device_id、地区与语言;TikTok 场景尤其重要,device_id的获取方法同样写在 docs/Cookie获取教程.md 末尾)。
改前改后对比一下,量其实不大:
刚生成时:
"root": ""、"storage_format": ""、"cookie": ""—— 文件堆在项目根目录,数据不落库,程序空转。典型部署后:
"root": "/data/videos"、"folder_mode": true、"storage_format": "sqlite"、"cookie": "<已写入>"、"max_pages": 10—— 按账号分目录归档,采集数据进 SQLite,喜欢 / 收藏类任务封顶 10 页请求。
⚠️ 修改
settings.json后必须重启程序才生效。旧版本字段(如default_mode、update_cookie、original_cover)会被自动映射为新字段,见 src/config/settings.py 中的rename_params。
三个真实场景的落地路径
场景一:把一批账号的作品批量入库
这是最高频的用法。进入终端交互模式->批量下载账号作品(抖音),账号链接有三种来源:accounts_urls配置(推荐,含mark自定义标识、tab作品类型、earliest/latest日期筛选)、手动输入、从文本文档读取(功能清单定义见 src/application/main_terminal.py)。
这个场景有四个值得提前知道的行为细节:
- 下载文件先写临时目录,完成后移入储存目录,程序退出时清空临时目录;
- 昵称或自定义标识(
mark)变化时,程序会自动重命名已下载文件中的对应部分; - 私密账号的发布作品,需要"已登录且已关注该账号"的 Cookie 才能采到;
- 内置智能延时机制,连续处理达到阈值会自动暂停数分钟避免触发风控——看到"程序已经暂停运行"的提示不要慌,这是设计行为。
抖音侧其余功能按同样的"入口 → 输入 → 产物"三段式工作:批量下载链接作品(手动 / 文本文档)、采集作品评论数据(作品 ID + 页数,需配合storage_format落库)、批量下载合集作品(mix_urls配置 / 当前账号收藏合集列表 / 手动 / 文档)、采集账号详细数据、采集搜索结果数据(综合 / 视频 / 用户 / 直播四类)、采集热榜数据(无需输入)。TikTok 侧对应支持账号作品(accounts_urls_tiktok)、链接作品、合辑作品(mix_urls_tiktok)和拉流地址获取。
还有一个提效参数:run_command配置项可以写入"启动即执行的菜单指令序列",跳过层层点击直达目标任务,适合固定流程的批量作业。
场景二:刷到什么存什么
选后台监听模式后程序常驻剪贴板轮询:复制任何抖音 / TikTok 作品链接,程序自动识别并下载。适合个人日常使用,不需要再记菜单。
场景三:只采数据不下载文件
如果你的目标是评论库、搜索词库或热榜快照而不是视频文件,把storage_format设为sqlite或csv,download设为false,然后用采集作品评论数据、采集搜索结果数据、采集抖音热榜数据等入口即可,产物直接进你配置的持久化后端。
从本地脚本到长期服务
启动 Web API 并拿到文档
选Web API 模式后,FastAPI 服务监听0.0.0.0:5555(主机与端口常量见 src/custom/static.py,服务实现见 src/application/main_server.py)。访问http://127.0.0.1:5555/docs或/redoc可以看到自动生成的 OpenAPI 文档:
端点覆盖账号、作品、评论、回复、合集、直播、搜索、短链解析、全局配置等(请求 / 响应模型定义在 src/models/)。一个评论采集端点的调用示例(与 README 官方示例一致):
from httpx import post from rich import print def demo(): headers = {"token": ""} data = { "detail_id": "0123456789", "pages": 2, } api = "http://127.0.0.1:5555/douyin/comment" response = post(api, json=data, headers=headers) print(response.json()) demo()把令牌鉴权加上再谈公网
所有业务端点都经过token_dependency校验请求头里的token,不通过直接返回 HTTP 403;/token端点用于验证令牌是否有效。项目默认不校验(src/custom/function.py 中的is_valid_token()当前直接return True),也就是说本地跑没有任何门槛,但一旦把服务暴露到公网,务必先到is_valid_token()里配好自己的令牌逻辑,否则任何路过的人都能消耗你的 Cookie 和带宽。
用 Docker 部署成容器
仓库自带 Dockerfile:builder 阶段用python:3.12-bullseye装编译依赖,最终镜像用python:3.12-slim只保留运行时;EXPOSE 5555,VOLUME /app/Volume挂载数据卷,CMD ["python", "main.py"]启动。
docker pull joeanamier/tiktok-downloader # 或者用仓库 Dockerfile 本地构建镜像 docker run --name douk -p 5555:5555 -v tiktok_downloader_volume:/app/Volume -it joeanamier/tiktok-downloader docker start -i douk # 后续启动 docker restart -i douk # 重启-v把下载产物持久化到命名卷,-p把 API 端口映射到宿主机。容器化部署有两条注意事项:容器访问不到宿主机文件系统,依赖本地环境的函数(比如已弃用的"从浏览器读取 Cookie")在容器内不可用,Cookie 统一用手动输入 / 剪贴板方式写入;SERVER_HOST默认就是0.0.0.0,容器映射端口后记得把令牌鉴权配置好。
高频问题速查与日常维护
高频问题速查(点击展开)
Q:下载的视频清晰度不够?A:优先换已登录账号的 Cookie;确认max_size没设得太小;检查是否频繁撞上智能延时导致重试失败。
Q:改完 settings.json 没反应?A:必须重启程序。日志里出现"参数已回退 / 缺少参数"类提示,说明该字段值非法,程序已经悄悄用了默认值。
Q:喜欢 / 收藏作品任务跑得太久?A:接口只返回作品发布日期而非操作日期,程序必须全量拉取后再筛日期。用max_pages给请求次数封顶。
Q:为什么触发不了 Fork 仓库里的 Actions 工作流?A:Actions 权限没开——Settings -> Actions -> General 里把 Actions permissions 改为 Allow all actions and reusable workflows。
多实例与更新:程序没针对多开优化,需要并行两套任务就复制整个项目文件夹再分别配置。更新可执行文件版本时,把旧版_internal\Volume复制到新版_internal(保留配置与下载记录),或停掉程序后整目录覆盖。
构建可执行文件:项目内置 GitHub Actions 自动构建工作流,路径是 Fork 仓库 → 启用 Actions → 在 Actions 页手动触发「构建可执行文件」工作流(选master或develop分支)→ 到运行记录的 Artifacts 里下载产物。注意 GitHub 对普通用户每月提供约 2000 分钟免费额度,Fork 仓库要定期与上游同步才能拿到修复。
合规与免责:项目基于 GNU GPLv3.0 开源,README 末尾的免责声明立场很明确——使用者自行评估并承担使用风险,不得用于未经授权下载、传播受版权保护内容,数据处理需自行遵守目标平台条款与当地法规,作者不提供任何付费版本或商业服务。把工具接进团队工作流之前,先完整读一遍 README.md 的免责声明章节。
DouK-Downloader 用一套代码同时扮演了两个角色:个人终端里最省心的批量下载器,以及加上 Docker、Web API 和令牌之后可被其他系统调用的采集服务。它的前提条件也很清楚——加密参数需要自备、Web UI 尚在重构、Cookie 是必须持续维护的前置条件。把这些前提消化掉之后,从uv run main.py到生产 API 的整条路径都是文档里写明的、可以直接复制的路径。
本文基于该仓库公开内容整理,功能边界以官方 README 为准。
【免费下载链接】TikTokDownloader抖音 / TikTok 平台作品下载/数据采集工具项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考