Skip to content
项目

Evil0ctal/Douyin_TikTok_Download_API

在 GitHub 查看

Evil0ctal/Douyin_TikTok_Download_API has 21,375 GitHub stars and 2,964 forks. GitHot measured +20 stars in 24 hours and +157 in 7 days. Last checked 2026-11-13 05:39 UTC. Last push 2026-11-02.

这些数字如何统计

🚀 自托管的抖音、TikTok 和 B 站数据采集与无水印视频下载 API,支持 AI 智能体通过 MCP 调用、离线语音转文字,并可使用 Docker 一键部署。提供异步 REST API、面向 AI 智能体的 MCP 服务器、CLI 和 Web 控制台,还支持对下载的视频进行离线语音转文字。内置自愈身份池和 PostgreSQL 归档,并可通过一次 docker compose up 命令完成部署。

可以做什么

  • One post (video or image album) - ✅ - ✅ - ✅
  • Author profile - ✅ - ✅ - ✅
  • An author's posts - ✅ - ✅ - ✅
  • An author's liked posts - ✅ - ✅ - ❌

实测星标增长

24小时
+20
7天
+157
15天
正在收集历史
1个月
正在收集历史

各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。

README.zh-CN.md

原文
Douyin_TikTok_Download_API

Douyin_TikTok_Download_API

English | 简体中文

🚀 自部署的抖音 / TikTok / B 站(哔哩哔哩)数据接口服务。一条 docker compose up,自动维护身份池,对外提供 REST API、MCP 与 Web 控制台。

开源、免费、跑在你自己的机器上 —— 不用注册、没有配额、链路上没有第三方。它能取作品、作者和评论,音乐、话题、直播间、热榜和搜索结果,下载视频和图集时拿到的是无水印的流(它挑的是平台本来就提供的那条干净流,而不是「去掉」了什么),采集到的内容存在你自己的 PostgreSQL 里。下载下来的视频可以在同一台机器上离线转成文字,AI agent 也能通过 MCP 直接调用这一切。

GitHub license Release Version GitHub Star GitHub forks GitHub issues
CI CodeQL Last commit
Website Live demo Python MCP Docker Pulls Docker Image Size

💖 赞助商

这些赞助商已付费放置在这里,Douyin_TikTok_Download_API 项目将永远免费且开源。如果您希望成为该项目的赞助商,请查看我的 GitHub 赞助商页面。

TikHub.io - 全球社交媒体数据与 API 市场

TikHub.io

你的一站式社交媒体数据与 API 市场

为抖音、小红书、TikTok、Instagram、YouTube、Twitter 等平台提供专业数据方案。
实时数据 · 灵活接口 · 无缝集成 · 有竞争力的价格与折扣

在 TikHub.io 市场买卖定制 API、服务与社交媒体解决方案,
加入一个由开发者、企业与内容创作者组成的活跃生态。

多家全球领先的红人营销与社交媒体情报平台正在使用

→ 前往 TikHub.io  ·  API 文档

🧩 REER —— 逆向工程交流论坛

一个放东西的地方。这个项目之所以存在,是因为有人把「某个签名是怎么构造出来的」写了下来; 论坛是为了下一轮这种事 —— 签名、协议、加壳,凡是被拆开过的都算。

免费、无广告,除了显而易见的那几条之外基本没有条款限制。中英双语,注册即可发布,不设门槛。

🎬 长这样

DTK 控制台:总览、身份池、调度器、调试台、资料库、下载、接口文档与 MCP

一次真实的调用:粘链接、发请求、拿到归一化后的结果,途中经过的身份池、调度器和接口文档都在同一个控制台里。 界面跟着浏览器语言走,中英文都是手写的,不是机翻。English UI

不用装任何东西就能试

https://demo.douyin.wtf 是一个对所有人开放的在线实例。登录进去即可 —— 登录页会替你 填好演示账号 —— 然后随便用:调试台、调度器、资料库、接口文档。同一个账号还带一把 API Key,可以直接调爬虫接口,在 API Key 页面上是明文显示的。

