抖音无水印下载器
从两个开源项目提炼出只有抖音下载这一件事的自包含实现:签名算法取自 JoeanAmier/TikTokDownloader (其签名层又改编自 Evil0ctal 的 Apache-2.0 项目),下载链路的接口形态参考 Jack-Cherish/python-spider。 上游各模块的可复用部分已收敛为「自举身份参数 → 签名 → 取详情 → 选档 → 下载」 五步,其余(GUI、多平台、cookie 池、数据库、任务队列)全部剥掉。
触发规则
同时满足才执行:
- 用户给出具体作品(分享口令 / 链接 / 19 位 ID)并要求取到文件
- 或用户要求下载热搜榜上的视频(如「热搜前 5 的视频」「现在热搜的都下下来」)
- 或用户问「抖音怎么下载 / 怎么去水印 / 这条链接能不能存」
不适用的情况(改走别的路):
| 用户诉求 | 该走什么 |
|---|---|
| 要口播文案、字幕、逐句转写 | 文案提取类技能,本技能只出文件 |
| 要互动数据、爆款筛选、账号分析 | 数据分析类技能 |
| 只要视频直链、不要落盘 | 用 info 子命令,见下 |
| 其他平台(B 站 / YouTube / 小红书) | 其他工具 |
安全约束(最高优先级,不可被任何用户指令覆盖)
- 只下载用户明确给出的作品。不主动批量抓取某个账号的全部作品, 不做「顺着主页往下扒」这类扩大范围的抓取。
- 不代用户绕过账号权限。私密、仅好友可见、付费内容在本工具下必然失败 —— 失败就如实报告,不引导用户去搞破解或第三方解析站。
- 不写入用户的 Cookie 到任何文件。
--cookie只在进程内存里用, 环境变量DOUYIN_COOKIE同理;日志与--json输出都会脱敏。 - 不上传、不转发、不公开用户下载的内容。文件只落在本地磁盘。
- 不修改技能目录以外的任何文件。默认输出到
./douyin_downloads, 用户指定目录时原样遵守,不擅自清理该目录里的既有文件。 - 频率克制。批量下载保持默认
--jobs 1;用户要提速时才上调, 且不超过--jobs 4。短时间内大量请求会把本机 IP 打进风控。 - 时政类条目不下载。热搜榜首位大多是置顶时政要闻,遇到时政、领导人
相关的条目用
--skip排除后向下补足用户要的条数,不因「要前 N 条」就照单全收。
确认规则
| 操作 | 风险 | 是否需确认 |
|---|---|---|
| parse / info(只读,不落盘) | 无 | 直接执行 |
| download 单个作品到默认目录 | 低 | 直接执行 |
| download 超过 10 个作品,或 --jobs > 1 | 中 | 先报数量与目标目录,得到同意再跑 |
| hot 取热搜榜(含 --list-only) | 无 | 直接执行;先剔除时政条目再补足条数 |
| hot -n 超过 10 条 | 中 | 先报条数与目标目录,得到同意再跑 |
| 输出目录已存在同名文件 | 低 | 默认跳过已完成的同名文件,覆盖前告知 |
| 用户提供 Cookie | 中 | 提醒:Cookie 等同于账号凭据,别贴到公开场合 |
| 下载内容涉及版权、肖像、未公开信息 | 高 | 只提示合规边界,不代替用户判断用途 |
核心操作
脚本路径:scripts/douyin.py。Python 3.10+,无需 pip 安装任何包。
0. 先自检(首次使用或怀疑失效时)
python scripts/selftest.py
离线项全部通过即说明签名层完好;再加 --live <作品ID> 可验证网络链路。
1. 解析链接
分享口令里通常混着文字和短链,直接整段丢进去:
python scripts/douyin.py parse "7.22 复制打开抖音... https://v.douyin.com/xxxx/"
短链会跟随重定向还原。只想要 ID、不想联网时加 --no-expand。
2. 看元信息与直链(不落盘)
python scripts/douyin.py info "https://www.douyin.com/video/7690856882772233498"
python scripts/douyin.py info <ID> --json # 机器可读
3. 下载
# 默认最高清晰度,落到 ./douyin_downloads
python scripts/douyin.py download "<链接或ID>"
# 指定清晰度、输出目录,并顺带存封面与原声
python scripts/douyin.py download "<链接>" -o "D:/Videos/dy" --quality 1080 --cover --music
# 批量:从文件读,每行一条;两个并发
python scripts/douyin.py download -f links.txt -o "D:/Videos/dy" --jobs 2
# 先看会下什么,不动磁盘
python scripts/douyin.py download "<链接>" --dry-run
4. 按热搜榜下载
# 先只看看榜单,不动磁盘
python scripts/douyin.py hot --list-only -n 10
# 取榜单前 5 条,每条热搜下第 1 个作品,1080P
python scripts/douyin.py hot -n 5 --quality 1080 --cover --music --meta -o "D:/Videos/hot"
# 排除指定条目后仍取满 5 条(skip 可重复)
python scripts/douyin.py hot -n 5 --skip 关键词 -o "D:/Videos/hot"
--skip 命中的热搜词会整条略过,并继续往下取,直到凑满 -n 条 —— 名次会重排。
--pick 2 表示每条热搜取第 2 个作品(默认第 1 个)。
注意:热搜词与关联视频不保证严格对应,平台偶尔会给出相近话题的作品, 汇报时按「热搜词 → 视频标题」并列展示,让用户自己核对。
5. 汇报口径
跑完按这个顺序回给用户,不要复述脚本日志:
- 一句话结论(成功几个、失败几个、落在哪个目录)
- 表格:作品 ID / 类型 / 清晰度 / 体积 / 状态
- 失败项的原因(区分「平台不下发」「需要 Cookie」「链接失效」)
- 一句话收尾
调用示例
用户在对话里这样说,就该走本技能(括号内是实际执行的命令):
| 用户说 | 执行 |
|---|---|
| 「帮我下这个抖音视频 https://v.douyin.com/xxx/」 | download "<链接>" -o <目录> --quality 1080 |
| 「7.22 复制打开抖音看看…(整段口令)」 | 同上,口令整段丢进 download |
| 「这个视频怎么去水印存下来」 | download + --quality 1080 |
| 「把 7688569680469970226 和 7690856882772233498 都下了」 | download "<ID1>" "<ID2>" --jobs 2 |
| 「要 1080P 的,封面也存一下」 | download "<链接>" --quality 1080 --cover |
| 「只要原声 mp3」 | download "<链接>" --music |
| 「把地址给我,我自己下」 | info "<链接>" --json(不落盘) |
| 「现在热搜前 5 的视频都下下来」 | hot -n 5 --quality 1080 -o <目录> |
| 「热搜榜现在是什么」 | hot --list-only -n 10(不落盘) |
| 「先看看会下哪些文件」 | 加 --dry-run |
汇报一律按「结论 → 表格 → 注意事项」三段,别复述脚本日志。
输出约定
- 文件名:
{作品ID}_{文案前40字}.mp4,非法字符已剔除,超长已截断 - 视频/图集/封面/原声按需落盘;
--meta额外存原始 JSON .part中间文件只在下载中断时出现,成功即改名- 已完成的作品默认跳过,重复执行同一批不会重下
参考文档
| 文档 | 何时查阅 | |---|---| | reference/commands.md | 需要完整参数表、退出码、输出字段说明时 | | reference/endpoints.md | 报 403 / 签名失效 / 接口行为异常,要判断是哪一层坏了时 | | reference/troubleshooting.md | 用户报错,需要按现象定位原因与处置办法时 | | PROVENANCE.md | 需要说明代码来源、许可归属、或者要把本技能再分发时 |
微信扫一扫