一个维护了七年的抖音视频/图文采集下载工具,支持 10 种采集模式、批量下载、GUI 桌面应用,GitHub 1.6k Star。经历过易语言、requests、Playwright 浏览器自动化等多轮技术方案切换,最近靠 AI 补齐了 UI 短板。
这应该是我维护时间最长的一个开源项目了。
最早是用易语言写的,2019 年开始在吾爱破解论坛发布。2021 年用 Python 重写。
断断续续折腾了七年,v3 版本开始被人熟知,中间放弃维护了很久,直到 v5 版本再次被更多人看到——GitHub 上攒了 1.6k Star、280 Fork,基本就是这两个版本贡献的。
项目现在叫 DouyinCrawler(抖音爬虫),本质上是一个抖音公开数据的采集和下载工具。开源仓库在这:https://github.com/erma0/douyin
版本进化史
这个项目纯玩票性质,基本没什么规划,中间经历过好几次路线切换:
| 版本 | 时间 | 方案 | 切换原因 |
|---|---|---|---|
| v1 | 2019 | 易语言 | 早期纯协议 → node.dll 模拟浏览器 |
| v2 | 2021.03 | Python + Vue + Aria2 | Python 重写,那时接口简单,不需要逆向 |
| v3 | 2023.05 | Playwright 浏览器自动化 | 协议加了加密参数,搞不定,上浏览器 |
| v4 | 2024.07 | 回归 requests | 浏览器风控严重 + 协议暂时不需要加密 |
| v5 | 2024.07+ | requests + 签名 JS | 引入第三方签名 JS,主攻 UI 和体验 |
v1 & v2:易语言到 Python
2019 年用易语言写了第一版,纯协议直连,功能不太成熟,后来改成 node.dll 模拟浏览器拦截数据。2021 年用 Python 重写(Vue + pywebview + Aria2)。那时候抖音接口很简单,signature 可以固定,requests 直接请求就能拿到无水印地址。
v2 也尝试过写 Vue 界面,也尝试过低代码设计,但效果很勉强。
v2 → v3:搞不定加密,上浏览器
好景不长,抖音开始加接口签名。搞不定加密,那就让浏览器自己处理——v3 切到 Playwright,启动真实浏览器模拟操作,顺带还加了 FastAPI 接口。
v3 → v4:风控逼退,又切回来
浏览器自动化容易触发风控,动不动验证码。刚好那段时间抖音协议调整,一些接口不再需要加密参数了,于是又把 v2 翻出来修了修。
v4 → v5:协议稳定,转向 UI
后来从另一个开源仓库引入了签名逻辑,填补了需要签名接口的缺口。核心逆向 JS 不是我写的,我只是引用。目前本项目有 3 个接口需要签名:单个作品详情、音乐原声、粉丝列表,其余都是普通请求。
这个项目其实没有技术含量,毕竟没做过逆向,只是在持续维护和工程化。
v5 今年:AI 写 GUI
功能层面 v5 已经比较稳定了,但一直缺一个好用的图形界面。这部分我自己写不好——之前试过 Vue,效果勉强。今年开始让 AI 写,效果远超预期。
它能做什么?
简单说就是:粘贴一个抖音链接,把视频/图文全部拉下来。
采集模式
支持 10 种采集类型:
| 模式 | 说明 |
|---|---|
| 单个作品 | 视频/图文分享链接直接下载 |
| 用户主页 | 批量采集用户发布的作品 |
| 用户喜欢 | 用户点赞的作品(需对方开放) |
| 用户收藏 | 用户收藏的作品(需对方开放) |
| 话题挑战 | 话题/挑战下的作品 |
| 合集 | 合集内所有作品 |
| 音乐原声 | 使用该音乐的作品 |
| 关键词搜索 | 支持排序、时间筛选 |
| 关注列表 | 目标用户关注的用户(仅 CLI) |
| 粉丝列表 | 目标用户的粉丝(仅 CLI) |
下载能力
集成 Aria2 批量下载,支持并发控制、重试机制、自定义文件名模板,可选同时下载标题文本和封面图。
三种运行模式
| 模式 | 适用场景 |
|---|---|
| GUI 桌面应用 | Windows 直接下载 exe,完整图形界面 |
| Web 服务 | 可 Docker 部署,浏览器访问,全平台可用 |
| CLI 命令行 | 服务器/脚本/自动化,支持批量链接 |
界面:从勉强到能用
同类抖音下载工具大多是纯 CLI 命令行,少数有带 GUI 的。
这个项目今年用 AI 重写后,整个 UI 完全达到了可用程度:
架构:Python + FastAPI 做后端,React 18 + TypeScript + Vite 做前端,PyWebView 嵌入 WebView2 做桌面壳。前后端通过 RESTful API + SSE 实时推送通信。
交互:采集进度不再靠看日志,而是通过 SSE 实时推送——服务端每拿到一批新作品,前端立即更新卡片网格。列表用 react-window 虚拟滚动渲染,几千条结果不卡。点开作品卡片是内嵌视频播放器,下载完直接播。
体验细节:首次使用有欢迎向导引导配置 Cookie;搜索支持排序和时长筛选;下载进度面板实时显示 Aria2 状态;托盘通知、错误边界、暗色模式(通过 Tailwind 支持)这些细节虽然不算什么亮点,但堆在一起让工具「能用起来舒服了一些」。
这些功能在真正的专业前端眼里可能不值一提,但对我这个不懂前端的人来说,已经足够强大了。
技术实现
整体架构如下:
graph LR
U([用户]) --> GUI[桌面 GUI<br/>PyWebView + WebView2]
U --> WEB[浏览器<br/>任意设备]
U --> CLI[命令行<br/>服务器/脚本]
GUI --> FE[前端 React 18 + TypeScript]
WEB --> FE
FE -->|REST API| BE[后端 FastAPI]
FE -->|SSE 实时推送| BE
BE --> CRAWL[爬虫核心 crawler.py]
CRAWL -->|HTTP + Cookie + 签名| DY([抖音 API])
BE --> ARIA2[Aria2 下载器]
ARIA2 -->|JSON-RPC| VIDEO[视频文件]
BE --> CK[Cookie 管理]
CK -->|sessionid / ttwid| DY
采集流程
爬虫核心是个分页循环:通过 max_cursor 游标逐页请求,每页返回一批作品 + 下一页 cursor + has_more 标志,直到 has_more=false 或达到数量上限。
用户主页支持增量采集:首次保存结果 JSON,下次只拉上次 cursor 之后的作品。其余 9 种采集类型逻辑类似,差异主要在请求的 API 端点和参数。
请求层
抖音网页接口通过 HTTP API 返回 JSON。大部分接口带上 Cookie(核心是 sessionid 和 ttwid)就能直接请求,少数几个接口需要额外签名——这部分引用自其他开源项目的 JS 文件,Python 通过 exejs 调用 Node.js 运行时执行。
Cookie 的获取一直没优化好。经历过手动复制 → 自动读取浏览器 → 内置登录窗口三个阶段,目前最推荐手动获取(F12 复制),GUI 模式下也支持内置浏览器登录自动抓取,但效果好像不太行。
部署与构建
GUI 版通过 PyInstaller 打包成单个 exe,配合 GitHub Actions 自动构建发布到 Releases。打包过程中踩过 UPX 压缩导致 DLL 加载失败、strip 优化兼容问题等坑,后来都禁掉了。Nuitka 其实也能打包,本地验证过,只是 CI 里为了省时间没上。
以后还会做自动化方案吗?
可能会。协议方案目前够用,但浏览器自动化的优势是不依赖接口变更和 Cookie 时效。之前 v3 失败在风控,这几年反检测技术在进步,如果 camoufox / ruyipage / CloakBrowser / Obscura 等反检测方案能稳定绕过,可能会再试一版。
下载与运行
- GitHub Releases:https://github.com/erma0/douyin/releases(更新及时)
- 网盘:https://www.lanzoub.com/b00jfit1i
Windows 用户
下载 DouyinCrawler.exe,解压即用。需安装 WebView2 运行时(Win10/11 自带,Win7 可手动安装)。
命令行爱好者
# 采集用户主页前 20 个作品
python -m backend.cli -u https://www.douyin.com/user/xxx -l 20
# 搜索并筛选
python -m backend.cli -u "风景" -t search --sort-type 2 --publish-time 7
# 批量链接
python -m backend.cli -u urls.txt -l 50
最后
这个项目没什么高深技术——逆向是别人做的,协议是 HTTP 请求,UI界面是 AI 写的。
v5 的 UI 确实好用了不少,如果你也有一段想加界面但写不出来的老项目,试试让 AI 来写。
开源不易,如果觉得有用欢迎到 GitHub 点个 Star。有问题可以提 Issue,功能建议也欢迎交流。提的需求一般会及时跟进。