它是只读的。演示请求不写入请求日志和归档库,所以一个公开实例的数据库不会被陌生人撑爆; 关掉演示模式,所有演示会话立即失效,那把 Key 也立刻作废。

限流:每 10 秒 30 次请求。 超了会进入 10 秒冷却,期间你的任何请求都会被拒绝。 这是一台共用的实例,它背后的身份池是所有人同时使用时的上限。

演示站的用途是帮你判断要不要自己部署一套。它不是一个可以拿来对接的服务 —— 它可能挂、 可能被重置、也可能被关掉,而且不会提前通知。

🚀 v4 与 v5

v5 是一次重写,从空分支起步,没有继承 v4 的任何代码。

v4 最大的问题从来不是功能少,而是接口会悄悄死掉,而你不知道。Cookie 过期、签名算法变更、 某个接口被风控,通常都要等到有人来提 issue 才发现。v5 把"看得见"和"能自愈"排在功能前面。

v4 v5
身份从哪来 从浏览器里抠 Cookie,粘进 config.yaml 无头浏览器自动铸造游客身份,可用数不够时自己补
请求怎么发 有请求就发出去 健康度分层、量化 LRU 轮换、每身份独占锁、每(身份,接口)令牌桶、接口级熔断
出了问题 等别人报错 每次请求一条结构化记录,身份和接口都有实时健康度,控制台上看得见
调用方式 同步,发出去等着 默认异步(202 + task_id),加 ?wait= 就退回同步
数据留存 解析完即弃 PostgreSQL + Redis;解析过的内容自动归档,平台删了这里还在
访问控制 没有,谁都能调 API Key + 作用域 + 角色,控制台里管
界面 PyWebIO 单页 React 控制台:身份池、调度器、资料库、下载、日志、诊断
接入方式 REST REST + MCP + CLI,共用同一个 service 层
签名 X-Bogus、A_Bogus a_bogus、X-Bogus、X-Gnarly、X-Dynosaur 和 B 站的 WBI,纯 Python 实现,另有浏览器兜底
部署 pip install -r requirements.txt + python start.py docker compose up,三个镜像
平台 抖音、TikTok、哔哩哔哩 抖音、TikTok、B 站

B 站曾经是 5.0 唯一退步的一项,因为它和抖音 / TikTok 不共用签名和身份体系。5.1.6 把它加了回来,也补上了它自己需要的两样东西:纯 Python 的 WBI 签名,以及通过普通 HTTP 铸造的游客身份——所以 B 站的身份池不需要浏览器容器。

还在用 v4?

v4 的代码保留在 v4 分支, 镜像也还在推,一条命令就能起:

docker run -d --name dtk-v4 --restart unless-stopped \
  -p 8080:80 evil0ctal/douyin_tiktok_download_api:V4.1.2

然后打开 http://localhost:8080,接口文档在 /docs。端口特意错开成 8080,v5 占的是 8000,两个版本可以在同一台机器上一起跑。

用之前先把抖音 cookie 换掉。 v4 没有身份池,镜像里那份 cookie 是打包时带的,早就 过期了,不换的话抖音那边一律返回 400:

docker cp dtk-v4:/app/crawlers/douyin/web/config.yaml ./douyin-web.yaml
# 把文件里的 Cookie 换成浏览器里的,保存
docker rm -f dtk-v4
docker run -d --name dtk-v4 --restart unless-stopped -p 8080:80 \
  -v "$PWD/douyin-web.yaml:/app/crawlers/douyin/web/config.yaml" \
  evil0ctal/douyin_tiktok_download_api:V4.1.2

TikTok 的两份配置在 /app/crawlers/tiktok/web/config.yaml 和 /app/crawlers/tiktok/app/config.yaml,要改的话一样挂进去。

