首页 / 全部技能 / 内容创作 / douyin-downloader
内容创作 · freestylefly/canghe-skills

douyin-downloader

抖音无水印视频下载和文案提取工具

风险提醒:红色 · 谨慎使用AI 侦查报告
作者 freestyleflyGitHub freestylefly/canghe-skills ↗许可 MIT(仓库根 LICENSE)commit dd0bf35595
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

这是一个单文件 Node CLI,靠 exec/命令行直接调用 douyin.js,三个子命令 info/download/extract 各自完成不同任务。

skills/canghe-douyin-downloader/SKILL.md
node /root/.openclaw/workspace/skills/douyin-downloader/douyin.js info "抖音分享链接"
注:这里在做什么:SKILL.md 声明通过 OpenClaw 的 exec 工具调用;脚本自身用 process.argv 解析命令与 -o/-v/--save-video 参数。

解析分享链接:先正则抠出 URL,短链(v.douyin.com)跟重定向,再取出数字视频 ID 调抖音 web detail 接口。

skills/canghe-douyin-downloader/douyin.js
const apiUrl = `https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=${awemeId}`;
注:这里在做什么:这是技能自行实现的、未在官方 API 中公开的 web 端点调用,也是它无需 API Key 即可取视频信息的原因。

取“无水印”下载地址:优先取 play_addr 并把 URL 里的 playwm 替换为 play(去水印串替换),否则回落到 download_addr。

skills/canghe-douyin-downloader/douyin.js
const videoUrl = videoData.video?.play_addr?.url_list?.[0]?.replace('playwm', 'play') ||
注:这里在做什么:用字符串替换拿到无水印直链,这是描述中“无水印”卖点的实现手段。

请求统一伪装成 iPhone Safari:所有 http/https 请求都带固定的移动端 User-Agent 头冒充移动浏览器。

skills/canghe-douyin-downloader/douyin.js
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/121.0.2277.107 Version/17.0 Mobile/15E148 Safari/604.1'
注:这里在做什么:接口/页面抓取都靠这套 UA 冒充移动端,属客户端冒充行为。

下载视频是流式写盘:用 https/http 请求拿响应流,按 content-length 打印进度后 pipe 到本地文件,并跟随 3xx 重定向。

skills/canghe-douyin-downloader/douyin.js
const writer = fs.createWriteStream(filepath);
注:这里在做什么:downloadFile 处理重定向递归、进度输出与错误,最终落盘为 {video_id}.mp4。

提取音频用外部 ffmpeg 子进程:以 -vn + libmp3lame 把 mp4 转成 mp3,音频路径紧邻视频文件。

skills/canghe-douyin-downloader/douyin.js
const proc = spawn(ffmpegPath, args);
注:这里在做什么:runFfmpeg 封装 spawn,非 0 退出码即抛错;skill frontmatter 也声明 requires bins: [ffmpeg]。

语音转文字把音频上传到第三方“硅基流动”服务:POST multipart 到固定端点,用 Bearer 形式携带用户 API Key。

skills/canghe-douyin-downloader/douyin.js
const DEFAULT_API_BASE_URL = 'https://api.siliconflow.cn/v1/audio/transcriptions';
注:这里在做什么:这是把用户素材(音频)送往外部服务后端的路径,也是描述“提取文案(需要 API Key)”的实现。

文案落盘为 markdown,并清理中间产物:写 transcript.md(含视频ID/提取时间/下载链接与正文),未开启保存视频时删除临时 mp4 与 mp3。

skills/canghe-douyin-downloader/douyin.js
fs.writeFileSync(outputPath, markdown, 'utf-8');
注:这里在做什么:输出到 {outputDir}/{video_id}/transcript.md;清理用 fs.unlinkSync(videoPath) 与 unlinkSync(audioPath)。

API Key 从环境变量读取:DOUYIN_API_KEY 或 API_KEY,缺失时 extract 直接报错退出。

skills/canghe-douyin-downloader/douyin.js
apiKey = process.env.DOUYIN_API_KEY || process.env.API_KEY;
注:这里在做什么:为自身声明用途(语音转文字)读取用户凭证;info/download 不需要 Key。

接口取不到时回落到页面解析:抓 douyin.com 页面里的 window._ROUTER_DATA JSON 提取视频信息。

skills/canghe-douyin-downloader/douyin.js
const match = pageContent.match(/window\._ROUTER_DATA\s*=\s*(.*?)<\/script>/);
注:这里在做什么:优先走 detail 接口,失败则抓页面内嵌 JSON,这使它对接口变更更钝感。

2核心能力

01获取无水印视频信息与下载直链(info 子命令)
02下载抖音视频到本地(download 子命令)
03语音转文案(extract 子命令,需 API Key)
04音频提取(ffmpeg 转 mp3)
05媒体信息探测(ffprobe 读 duration/size)
06短链重定向解析与失败回落页面 JSON
07API Key 环境变量配置(DOUYIN_API_KEY / API_KEY)
08下载进度显示与临时文件清理

