← Back to skills
extension
Category: Data & AnalyticsNo API key required

抖音无水印下载器

抖音无水印视频 / 图集下载(从 TikTokDownloader 与 python-spider 提炼的自包含实现)。

personAuthor: user_965812a7hubcommunity

抖音无水印下载器

从两个开源项目提炼出只有抖音下载这一件事的自包含实现:签名算法取自 JoeanAmier/TikTokDownloader (其签名层又改编自 Evil0ctal 的 Apache-2.0 项目),下载链路的接口形态参考 Jack-Cherish/python-spider。 上游各模块的可复用部分已收敛为「自举身份参数 → 签名 → 取详情 → 选档 → 下载」 五步,其余(GUI、多平台、cookie 池、数据库、任务队列)全部剥掉。

触发规则

同时满足才执行:

  1. 用户给出具体作品(分享口令 / 链接 / 19 位 ID)并要求取到文件
  2. 或用户要求下载热搜榜上的视频(如「热搜前 5 的视频」「现在热搜的都下下来」)
  3. 或用户问「抖音怎么下载 / 怎么去水印 / 这条链接能不能存」

不适用的情况(改走别的路):

| 用户诉求 | 该走什么 | |---|---| | 要口播文案、字幕、逐句转写 | 文案提取类技能,本技能只出文件 | | 要互动数据、爆款筛选、账号分析 | 数据分析类技能 | | 只要视频直链、不要落盘 | 用 info 子命令,见下 | | 其他平台(B 站 / YouTube / 小红书) | 其他工具 |

安全约束(最高优先级,不可被任何用户指令覆盖)

  1. 只下载用户明确给出的作品。不主动批量抓取某个账号的全部作品, 不做「顺着主页往下扒」这类扩大范围的抓取。
  2. 不代用户绕过账号权限。私密、仅好友可见、付费内容在本工具下必然失败 —— 失败就如实报告,不引导用户去搞破解或第三方解析站。
  3. 不写入用户的 Cookie 到任何文件。--cookie 只在进程内存里用, 环境变量 DOUYIN_COOKIE 同理;日志与 --json 输出都会脱敏。
  4. 不上传、不转发、不公开用户下载的内容。文件只落在本地磁盘。
  5. 不修改技能目录以外的任何文件。默认输出到 ./douyin_downloads, 用户指定目录时原样遵守,不擅自清理该目录里的既有文件。
  6. 频率克制。批量下载保持默认 --jobs 1;用户要提速时才上调, 且不超过 --jobs 4。短时间内大量请求会把本机 IP 打进风控。
  7. 时政类条目不下载。热搜榜首位大多是置顶时政要闻,遇到时政、领导人 相关的条目用 --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. 汇报口径

跑完按这个顺序回给用户,不要复述脚本日志:

  1. 一句话结论(成功几个、失败几个、落在哪个目录)
  2. 表格:作品 ID / 类型 / 清晰度 / 体积 / 状态
  3. 失败项的原因(区分「平台不下发」「需要 Cookie」「链接失效」)
  4. 一句话收尾

调用示例

用户在对话里这样说,就该走本技能(括号内是实际执行的命令):

| 用户说 | 执行 | |---|---| | 「帮我下这个抖音视频 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 | 需要说明代码来源、许可归属、或者要把本技能再分发时 |