想用 compose 管着,写一个文件就够 —— 前提是 douyin-web.yaml 已经按上面拷到同级目录, 不然 docker 会按这个名字建一个目录,程序读配置直接起不来:

# compose.yml
services:
  app:
    image: evil0ctal/douyin_tiktok_download_api:V4.1.2
    container_name: dtk-v4
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./douyin-web.yaml:/app/crawlers/douyin/web/config.yaml
docker rm -f dtk-v4   # 上面 docker run 起的那个占着同一个名字
docker compose -p dtk-v4 up -d

main 现在是 v5,latest 指向最新的 v5 发布版——它只在发版时移动,推送到 main 不会动它—— 所以想留在 v4 就固定 tag,别用 latest。 V4.1.2 是 v4 最后一个发布版;之后 v4 分支又合了几个 PR(B 站下载、cookie 热更新), 那份代码对应的镜像 tag 是 commit sha 5be4838。

v4 没有一键脚本,下面「快速开始」里那个装的是 v5。v4 就上面这些:分支还收 PR,但不会 再往上加东西了,新装的话直接上 v5。

一起写点什么

有几个开源项目的交流群,想一起做这个项目、或者只是想聊聊技术的, 都可以加微信 Evil0ctal,备注 github 交流,我拉你进群。

群里可以互相交流学习,不允许发广告以及违法的东西,纯粹交朋友和技术交流。

📦 它能取什么

能力 抖音 TikTok B 站
单条作品详情(视频 / 图集) ✅ ✅ ✅
作者资料 ✅ ✅ ✅
作者作品列表 ✅ ✅ ✅
作者喜欢列表 ✅ ✅ ❌
合集 / 播放列表 / B 站合集,以及作者的合集列表 ✅ ✅ ✅
评论 ✅ ✅ ✅
评论回复 ✅ ✅ ✅
公开收藏夹及其内容 ❌ ✅ ✅
多 P 视频的分 P 列表 — — ✅
站点热门榜:综合热门、每周必看、入站必刷、排行榜 Top 100 ❌ ❌ ✅
粉丝列表 ❌ ✅ ❌
关注列表 ❌ ✅ ❌
作品的相关推荐 ✅ ✅ ✅
音乐详情,以及使用它的作品 ✅ ✅ —
话题详情 ✅ ✅ —
话题下的作品 ❌ ✅ —
关键词搜索:作品与账号 ❌ ✅ ✅
直播间:是否在播,以及拉流地址 ✅ ✅ ✅
按一场直播自己的 ID 查直播间,以及抖音 App 分享链接 ✅ ✅ —
一次查询多个直播间是否在播 ✅ ✅ ❌
直播间观众榜 ✅ ❌ ❌
热榜 ✅ ❌ ✅

抖音的粉丝和关注列表只对已登录会话开放,游客身份拿不到,所以这两个接口干脆没注册: 注册一个永远返回空页的接口没意义。搜索和话题下的作品也是一样:抖音对游客两者都拒绝, 已登录时的答复还没有实测过,所以抖音上这两样暂未提供。TikTok 的账号搜索游客也能用,作品搜索则直接 拒绝游客(2026-11-02 实测),要靠导入的登录身份。导入你自己的登录 Cookie 之后,其余接口能看到的内容也会更多。 这一点在 B 站的评论上最明显:游客只能看到最热的三条,导入登录身份之后才能看到完整评论。 抖音的作者喜欢列表则完全取决于它:不管公开与否,游客一条都看不到,所以这个列表需要池子里有登录身份。 导入的登录身份,后果和风险由你自行承担:各平台一般不会因为读取数据而封号,但不排除封号的可能 (导入之前要知道的事)。

短横线不是缺功能:抖音和 TikTok 的一个作品永远只有一个视频,没有分 P 可列;B 站的直播间始终只有一个编号,不会每场直播换一个 ID。

媒体下载、内容归档、计数快照、合集、定时监控都是内置的,不需要额外服务。

🤖 让 AI agent 来用:MCP

