本地优先的抖音视频、封面、直接音频和用户主页作品列表采集下载 Skill。
SaferSkills independently audited douyin-video-downloader (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
本 skill 是一个本地 Node.js 抖音视频与直接音频下载工具。
先确定 {SKILL_DIR} 为本 SKILL.md 所在目录。
node {SKILL_DIR}/douyin-video.js info "抖音分享链接" --cover-size mediumnode {SKILL_DIR}/douyin-video.js download "抖音分享链接" -o ./videos默认选择 best,即脚本能识别到的最高质量候选。
视频下载会同时下载封面图,并把视频、封面和 metadata 路径都写入 metadata JSON。
node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --quality best -o ./videos
node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --quality 720p -o ./videos
node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --quality 0 -o ./videos--quality 支持:
best:最高质量lowest:最低质量720p / 1080p 这类清晰度标签info 输出中的候选序号ratio、format、gear_name 等候选标签的部分匹配node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --cover-size medium -o ./videos
node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --cover-size origin -o ./videos
node {SKILL_DIR}/douyin-video.js download "抖音分享链接" --cover-size 0 -o ./videos
node {SKILL_DIR}/douyin-video.js cover "抖音分享链接" --cover-size medium -o ./videos--cover-size 支持:
medium:默认,中档尺寸small:较小封面候选large / best:按返回宽高选择较大封面origin:原始封面字段raw:原始/未处理封面字段dynamic / animated:动态封面候选gaussian / blur:模糊封面候选info 输出中的封面候选序号none:不下载封面node {SKILL_DIR}/douyin-video.js audio "抖音分享链接" -o ./audiosaudio 命令会先解析视频对应的 music.mid/id,再请求抖音音乐详情接口获取 music.play_url 并下载原始音频文件。没有直接音频地址时会报错,不会从 MP4 中抽取音频。
视频、封面和音频命令会合并写入同一个 metadata JSON,不会因为后执行音频而覆盖之前的视频或封面文件路径。
node {SKILL_DIR}/douyin-video.js db-init --db ./douyin_collection.sqlite采集库包含:
users:用户资料crawl_pages:每次列表页接口响应videos:视频标题、链接、封面、时长、发布时间等video_stats:点赞、评论、收藏、转发、播放、下载等统计字段music:音乐 ID、标题、作者、时长、直接音频地址等video_downloads:后续批量下载的成功/失败状态、文件路径和错误信息media_downloads:音频等媒体文件的成功/失败状态、文件路径和错误信息用户主页列表通常需要登录态和抖音 Web 签名参数。先用浏览器打开用户主页并登录,再把 /aweme/v1/web/aweme/post/ 接口响应体保存成 JSON 文件,然后导入:
node {SKILL_DIR}/douyin-video.js db-import-post-json \
--db ./douyin_collection.sqlite \
--input ./post_1036.json \
--limit 100默认规则:同一个用户列表只采集前 100 条视频信息。可以重复导入多个分页 JSON;同一个 aweme_id 会覆盖更新,不会重复插入;达到 100 条后继续导入分页只记录列表页响应,不再插入新视频。
采集完成后,必须告知用户已经抓取完毕,并询问是否开始下载。不能在采集完成后自动下载全部视频。
node {SKILL_DIR}/douyin-video.js collect-user "抖音用户主页 URL" \
--db ./douyin_collection.sqlite \
-o ./collection \
--account default \
--limit 100collect-user 会:
--account 时使用 ~/.agents/douyin-video-downloader/accounts/<account>/browser-profilesessionid / sid_guard 有效,就直接抓取/aweme/v1/web/aweme/post/max_cursor=0 的第一页开始;按顺序处理预加载页,再滚动作品列表触发下一页has_more=0 时正常结束;游标重复、无新增作品、接口异常或下一页超时时停止并保留已采集数据默认采集库上限为 100 条;--limit 0 表示不设作品数量上限(仍有 1000 页安全上限)。重复作品更新现有记录,不占用新增名额。达到上限时仍可更新当前页的已有记录。
node {SKILL_DIR}/douyin-video.js check-login --account defaultcheck-login 会打开或复用账号对应的浏览器 profile,并检查抖音登录 cookie 是否可用。登录有效时返回 0;未登录时返回 2,并提示用户在打开的浏览器里扫码登录。这个命令只检查登录状态,不采集、不下载。
可选参数:
--account default
--browser-session douyin-video-downloader
--profile-dir ~/.agents/douyin-video-downloader/browser-profile
--login-timeout 180
--reuse-session--account 是推荐的账号隔离方式。没有指定 --profile-dir 时,账号名会自动映射到独立 browser profile;没有指定 --browser-session 时,账号名也会用于生成稳定 session 名称。--browser-session 会被规范为较短的安全名称,避免 Playwright CLI socket 路径过长。已有登录浏览器 session 时,可以加 --reuse-session 直接复用,不重新打开浏览器。
如果本机没有 Playwright CLI 运行环境,命令会提示安装依赖,不会自动安装。
node {SKILL_DIR}/douyin-video.js db-export --db ./douyin_collection.sqlite -o ./videos.json
node {SKILL_DIR}/douyin-video.js db-export --db ./douyin_collection.sqlite -o ./videos.csv --format csvnode {SKILL_DIR}/douyin-video.js db-download-batch \
--db ./douyin_collection.sqlite \
-o ./videos \
--quality best \
--cover-size medium \
--delay-seconds 5 \
--confirm-every 10 \
--download-limit 100批量下载按采集库里的列表页地址顺序处理:第一个网址下载完成后,至少等待 5 秒,再打开第二个网址。下载地址、封面和 metadata 优先从 SQLite 中保存的列表接口 raw_json 生成,只有缺少原始数据时才回退到重新解析视频页。每个视频下载时默认同步下载中档封面,可用 --cover-size 选择其他封面尺寸。每成功下载 10 个视频后必须询问用户是否继续;用户确认继续后,才能继续下载。--download-limit 是本次命令的总下载上限。已成功下载的视频会记录在 video_downloads 表中,后续同一清晰度会跳过。
node {SKILL_DIR}/douyin-video.js db-download-audio-batch \
--db ./douyin_collection.sqlite \
-o ./audios \
--delay-seconds 5 \
--download-limit 100批量音频下载优先使用采集库 music.play_url 中的直接音频地址,不从视频抽取音频。下载状态记录在 media_downloads 表中;已成功下载的音频会跳过。每条音频之间至少等待 5 秒,--download-limit 是本次命令的总下载上限。
--quiet。.part 临时文件,避免拼接重复数据;本版本不做跨进程断点续传。.part,后续下载不会复用它。运行 npm test 执行离线回归测试,覆盖多页采集、去重和上限、截断与超时重试、正式文件保护,以及清晰度/封面/直接音频兼容性。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.