3外部依赖

类型依赖
networkwww.douyin.com(未公开的 aweme detail web 端点)
networkv.douyin.com(分享短链,先跟重定向取真实 URL)
api硅基流动 语音转写 API(上传音频,Bearer DOUYIN_API_KEY)
cliffmpeg(转音频)与 ffprobe(读媒体信息)

4风险提醒 风险提醒:红色 · 谨慎使用

风险提醒:红色 · 谨慎使用
  • 逆向/冒充的稳定性与账号合规风险 — 请求未公开端点并固定冒充 iPhone 客户端、做 playwm→play 去水印;平台改接口或风控即可能失效,去水印与抓取也可能违反平台条款。
  • 用户素材出网到第三方 — extract 会把视频音频上传到 api.siliconflow.cn;涉版权/隐私音频外发与消费额度需自担。
  • 依赖外部二进制与网络环境 — 需本机安装 ffmpeg/ffprobe;对 douyin.com 的网络可达性与限流敏感。
  • 文件名与内容来自远端数据 — 标题取自远端 desc(脚本过滤 []/:*?"<>| 等字符),markdown 正文原样写入转写结果。
  • 无锁文件/无测试,行为随平台漂移 — 单文件 489 行、无测试与锁文件,作者未提供版本约束,失效后需自行改脚本。
风险提醒:红色,谨慎使用(属能力/策略级判定,非恶意植入)。(a) 逆向/冒充:脚本自行请求抖音未公开的 web 端点 https://www.douyin.com/aweme/v1/web/aweme/detail/,所有请求固定带 iPhone Safari User-Agent 冒充移动客户端,并把 play_addr 里的 playwm 替换为 play 以取无水印直链(绕过平台水印标记)。(b) 素材出网:extract 会把用户视频提取的音频上传到第三方后端 api.siliconflow.cn(Bearer DOUYIN_API_KEY),属把用户素材送往外部服务。(c) 命令面:调用外部 ffmpeg/ffprobe 子进程。程度说明:未发现 TLS 校验降级、未发现高级反自动化伪装(无 webdriver patching/签名伪造)、无任意代码执行、无批量采集;orange 要件(读 env 凭证 + 素材出网)同时存在,但 red 轴(逆向未公开端点 + 冒充移动客户端 + 去水印替换)成立,故取更严的 red。

5第二遍独立确认

  • [ok] 调用未公开 web 端点(red 主因之一) — douyin.js 拼接 https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=… 自行实现请求,非官方开放 API。
  • [ok] 移动端 UA 冒充(red 主因之二) — HEADERS 固定 iPhone Safari UA(EdgiOS/121.0)并用于所有请求;属客户端冒充。
  • [ok] 去水印串替换 — videoUrl 由 play_addr 的 url_list 经 replace('playwm', 'play') 得到,兑现「无水印」卖点。
  • [ok] 外部进程与音频出网 — spawn(ffmpeg/ffprobe) 用于转音频与探测;转写 POST 到 api.siliconflow.cn 并带 Bearer ApiKey,属素材出网。
  • [ok] 无 TLS 降级 / 无高级伪装 / 无任意代码执行 — §3 危险旗标与沙箱两类均无命中;无 eval/动态加载远程模块;无批量采集。
  • [ok] 来源与元数据 — _meta.json 记 owner whille、slug douyin-downloader-nodejs、version 1.0.0、publishedAt 1771744202949;SKILL.md homepage 指向 github.com/yzfly/douyin-mcp-server。

6结论

  • 零依赖单文件:只需 Node 与 ffmpeg 即可运行,无 npm 安装步骤,drop-in 即用。
  • info/download 免凭证:不给任何 Key 也能取无水印链接与下载视频。
  • 一条命令串起 下载→抽音频→转写→markdown 的完整流水线(覆盖主流“去水印+文案”需求)。
  • 取链有兜底:接口失败时回落解析页面内嵌 window._ROUTER_DATA,抗接口变更。
  • 对临时产物做清理:未显式保存视频时删除 mp4 与 mp3,减少残留。
  • 适合:适合个人快速把抖音分享链接保存成无水印视频,或把口播内容转成文字稿(愿意自备 ffmpeg 与硅基流动 API Key、接受稳定性与合规风险)。
    不适合:不适合需要稳定 SLA、版权合规审核或批量采集的场景;不适合对素材外发(上传第三方转写)敏感的用户;不适合未安装 ffmpeg 或不熟悉 Node 的环境。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-10-10
    方式 A · 人下载镜像包下载 douyin-downloader.tar.gz
    sha256: 46c40531df500807…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit dd0bf35595;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库freestylefly / freestylefly/canghe-skills
    本 skill commitdd0bf35595
    许可MIT(仓库根 LICENSE)
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近