把 Claude Code、Claude Desktop、Codex CLI、Cherry Studio 或任何 MCP 客户端指向你自己实例上的 /mcp,agent 就能读取作品、作者和评论,把作品的媒体存下来,再把视频转成文字。它和 REST API 走同一个 service 层、同一个身份池和调度器,能做什么由 API Key 的权限范围决定。

claude mcp add --transport http dtk http://127.0.0.1:8000/mcp/ \
  --header "Authorization: Bearer dtk_YOUR_API_KEY"
工具 做什么
parse_url 取一个链接指向的东西——作品、作者、短链、整段分享文案都行
get_video · get_user 按 ID 取一个作品或一个作者主页
list_user_posts · list_comments 作者的作品、作品的评论,按页取
get_content_history 作品或作者在本地数据库里记录下来的计数历史
pool_status 身份池和各接口的健康状况,让 agent 分得清"稍后再试"和"坏了"
download_media 把作品的媒体存到本实例
transcribe_video 把已存的视频转成文字
get_task_result 取回一次调用里没来得及完成的结果

十个工具,刻意不多:每多一个工具,agent 选对工具的能力就会变差,所以新能力是作为已有工具的参数 加进来的。各个客户端怎么配、每个工具返回什么,见 MCP 与 AI agent。 控制台里的 /mcp-guide 是同一份指南。

🎙 语音转文字,在你自己的机器上

下载下来的视频可以就地转成文字。FunASR 模型——Paraformer 识别语音、FSMN-VAD 找出哪里有人在 说话、CT-Transformer 补标点——运行在一个没有任何网络出口的边车里,音频不会离开这台主机,也不调用 任何外部接口。

  • 在哪用: 控制台的 视频转写 页面、每个已完成下载上的 转写视频 按钮、 资料库(单个已存作品,或一次转写选中的一批)、POST /api/v1/transcriptions, 或者 MCP 工具 transcribe_video
  • 得到什么: 每个视频一整段文字,数字写成阿拉伯数字,可以导出 .txt
  • 多快: 一段 3 分 13 秒的视频,两个 CPU 核用了 3.7 秒;不需要 GPU
  • 擅长什么: 普通话。模型是通用中文模型,其他语言效果差

默认关闭。一键安装脚本会询问,然后下载约 500 MB 的模型,并逐个文件校验 SHA-256;手动安装见 准备 FunASR ONNX 模型和 把已存的视频转成文字。

🔗 它认得哪些链接

粘贴什么都行——分享短链、作品页地址,或者 App 复制出来的一整段带文案的口令:

https://v.douyin.com/L4NpDJ6/
https://www.douyin.com/video/7126745726494821640
https://www.douyin.com/jingxuan?modal_id=7660875690212492466
https://www.tiktok.com/@evil0ctal/video/7156033831819037994
https://www.tiktok.com/t/ZTR9nkkmL/
2.84 nqe:/ 骑白马的也可以是公主%%百万转场变身 https://v.douyin.com/L4FJNR3/ 复制此链接,打开Dou音搜索
https://www.bilibili.com/video/BV1xx411c7mD
https://www.bilibili.com/video/av170001
https://b23.tv/<code>
https://space.bilibili.com/2

短链会自动跟随展开,文案里的链接会被提取出来。作品 ID 还会先按平台自己的编码规则校验一遍, 一个不可能存在的 ID 在这里就被拒掉,不会浪费一次上游请求。B 站的 av 号会换算成对应的 BV 号, 两种写法拿到的是同一个作品。

⚗️ 技术栈

