
最近研究了一个很有意思的开源项目 DY_video_downloader(GitHub 284 Star),专门用于抖音视频下载。代码结构清晰,技术方案值得学习。今天从技术和使用两个角度来深度剖析这个项目。
📋 项目概览
| 项目 | 详情 |
|---|---|
| GitHub | anYuJia/DY_video_downloader |
| Stars | 284 |
| 语言 | Python + TypeScript |
| 协议 | MIT |
| 平台 | Windows / macOS / Linux |
| 版本 | Python 版 + Rust/Tauri 重构版 |
🏗️ 技术架构
项目采用 Python 后端 + React 前端 的混合架构,打包为桌面应用。
整体架构
DY_video_downloader/
├── main.py # 入口:启动Flask服务 + pywebview桌面窗口
├── src/
│ ├── api/
│ │ ├── api.py # 抖音API封装(核心)
│ │ ├── sign.py # a_bogus签名算法(SM3哈希)
│ │ └── native_cookie_login.py # 浏览器Cookie读取
│ ├── downloader/
│ │ └── downloader.py # 下载器(多线程、断点续传)
│ ├── web/
│ │ └── web_app.py # Flask Web服务 + SocketIO
│ ├── config/
│ │ └── config.py # 配置管理
│ └── user/
│ └── user_manager.py # 用户管理
├── frontend/ # React前端
└── lib/js/ # 前端工具库
核心技术栈
- 🐍 Python 3.10+——后端主语言
- 🌶️ Flask + Flask-SocketIO——Web 服务和实时通信
- 🖥️ pywebview——桌面窗口(替代 Electron,更轻量)
- ⚡ gevent——异步 WebSocket 支持
- 🔐 browser-cookie3——读取浏览器 Cookie
- 📝 React + TypeScript——前端界面
- 🔏 PyNaCl——更新包签名校验
🔑 核心原理:如何绕过抖音风控
这个项目最有技术含量的部分就是如何模拟浏览器请求,绕过抖音的反爬机制。
1. a_bogus 签名算法
抖音接口请求必须携带 a_bogus 签名参数,否则直接返回 403。这个签名基于 SM3 国密哈希算法,对查询参数和 User-Agent 进行签名。
项目中的 sign.py 是纯 Python 实现的 SM3 签名,核心流程:
# 签名流程(简化版)
def sign_detail(query_string, user_agent):
# 1. 拼接参数
data = query_string + user_agent
# 2. SM3 哈希(国密算法)
hash_bytes = sm3_hash(data.encode())
# 3. 查表编码为 a_bogus
a_bogus = encode_to_abogus(hash_bytes)
return a_bogus
这个签名算法是从 Rust 版逆向移植过来的,纯 Python 实现避免了依赖原生库。
2. Cookie 管理
Cookie 是请求抖音接口的关键凭证,项目支持三种获取方式:
- 🌐 内置登录——弹出原生窗口,用户在应用内登录抖音
- 🍪 浏览器读取——通过
browser-cookie3直接读取 Chrome/Firefox 的 Cookie - 📋 手动粘贴——从浏览器开发者工具复制 Cookie
3. 请求参数伪装
项目精心构造了完整的浏览器指纹参数:
# 通用请求参数(模拟 Chrome 145 on macOS)
common_params = {
'device_platform': 'webapp',
'aid': '6383',
'channel': 'channel_pc_web',
'version_code': '190600',
'version_name': '19.6.0',
'screen_width': '1680',
'screen_height': '1050',
'browser_name': 'Edge',
'browser_version': '145.0.0.0',
'os_name': 'Mac OS',
'os_version': '10.15.7',
# ... 共 20+ 个参数
}
# 请求头也完全模拟浏览器
headers = {
"User-Agent": "Mozilla/5.0 ... Chrome/145.0.0.0 ...",
"sec-fetch-site": "same-origin",
"sec-ch-ua": '"Not:A-Brand";v="99", "Microsoft Edge";v="145"',
# ...
}
4. 风控检测与处理
项目实现了完善的风控检测机制:
- 检测 HTTP 401/403 和重定向到验证页
- 检测响应内容是否为 HTML(验证码页面)
- 检测 API 返回的
status_code和错误信息 - 自动识别"用户未登录"、"访问频繁"等错误
- 触发验证时自动打开浏览器让用户完成滑块验证
📡 抖音 API 接口分析
项目对接了抖音的多个 Web 接口:
| 接口 | 功能 | 方法 |
|---|---|---|
/aweme/v1/web/aweme/detail/ | 视频详情(无水印URL) | GET |
/aweme/v1/web/aweme/post/ | 用户作品列表 | GET |
/aweme/v1/web/aweme/favorite/ | 用户收藏列表 | GET |
/aweme/v1/web/like/list/ | 用户点赞列表 | GET |
/aweme/v1/web/module/feed/ | 推荐视频流 | POST |
/aweme/v1/web/general/search/ | 搜索用户/视频 | GET |
/aweme/v1/web/user/profile/self/ | 当前用户信息 | GET |
/aweme/v1/web/comment/list/ | 评论列表 | GET |
⬇️ 下载器设计
多线程并发下载
# 下载器核心设计
class DouyinDownloader:
def __init__(self, api, socketio=None):
self.api = api
self._record_lock = threading.RLock() # 线程安全锁
self._download_record_cache = {} # 下载记录缓存
# 每个线程独立的 requests.Session
# 避免并发时连接状态互相污染
_thread_local = threading.local()
文件命名模板
支持自定义文件名模板:
# 默认模板: {title}_{aweme_id}
# 可用变量:
# {title} - 视频标题
# {aweme_id} - 视频ID
# {author} - 作者昵称
# {date} - 日期 (YYYYMMDD)
# {time} - 时间 (HHMMSS)
# {media_type} - 媒体类型
# 示例: "我的视频_71234567890"
# 文件夹模板: {author}
# 自动按作者创建子文件夹
断点续传与去重
- 基于本地 SQLite 索引记录下载历史
- 自动识别已下载作品,避免重复下载
- 支持暂停/恢复/取消下载任务
- 通过 SocketIO 实时推送下载进度到前端
🚀 如何使用
方式一:下载发行版(推荐)
从 Releases 下载对应平台安装包。
方式二:源码运行
# 1. 克隆项目
git clone https://github.com/anYuJia/DY_video_downloader.git
cd DY_video_downloader
# 2. 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 构建前端
cd frontend
npm install
npm run build
cd ..
# 5. 桌面模式运行
python main.py
# 6. 或者浏览器模式运行
python -m src.web.web_app
首次使用流程
打开应用后:在设置中配置 Cookie(推荐用浏览器读取或内置登录)→ 搜索用户或粘贴链接 → 选择下载 → 在"我的下载"中管理文件。
🔧 技术亮点总结
- ✅ SM3 签名算法——纯 Python 实现抖音 a_bogus 签名,无需 JS 引擎
- ✅ 完整浏览器指纹——20+ 个请求参数 + 完整请求头,完美模拟浏览器
- ✅ 智能风控处理——自动检测验证码、登录失效、访问频繁等场景
- ✅ 多线程安全——ThreadLocal Session + RLock 保证并发安全
- ✅ 实时通信——SocketIO 推送下载进度,体验流畅
- ✅ 轻量桌面——pywebview 替代 Electron,体积更小
- ✅ 自动更新——支持签名校验的 OTA 更新
- ✅ 跨平台——Windows / macOS / Linux 全平台支持
📝 总结
DY_video_downloader 是一个技术含量很高的开源项目。虽然只有 284 Star,但代码质量不输很多几千 Star 的项目。SM3 签名算法的实现、完整的浏览器指纹模拟、智能风控检测,都值得学习借鉴。
如果你需要下载抖音视频,这个项目完全够用。如果你想学习爬虫/反爬技术,源码也非常值得一读。作者还有一个 Rust/Tauri 重构版,体积更小、启动更快,也可以关注。