DY_video_downloader——开源抖音视频下载器,技术原理深度剖析

最近研究了一个很有意思的开源项目 DY_video_downloader(GitHub 284 Star),专门用于抖音视频下载。代码结构清晰,技术方案值得学习。今天从技术和使用两个角度来深度剖析这个项目。

📋 项目概览

项目详情
GitHubanYuJia/DY_video_downloader
Stars284
语言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 重构版,体积更小、启动更快,也可以关注。

项目地址github.com/anYuJia/DY_video_downloader

上一篇 Toonflow——开源 AI 短剧工厂,动动手指小说秒变剧集!
下一篇 5款 AI Agent Dashboard 横评:从全能选手到轻量神器,你该选哪个?