服务端 Python 3.12 · FastAPI · SQLAlchemy 2.0(async)· Alembic · Typer · structlog
传输 wreq(浏览器 TLS 指纹模拟)· httpx
数据 PostgreSQL + TimescaleDB · Redis
控制台 React 19 · TypeScript · Vite · TanStack Query · wouter · i18next
签名 a_bogus / X-Bogus / X-Gnarly / X-Dynosaur / WBI,纯 Python 实现
身份铸造 CloakBrowser 无头浏览器,单独一个容器,通过 HTTP 调用;B 站游客身份直接走 HTTP,不需要浏览器
下载器 Go 1.23,只用标准库,静态编译进 scratch 镜像
转写 FunASR ONNX(Paraformer、FSMN-VAD、CT-Transformer),离线,跑在没有网络出口的容器里
鉴权 argon2id 口令哈希 · API Key + 作用域
对外协议 REST(OpenAPI)· MCP(streamable-http)· CLI
工程 uv · ruff · mypy · pytest · Docker Compose

除了 Postgres 和 Redis,不需要任何其它基础设施——没有 Kafka、没有 Elasticsearch、 没有对象存储、没有 k8s。

CloakBrowser 的版本 pin 在一个指定的 commit 上。这是一项安全控制,见 docker/Dockerfile.browser。

🗂 项目结构

先说一句 dtk 是什么。 仓库全称 Douyin_TikTok_Download_API 念起来太长,所以代码里一律用 DTK:Douyin + TiKTok,只取那两个平台,下载器和 API 那两截没进来。B 站是后来加的,名字没改。

它是 Python 包名(src/dtk/)、命令行(dtk --help)、每个环境变量的前缀(DTK_SECRET_KEY 这些)、 compose 的项目名(-p dtk),也是控制台标题栏里那三个字母。看到 dtk,说的就是 Douyin_TikTok_Download_API。

Douyin_TikTok_Download_API/
├── src/dtk/                服务端,代码全在这
│   ├── api/                FastAPI 路由、鉴权、OpenAPI 本地化
│   ├── platforms/          抖音 / TikTok / B 站适配器:接口定义、参数、解析
│   ├── signing/            a_bogus / X-Bogus / X-Gnarly / X-Dynosaur / WBI
│   ├── transport/          出站请求、响应分类(正常 / 业务错误 / 风控 / 网络)
│   ├── identity/           身份铸造与健康度
│   ├── scheduler/          身份选取、令牌桶、熔断器
│   ├── services/           业务层,REST、MCP、CLI 共用
│   ├── worker/             异步任务、回调、定时收集
│   ├── db/                 SQLAlchemy 模型与 Alembic 迁移
│   ├── ops/                诊断、备份、健康检查、告警通知
│   ├── media/              下载器客户端
│   ├── models/             跨平台统一的内容模型
│   ├── urls/               链接识别、短链展开、ID 校验
│   ├── mcp/                MCP server
│   ├── cli/                dtk 命令行
│   ├── i18n/               服务端中英文案
│   └── core/               配置、日志、错误类型
├── web/                    React 控制台,构建产物打进应用镜像
│   └── src/
│       ├── pages/          每个控制台页面一个文件
│       ├── components/     设计系统与共用组件
│       └── locales/        控制台中英文案
├── docker/                 四个 Dockerfile、compose 与三个 sidecar
│   ├── browser_rpc/        Python,包装 CloakBrowser
│   ├── downloader/         Go,媒体下载 sidecar
│   ├── transcriber/        Python,离线 FunASR 转写
│   └── compose.yml
├── documents/              用户文档,中英各 18 篇
├── tests/                  unit / integration / contract / replay
├── scripts/                smoke.sh
├── .github/workflows/      CI 与 Docker 镜像发布
├── alembic.ini
├── pyproject.toml
└── Makefile

⚡️ 快速开始:用 Docker 自部署

怕麻烦就用一键脚本,它会问你几个问题然后把整套跑起来 —— 会自己识别发行版、 检测有没有 Docker、按机器大小调好资源上限:

curl -fsSL https://raw.githubusercontent.com/Evil0ctal/Douyin_TikTok_Download_API/main/install/install.zh.sh -o install.zh.sh
less install.zh.sh    # 先读一遍再跑,这是个好习惯
bash install.zh.sh

