AI prompts
base on 抖音批量下载工具,去水印,支持视频、图集、合集、音乐(原声)。免费!免费!免费! # 抖音下载器 - 无水印批量下载工具

一个功能强大的抖音内容批量下载工具,支持视频、图集、音乐、直播等多种内容类型的下载。提供两个版本:V1.0(稳定版)和 V2.0(增强版)。
## 📋 目录
- [快速开始](#-快速开始)
- [版本说明](#-版本说明)
- [V1.0 使用指南](#-v10-使用指南)
- [V2.0 使用指南](#-v20-使用指南)
- [Cookie 配置工具](#-cookie-配置工具)
- [支持的链接类型](#-支持的链接类型)
- [常见问题](#-常见问题)
- [更新日志](#-更新日志)
## ⚡ 快速开始
### 环境要求
- **Python 3.9+**
- **操作系统**:Windows、macOS、Linux
### 安装步骤
1. **克隆项目**
```bash
git clone https://github.com/jiji262/douyin-downloader.git
cd douyin-downloader
```
2. **安装依赖**
```bash
pip install -r requirements.txt
```
3. **配置 Cookie**(首次使用需要)
```bash
# 方式1:自动获取(推荐)
python cookie_extractor.py
# 方式2:手动获取
python get_cookies_manual.py
```
## 📦 版本说明
### V1.0 (DouYinCommand.py) - 稳定版
- ✅ **经过验证**:稳定可靠,经过大量测试
- ✅ **简单易用**:配置文件驱动,使用简单
- ✅ **功能完整**:支持所有内容类型下载
- ✅ **单个视频下载**:完全正常工作
- ⚠️ **需要手动配置**:需要手动获取和配置 Cookie
### V2.0 (downloader.py) - 增强版
- 🚀 **自动 Cookie 管理**:支持自动获取和刷新 Cookie
- 🚀 **统一入口**:整合所有功能到单一脚本
- 🚀 **异步架构**:性能更优,支持并发下载
- 🚀 **智能重试**:自动重试和错误恢复
- 🚀 **增量下载**:支持增量更新,避免重复下载
- ⚠️ **单个视频下载**:目前 API 返回空响应(已知问题)
- ✅ **用户主页下载**:完全正常工作
## 🎯 V1.0 使用指南
### 配置文件设置
1. **编辑配置文件**
```bash
cp config.example.yml config.yml
# 编辑 config.yml 文件
```
2. **配置示例**
```yaml
# 下载链接
link:
- https://v.douyin.com/xxxxx/ # 单个视频
- https://www.douyin.com/user/xxxxx # 用户主页
- https://www.douyin.com/collection/xxxxx # 合集
# 保存路径
path: ./Downloaded/
# Cookie配置(必填)
cookies:
msToken: YOUR_MS_TOKEN_HERE
ttwid: YOUR_TTWID_HERE
odin_tt: YOUR_ODIN_TT_HERE
passport_csrf_token: YOUR_PASSPORT_CSRF_TOKEN_HERE
sid_guard: YOUR_SID_GUARD_HERE
# 下载选项
music: True # 下载音乐
cover: True # 下载封面
avatar: True # 下载头像
json: True # 保存JSON数据
# 下载模式
mode:
- post # 下载发布的作品
# - like # 下载喜欢的作品
# - mix # 下载合集
# 下载数量(0表示全部)
number:
post: 0 # 发布作品数量
like: 0 # 喜欢作品数量
allmix: 0 # 合集数量
mix: 0 # 单个合集内作品数量
# 其他设置
thread: 5 # 下载线程数
database: True # 使用数据库记录
```
### 运行程序
```bash
# 使用配置文件运行
python DouYinCommand.py
# 或者使用命令行参数
python DouYinCommand.py --cmd False
```
### 使用示例
```bash
# 下载单个视频
# 在 config.yml 中设置 link 为单个视频链接
python DouYinCommand.py
# 下载用户主页
# 在 config.yml 中设置 link 为用户主页链接
python DouYinCommand.py
# 下载合集
# 在 config.yml 中设置 link 为合集链接
python DouYinCommand.py
```
## 🚀 V2.0 使用指南
### 命令行使用
```bash
# 下载单个视频(需要先配置 Cookie)
python downloader.py -u "https://v.douyin.com/xxxxx/"
# 下载用户主页(推荐)
python downloader.py -u "https://www.douyin.com/user/xxxxx"
# 自动获取 Cookie 并下载
python downloader.py --auto-cookie -u "https://www.douyin.com/user/xxxxx"
# 指定保存路径
python downloader.py -u "链接" --path "./my_videos/"
# 使用配置文件
python downloader.py --config
```
### 配置文件使用
1. **创建配置文件**
```bash
cp config.example.yml config_simple.yml
```
2. **配置示例**
```yaml
# 下载链接
link:
- https://www.douyin.com/user/xxxxx
# 保存路径
path: ./Downloaded/
# 自动 Cookie 管理
auto_cookie: true
# 下载选项
music: true
cover: true
avatar: true
json: true
# 下载模式
mode:
- post
# 下载数量
number:
post: 10
# 增量下载
increase:
post: false
# 数据库
database: true
```
3. **运行程序**
```bash
python downloader.py --config
```
### 命令行参数
```bash
python downloader.py [选项] [链接...]
选项:
-u, --url URL 下载链接
-p, --path PATH 保存路径
-c, --config 使用配置文件
--auto-cookie 自动获取 Cookie
--cookies COOKIES 手动指定 Cookie
-h, --help 显示帮助信息
```
## 🍪 Cookie 配置工具
### 1. cookie_extractor.py - 自动获取工具
**功能**:使用 Playwright 自动打开浏览器,自动获取 Cookie
**使用方式**:
```bash
# 安装 Playwright
pip install playwright
playwright install chromium
# 运行自动获取
python cookie_extractor.py
```
**特点**:
- ✅ 自动打开浏览器
- ✅ 支持扫码登录
- ✅ 自动检测登录状态
- ✅ 自动保存到配置文件
- ✅ 支持多种登录方式
**使用步骤**:
1. 运行 `python cookie_extractor.py`
2. 选择提取方式(推荐选择1)
3. 在打开的浏览器中完成登录
4. 程序自动提取并保存 Cookie
### 2. get_cookies_manual.py - 手动获取工具
**功能**:通过浏览器开发者工具手动获取 Cookie
**使用方式**:
```bash
python get_cookies_manual.py
```
**特点**:
- ✅ 无需安装 Playwright
- ✅ 详细的操作教程
- ✅ 支持 Cookie 验证
- ✅ 自动保存到配置文件
- ✅ 支持备份和恢复
**使用步骤**:
1. 运行 `python get_cookies_manual.py`
2. 选择"获取新的Cookie"
3. 按照教程在浏览器中获取 Cookie
4. 粘贴 Cookie 内容
5. 程序自动解析并保存
### Cookie 获取教程
#### 方法一:浏览器开发者工具
1. 打开浏览器,访问 [抖音网页版](https://www.douyin.com)
2. 登录你的抖音账号
3. 按 `F12` 打开开发者工具
4. 切换到 `Network` 标签页
5. 刷新页面,找到任意请求
6. 在请求头中找到 `Cookie` 字段
7. 复制以下关键 cookie 值:
- `msToken`
- `ttwid`
- `odin_tt`
- `passport_csrf_token`
- `sid_guard`
#### 方法二:使用自动工具
```bash
# 推荐使用自动工具
python cookie_extractor.py
```
## 📋 支持的链接类型
### 🎬 视频内容
- **单个视频分享链接**:`https://v.douyin.com/xxxxx/`
- **单个视频直链**:`https://www.douyin.com/video/xxxxx`
- **图集作品**:`https://www.douyin.com/note/xxxxx`
### 👤 用户内容
- **用户主页**:`https://www.douyin.com/user/xxxxx`
- 支持下载用户发布的所有作品
- 支持下载用户喜欢的作品(需要权限)
### 📚 合集内容
- **用户合集**:`https://www.douyin.com/collection/xxxxx`
- **音乐合集**:`https://www.douyin.com/music/xxxxx`
### 🔴 直播内容
- **直播间**:`https://live.douyin.com/xxxxx`
## 🔧 常见问题
### Q: 为什么单个视频下载失败?
**A**:
- V1.0:请检查 Cookie 是否有效,确保包含必要的字段
- V2.0:目前已知问题,API 返回空响应,建议使用用户主页下载
### Q: Cookie 过期怎么办?
**A**:
- 使用 `python cookie_extractor.py` 重新获取
- 或使用 `python get_cookies_manual.py` 手动获取
### Q: 下载速度慢怎么办?
**A**:
- 调整 `thread` 参数增加并发数
- 检查网络连接
- 避免同时下载过多内容
### Q: 如何批量下载?
**A**:
- V1.0:在 `config.yml` 中添加多个链接
- V2.0:使用命令行传入多个链接或使用配置文件
### Q: 支持哪些格式?
**A**:
- 视频:MP4 格式(无水印)
- 图片:JPG 格式
- 音频:MP3 格式
- 数据:JSON 格式
## 📝 更新日志
### V2.0 (2025-08)
- ✅ **统一入口**:整合所有功能到 `downloader.py`
- ✅ **自动 Cookie 管理**:支持自动获取和刷新
- ✅ **异步架构**:性能优化,支持并发下载
- ✅ **智能重试**:自动重试和错误恢复
- ✅ **增量下载**:支持增量更新
- ✅ **用户主页下载**:完全正常工作
- ⚠️ **单个视频下载**:API 返回空响应(已知问题)
### V1.0 (2024-12)
- ✅ **稳定可靠**:经过大量测试验证
- ✅ **功能完整**:支持所有内容类型
- ✅ **单个视频下载**:完全正常工作
- ✅ **配置文件驱动**:简单易用
- ✅ **数据库支持**:记录下载历史
## ⚖️ 法律声明
- 本项目仅供**学习交流**使用
- 请遵守相关法律法规和平台服务条款
- 不得用于商业用途或侵犯他人权益
- 下载内容请尊重原作者版权
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
### 报告问题
- 使用 [Issues](https://github.com/jiji262/douyin-downloader/issues) 报告 bug
- 请提供详细的错误信息和复现步骤
### 功能建议
- 在 Issues 中提出新功能建议
- 详细描述功能需求和使用场景
## 📄 许可证
本项目采用 [MIT License](LICENSE) 开源许可证。
---
<div align="center">
**如果这个项目对你有帮助,请给个 ⭐ Star 支持一下!**
[🐛 报告问题](https://github.com/jiji262/douyin-downloader/issues) • [💡 功能建议](https://github.com/jiji262/douyin-downloader/issues) • [📖 查看文档](https://github.com/jiji262/douyin-downloader/wiki)
Made with ❤️ by [jiji262](https://github.com/jiji262)
</div>
", Assign "at most 3 tags" to the expected json: {"id":"13156","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"