下载抖音视频的最高可用清晰度版本,自动尝试无水印源,并将原始抖音链接写入文件元数据的 comment 字段,方便后续快速回溯源头。
核心原理:利用 iesdouyin.com 分享页的 SSR 渲染特性,从 HTML 中提取嵌入的视频数据(window._ROUTER_DATA),无需浏览器 cookies 或 TikHub API Token。
/usr/local/bin/ffmpeg(用于元数据写入和音视频合并)/usr/bin/python3从用户输入中提取视频的 aweme_id(19位数字ID)。支持以下输入格式:
| 输入格式 | 示例 | 提取方式 |
|---|---|---|
| --------- | ------ | --------- |
| 短链接 | https://v.douyin.com/Jt5SfKMp5GE/ | 发送 HTTP 请求跟踪 302 重定向,从最终 URL 提取 |
| 标准链接 | https://www.douyin.com/video/7392175895160573218 | 正则匹配 /video/(\d{16,}) |
| modal_id 参数 | https://www.douyin.com/jingxuan?modal_id=7392175895160573218 | 正则匹配 modal_id=: |
| 纯数字ID | 7392175895160573218 | 直接使用 |
请求 iesdouyin 分享页(无需 cookies):
GET https://www.iesdouyin.com/share/video/{aweme_id}/
User-Agent: 移动端 Safari UA
从返回 HTML 中解析 window._ROUTER_DATA JSON 对象。关键数据路径:
_ROUTER_DATA.loaderData["video_(id)/page"].videoInfoRes.item_list[0]
从中提取:
desc)author.nickname)video.play_addr.url_list)video.play_addr.uri,用于构建自定义 URL)video.bit_rate[])video.download_addr.url_list)按以下优先级选择视频 URL:
video_id + 遍历所有 ratio 参数,选文件最大的https://aweme.snssdk.com/aweme/v1/play/?video_id={video_id}&ratio={ratio}&line=0default > 1080p > 720p > 540p > 480pratio=default 通常返回最高码率 HEVC 编码版本,比 1080p 更大playwm 替换为 play选择方式:对所有候选 URL 发送 HEAD 请求,比较 Content-Length,选最大的。
使用 Python requests 流式下载,支持进度显示。请求头需包含:
User-Agent: 桌面端 Chrome UA
Referer: https://www.douyin.com/
使用 ffmpeg 将原始抖音链接写入 MP4 文件的 comment 元数据字段:
ffmpeg -y -i input.mp4 -c copy -metadata "comment=原始抖音链接URL" output.mp4
此操作为无损复制(-c copy),不重新编码,瞬间完成。
验证元数据:
ffmpeg -i output.mp4 -f ffmetadata -
# 输出中应包含: comment=https://v.douyin.com/XXXX/
skill 包含完整的下载脚本 scripts/douyin_download.py,可直接运行:
# 基本用法
/usr/bin/python3 scripts/douyin_download.py "https://v.douyin.com/Jt5SfKMp5GE/" --output-dir /Users/dingo/Desktop/12
# 使用 aweme_id
/usr/bin/python3 scripts/douyin_download.py "7392175895160573218" --output-dir ~/Downloads
脚本路径:scripts/douyin_download.py(相对于 skill 目录)
脚本自动完成上述全部5个步骤:解析 ID → 获取数据 → 选择最佳源 → 下载 → 写入元数据。
对于多个链接,逐个调用脚本即可:
for url in "https://v.douyin.com/xxx/" "https://v.douyin.com/yyy/"; do
/usr/bin/python3 scripts/douyin_download.py "$url" --output-dir /目标目录
done
部分抖音视频(尤其是某些 ratio 参数)可能只包含视频轨道而无音频。脚本内置的多清晰度测试机制会自动选择包含音视频的版本(通常 ratio=default 包含完整音视频)。
如果确实遇到音视频分离的情况,处理方式:
ffmpeg -y -i video.mp4 -i audio.mp4 -c:v copy -c:a aac -metadata "comment=原始链接" output.mp4
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ------ | ------ | --------- |
| 无法提取 aweme_id | 短链接已过期或格式不对 | 让用户在抖音APP中重新分享获取新链接 |
| iesdouyin 返回空数据 | 视频已删除/私密/封禁 | 在浏览器中打开分享页确认视频状态 |
| 下载文件很小(<100KB) | URL 可能已过期 | 重新获取视频数据 |
| ffmpeg 报错 | ffmpeg 未安装或路径不对 | 确认 /usr/local/bin/ffmpeg 存在 |
| 视频无声音 | 选择了只含视频的 ratio | 脚本会自动测试选择最佳版本 |
| yt-dlp 失败 | 需要 cookies | 不使用 yt-dlp,使用本工具的 iesdouyin 方案 |
ratio=default 通常返回 HEVC(H.265) 编码的最高码率版本,文件较大但画质最好共 1 个版本