装完之后,这个脚本就是运维工具。 再跑一次它会发现已有安装,打开菜单:看状态、升级(和 GitHub 最新 Release 比版本)、改口令、加管理员、备份恢复、改运行时设置、清磁盘、停止或卸载。--manage 直达菜单。

细节见 install/README.md。下面是手动的做法。

装法有两种,下面走的是推荐的那种。手动装依赖的路子见 不用 Docker。

装法 适合谁 详细步骤
Docker Compose(推荐) 绝大多数人,生产也包括在内 安装与部署 · 首次安装
手动装依赖 不能用 Docker,或者你要改代码 开发方式 · 裸机生产部署

在中国大陆的机器上装? 先换源再动手,不然多半卡在拉镜像那一步: 中国大陆的网络准备。

需要 Docker 和 Docker Compose。先把仓库拉下来——compose 文件、Dockerfile 和迁移脚本都在里面, 默认分支就是 v5:

git clone https://github.com/Evil0ctal/Douyin_TikTok_Download_API.git
cd Douyin_TikTok_Download_API

仓库里不带任何默认密码或密钥,接着生成 .env:

POSTGRES_PASSWORD=$(openssl rand -hex 24)
REDIS_PASSWORD=$(openssl rand -hex 24)
cat > .env <<EOF
DTK_SECRET_KEY=$(openssl rand -base64 48)
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
REDIS_PASSWORD=${REDIS_PASSWORD}
DTK_DATABASE_URL=postgresql+asyncpg://dtk:${POSTGRES_PASSWORD}@postgres:5432/dtk
DTK_REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
EOF
docker compose -p dtk -f docker/compose.yml up -d
docker compose -p dtk -f docker/compose.yml logs api   # 打印首次初始化令牌

打开 http://127.0.0.1:8000,用日志里的令牌创建第一个管理员账号。

这样起来的栈不带浏览器容器。没有它(--profile browser,见 可选 profile),抖音和 TikTok 的身份只能导入、 不能铸造:这两个平台是在页面脚本里把 Cookie 发给访客的。B 站游客走普通 HTTP 铸造,有没有它都行。

镜像从哪来

默认是本地构建:up 第一次会用仓库里的 Dockerfile 把应用镜像编出来,几分钟。 如果你不想在自己机器上编译,在同一个 .env 里把 compose 指向已发布的镜像即可:

cat >> .env <<'EOF'
DTK_IMAGE=evil0ctal/douyin_tiktok_download_api
DTK_IMAGE_TAG=latest
EOF
export COMPOSE_ENV_FILES=.env
docker compose -p dtk -f docker/compose.yml pull
docker compose -p dtk -f docker/compose.yml up -d

这两个变量是 compose 自己读的,不是容器读的,而 compose 默认去 docker/.env 里找, 除非 COMPOSE_ENV_FILES 另有所指。少了那行 export,它什么也找不到,退回本地镜像名, 又悄悄从源码编了一遍——所以每个要敲 compose 的 shell 里都得有它。脚本生成的 dtkctl 替你带着。

latest 就是最新的 Release,只在发版时才会变,所以以后更新不用改这里的任何东西。 pull 这一步不能省:compose 里这些服务同时写了 image 和 build,本机没有这个镜像时 它会自己去编,而不是去拉。

镜像同时提供 linux/amd64 与 linux/arm64,所以 Apple Silicon 和树莓派上都是原生运行。 浏览器容器不发布——它会从一个指定的 commit 安装 CloakBrowser,那个 pin 是安全控制, 应当由你自己决定,所以它一直是本地构建。

不用 Docker

也支持,而且这就是这个项目本身的开发方式。你要自己准备 PostgreSQL 17(必须带 TimescaleDB 扩展, 普通 postgres:17 不行)、Redis 8、Python 3.12 和 uv;要构建控制台还需要 Node 22。两份步骤:

