douyin-video-download
抖音无水印视频下载助手,高效批量下载,支持自动迭代重试。
核心能力
- 解析抖音分享链接获取无水印视频直链
- 四路 API 自动切换(apibyte.cn → xinyew.cn → douyin.wtf → tikwm)
- apibyte.cn 优先返回 1080p 无水印原始源(aweme.snssdk.com)
- 支持单条下载和批量文件导入
- 并发下载控制(默认 3 并发,可配置)
- 自动重试(默认 3 次,指数退避)
- 失败队列记录,支持断点续传迭代
- 输出文件自动命名:
[作者昵称]__[视频标题]__[视频ID].mp4 - 视频信息记录:
downloaded_list.json(避免重复下载) - 视频互动数据:点赞/评论/收藏/分享数(apibyte.cn 源)
- Windows GBK 终端兼容(自动替换 Unicode 符号)
工作流程
Step 1:解析用户输入
用户可能提供以下格式之一:
| 类型 | 示例 |
|------|------|
| 分享短链 | https://v.douyin.com/abc123 |
| 分享长链 | https://www.douyin.com/video/7321456890123456789 |
| 纯数字ID | 7321456890123456789 |
| 批量文件 | 包含多行的文本文件,每行一个链接或ID |
识别方式:
- 以
http开头 → 直接使用 - 纯数字(13~20位)→ 拼接为
https://www.douyin.com/video/<id> - 文件路径(
.txt)→ 读取所有行作为批量任务
Step 2:提取无水印直链
API 优先级(自动切换):
| 优先级 | API | 请求格式 | 画质 |
|--------|-----|----------|------|
| 最高 | apibyte.cn | GET /marketplace/douyinparse?url=<链接> | 1080p/720p/play_url 三选一 |
| 备用1 | api.xinyew.cn | GET /api/douyinjx?url=<链接> | 无水印直链 |
| 备用2 | api.douyin.wtf | GET /api/hybrid/video_data?url=<链接>&minimal=false | 原始嵌套数据 |
| 备用3 | tikwm.com | GET /api/?url=<链接>&hd=1 | hdplay/play |
请求头:User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)
apibyte.cn 可选配置 API Key(环境变量 APIBYTE_API_KEY),不配也能用(限额低)。
apibyte.cn 响应格式:
{
"code": 200,
"msg": "success",
"data": {
"type": "video",
"video_id": "7321456890123456789",
"title": "视频标题",
"author": {"nickname": "作者"},
"video_1080p": "https://aweme.snssdk.com/...1080p.mp4",
"video_720p": "https://aweme.snssdk.com/...720p.mp4",
"play_url": "https://aweme.snssdk.com/...play.mp4",
"publish_time": "2026-04-13 12:00:00",
"likes": 10817, "comments": 48, "collects": 2986, "shares": 1964
}
}
选择逻辑:video_1080p → video_720p → play_url
Step 3:下载视频
使用 Python requests 流式下载,带进度显示和重试。
Step 4:批量迭代流程
- 读取任务列表(
parse_tasks()解析文件或字符串) - 使用 asyncio + Semaphore 并发下载(
run_batch_async()) - 成功记录写入
downloaded_list.json(video_id → filepath 映射) - 失败记录追加到
failed_tasks.jsonl - 迭代重试:最多
max_iterations轮,每轮间隔递增 - 可通过
--retry-failed从失败队列恢复
Step 5:输出报告
汇总信息:
- 成功数 / 失败数 / 跳过数
- 保存路径和耗时
- 摘要写入
download_summary.json
脚本使用
单条下载
python scripts/download.py "https://v.douyin.com/abc123" -o ./videos
python scripts/download.py "7321456890123456789" -o ./videos
批量下载
python scripts/batch_download.py urls.txt -o ./videos --concurrency 5 --max-iterations 3
从失败队列重试
python scripts/batch_download.py --retry-failed -o ./videos
清理过期失败记录
python scripts/batch_download.py --clear-old-failed 30
参数说明
| 参数 | 说明 | 默认值 |
|------|------|--------|
| -o, --output | 输出目录 | ./douyin_downloads/<日期>/ |
| -c, --concurrency | 并发数 | 3 |
| --max-retries | 单条最大重试 | 3 |
| --max-iterations | 批量最大迭代轮次 | 5 |
| --retry-failed | 读取 failed_tasks.jsonl 重试 | false |
| --force | 强制重新下载(忽略已有) | false |
| --delay | 请求间隔(秒) | 1 |
| --clear-old-failed N | 清理 N 天前的失败记录 | - |
实现说明
- 从 download.py 导入安全打印函数
safe_print()替代直接print(),避免 Windows GBK 终端 Unicode 编码崩溃 download.py接收文件路径参数时自动导入batch_download.download_batch执行批量- 所有脚本头行添加
# -*- coding: utf-8 -*-确保编码声明 - 使用
requests做同步流式下载,aiohttp做异步 API 请求
注意事项
- 遵守抖音平台服务条款,仅用于个人学习用途
- 并发过高可能被限流,适当增加
--delay - 视频链接有时效性,若失效需重新解析
- apibyte.cn 无 API Key 也能用(限额低),配置
APIBYTE_API_KEY环境变量可提高额度 - API 服务为第三方接口,不保证 100% 可用,备用 API 已内置自动切换
- 定期清理
failed_tasks.jsonl(30 天前的记录) - 视频源差异:
aweme.snssdk.com(无水印原始源)优于zjcdn.com(可能带水印),优先走 apibyte.cn
Scan to join WeChat group