容器本来替你做的那些事——非 root 用户、内存和 CPU 上限、只读根文件系统、进程守护——裸机上都得自己补回来, 那一节把它们逐条列了出来。

还想知道什么

想做的事 去哪看
改容器规格、算机器要多大 三档配置 · 怎么改这些上限
开浏览器容器、下载器或转写 sidecar 可选 profile
挂 TLS、放到反向代理后面 放在反向代理后面
环境变量到底怎么读的 环境变量
装完确认它真的好了 验证安装
compose 文件本身逐行解释 docker/README.md

🖥 用它做什么:控制台、REST API、MCP 和 CLI

入口 地址 说明
Web 控制台 / 身份池、调度器、资料库、下载、转写、日志、诊断
接口文档 /docs 控制台内的 Swagger UI,中英双语
裸接口文档 /swagger、/redoc 无需登录
REST API /api/v1/... 128 个操作
MCP /mcp 与 REST 共用同一个 service 层,配置方法见控制台 /mcp-guide
CLI dtk --help 同上

主要能力:

  • 解析:链接、分享文案、短链、作品 ID 都吃
  • 归档:解析过的内容自动入库,平台删了这里还在
  • 下载:媒体存到自己磁盘,支持按作者批量、跳过已下载、去重
  • 转写:把已存的视频离线转成文字
  • 关注列表:定期重新收集某个作者或作品
  • iOS 快捷指令:/api/v1/ios/shortcut

🔄 更新到新版本

控制台会替你留意:system.check_updates 默认开着,登录后如果有新版本会弹一次, 每 24 小时最多一次。那个请求是你的浏览器发给 GitHub 的,服务器不会往外发任何东西 ——所以它不会告诉任何人你这台实例存在。气人的话在设置里关掉。

用脚本装的,在安装目录里一条命令:

cd /opt/dtk           # 或 ~/dtk —— 你装在哪就是哪
./dtkctl upgrade      # 升到最新的 Release;./dtkctl upgrade 5.1.6 升到指定版本

它会把代码切到那个 Release 的 tag、拉新镜像(源码构建的安装则是重新构建)、重建浏览器镜像、 做一份备份、跑迁移,这些都过了才把升到的版本号写进 .env 并重启。重启之前任何一步失败,代码和 .env 都会放回原样,旧版本照样在跑。不需要手动改任何东西。5.1.6 之前装的实例还没有 upgrade,那就在同一个目录里先跑一次 git pull && bash install/install.zh.sh --upgrade, 之后就都是 ./dtkctl upgrade 了。运行 bash install.zh.sh --manage 选 2,效果一样。

手工版是这样:

cd /opt/dtk && git pull
export COMPOSE_ENV_FILES=.env

# 用已发布镜像的(推荐)。写上你在跑的服务:开了下载器和转写的,
# 加上 downloader 和 transcriber,--profile 参数也和启动时一样。
docker compose -p dtk -f docker/compose.yml pull api worker
docker compose -p dtk -f docker/compose.yml build browser-rpc   # 只在开了 --profile browser 时
docker compose -p dtk -f docker/compose.yml run --rm migrate
docker compose -p dtk -f docker/compose.yml up -d

DTK_IMAGE_TAG=latest 的话不用先改任何东西。钉了版本号或 sha- 构建的,这就是钉住的 代价:拉之前先在 .env 里把它改掉——脚本替你做的正是这一步。脚本装的代码停在 Release 的 tag 上,那里的 git pull 没有分支可拉:改用 git fetch origin tag v5.1.7 && git checkout --detach v5.1.7。 自己构建的话把 pull 换成 build。migrate 每次启动都会跑,Alembic 是幂等的,所以单独跑那一步只是想在切换容器 之前先把库升上去。

你的数据不会动。 命名卷(postgres-data、redis-data、media-data)不随容器 重建而消失,身份池、归档、设置和 API Key 都在原地。

浏览器镜像从这份代码构建、从不拉取,所以每次更新都要重建:tag 不变的话——latest, 或者本地构建的 dev——跑着的还是旧代码。有缓存,很快。

想回退,用脚本装的就 ./dtkctl upgrade 5.1.5,手工的就把 DTK_IMAGE_TAG 改回上一个 版本号或 sha- 再 up -d。迁移不提供自动降级,所以缺了数据库最新那次迁移的 Release,脚本在拉任何东西 之前就会拒绝;越过了那样一次迁移,回去的路是新装一份旧版本,再把在它上面做的备份恢复进去。升级前备份 数据库——脚本会替你做——这是唯一稳妥的回退路径。

📖 文档

在线阅读:douyin.wtf —— 同样的 18 篇,渲染好、可搜索、中英双语。 markdown 源文件在 documents/,站点就是拿它构建的, 所以两边永远不会对不上。

新手从这里开始: 快速开始 · 核心概念 · 控制台总览

部署与运维: 安装与部署 · 配置参考 · 运维 · 故障排查 · 安全

开发对接: REST API 指南 · MCP 与 AI 客户端 · 命令行参考 · 参与开发

接口参考手册不在文档里,而是由代码直接生成的:你自己的实例在 /docs(控制台内) 以及 /swagger、/redoc、/openapi.json(无需登录)提供,中英双语。

English documentation: documents/README.md

用 LLM 读这个项目? llms.txt 把整套文档整理成了一份带注解的索引, 格式是 llmstxt.org 约定的那种。

📮 联系方式

问题反馈 GitHub Issues —— 公开、有记录,遇到过同样问题的人也能回答你
邮箱 [email protected] —— 直达作者本人,适合不方便公开的内容
作者 @Evil0ctal

提问之前请先看故障排查,并附上自检页面或 dtk diagnose 的输出。它能回答维护者原本要反过来问你的大部分问题。

⭐️ Star 历史

起始于 2021/11/06 · GitHub @Evil0ctal

📄 许可协议

Apache License 2.0。

你可以使用、修改、分发本项目,包括商业用途,也包括放进闭源产品。这项授权不可撤销。 作为交换,协议要求你:

  • 分发副本时保留协议全文和 NOTICE 文件(版权声明就在里面)
  • 在你改动过的文件里说明改了什么
  • 接受它不提供任何担保

作者的一个请求

这个项目是免费送出去的,它能一直免费是因为有赞助商,而不是因为向用户收费。 如果你靠它赚到了钱,请考虑也赞助一下,而不是只拿。

这是一个请求,不是协议条款——Apache 2.0 允许商业用途,上面这段话不会把这项权利收回去。

☕️ 赞赏作者

上面的赞助商付的是项目的钱;这一节是给维护它的人的,完全自愿。

网络 地址
Solana HvtkxmDERbNXfCoojpdFAYN5mSWowjpXgedsG9eF7y9z
Tron (TRC20) TQwSM2vjcnrdRU7gY7KNp2tCgMnK33azkT
Ethereum (ERC20) 0x2f210FdfD981B59eC130370E5b1Aa8A6a06fb5Ad
BNB Smart Chain (BEP20) 0x2f210FdfD981B59eC130370E5b1Aa8A6a06fb5Ad
Bitcoin bc1q785j55cxlnjqe8lkwy8cq57t8t9vn3ak9tlsfy

这些网络都支持常见的主流代币。TRC20 或 Solana 上的 USDT 最方便接收,手续费也最低。

只能按地址所属的网络转账。 转错链的资产任何人都无法找回。 以太坊和 BNB Smart Chain 共用同一个地址是正常的:两者都是 EVM 链,由同一把私钥控制。

也可以走 GitHub Sponsors。

你需要自己负责的部分

本项目从有自己服务条款的平台抓取数据,并且运行在你自己控制的机器上。 请遵守平台条款和所在地法律,尊重你所收集内容背后的人, 不要拿它去骚扰任何人,也不要拿它去二次分发不属于你的作品。这些没有别人能替你把关。

探索相关项目