Communitygithub.com

Leihb/xiaohongshu-teardown

Let Claude watch and tear down Xiaohongshu (RED) notes — 小红书笔记拆解. Extracts burned-in subtitles into a full transcript at 1/6 the token cost of frame sampling, plus engagement metrics, hook and narrative-structure analysis. Claude Code skill.

Qu'est-ce que xiaohongshu-teardown ?

xiaohongshu-teardown is a Claude Code agent skill that let Claude watch and tear down Xiaohongshu (RED) notes — 小红书笔记拆解. Extracts burned-in subtitles into a full transcript at 1/6 the token cost of frame sampling, plus engagement metrics, hook and narrative-structure analysis. Claude Code skill.

Compatible avecClaude Code~Codex CLI~Cursor
npx skills add Leihb/xiaohongshu-teardown

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait xiaohongshu-teardown ?

小红书视频没有字幕轨——字幕是烧在画面里的。这个 skill 把这一点从障碍变成优势:裁出字幕带、按字幕变化去重、纵向拼成长图,一次 Read 拿到几十句台词。

两条取词路线,按目标选,不是主备关系:

硬字幕(subtitles.py本地 ASR(transcribe.py
拿到的是作者写的字幕,保留分屏节奏口播的连续文本
拆解文案✅ 首选——分屏断句本身就是设计❌ 会把 4 屏合成 1 句,节奏信息丢失
只问"讲了什么"够用但有重复✅ 更省、零重复、标点完整
token(3:49 竖版实测)6.4k(图像,247 状态)2.2k(文本,174 段)
无音轨视频✅ 照常工作❌ 完全失效
无硬字幕视频

实测对照:硬字幕 教你一个方法 / 让你在汇报、分享 / 答辩中 / 表达更清晰(4 屏,每屏 4~6 字)↔ ASR 让你在汇报分享答辩中表达更清晰(1 句)。两者中文准确率都很高,别以为 ASR 会错字——MECE豆包 都识别正确。

解析 SKILL_DIR

下面每条命令都跑 SKILL_DIR/scripts/ 下的脚本。把 SKILL_DIR 设为你刚读的这个 SKILL.md 所在目录的绝对路径(harness 在 Read 结果里告诉了你),脚本是它的直接子目录:

SKILL_DIR="<这个 SKILL.md 所在目录的绝对路径>"
[ -f "$SKILL_DIR/scripts/fetch.py" ] || { echo "ERROR: 找不到 scripts/fetch.py,SKILL_DIR=$SKILL_DIR" >&2; exit 1; }

Step 0 — 依赖

需要 python3 + ffmpeg/ffprobe。硬字幕路线只用到这些。

brew install ffmpeg     # macOS;Linux 用发行版包管理器

ASR 路线(Step 4)额外需要 whisper-cli + 一个 ggml 模型放在 ~/.cache/whisper-models/只在真要走 Step 4 时才检查——硬字幕路线用不到它,别提前装、别提前检查。

brew install whisper-cpp          # macOS

macOS 之外官方没有预编译分发,从源码构建(cmake 跨平台,Windows 官方只说明支持 MSVC / MinGW、没给现成命令):

git clone https://github.com/ggml-org/whisper.cpp.git
cd whisper.cpp && cmake -B build && cmake --build build -j --config Release
# 产物 ./build/bin/whisper-cli,放进 PATH

模型(transcribe.py 找不到时会打印下载命令):

curl -L --create-dirs -o ~/.cache/whisper-models/ggml-large-v3-turbo.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin

⚠️ 1.62 GB,先问用户再下。 空间紧张就换量化版,同一目录放好即可自动识别:ggml-large-v3-turbo-q8_0.bin(874 MB)或 ggml-large-v3-turbo-q5_0.bin574 MB)。

⚠️ 两个仓库 ID 不一样,别混:GitHub 是 ggml-org/whisper.cpp,HuggingFace 模型仓库是 ggerganov/whisper.cpp

Step 1 — 抓取

python3 "${SKILL_DIR}/scripts/fetch.py" '<url>' --out-dir <工作目录>

链接整条带引号传&xsec_token 必须完整保留,少一个参数就可能取不到)。

三种入口全部实测可用,不需要预处理:

入口拿到的形态
App 分享到微信完整 explore/<id>?...&xhsshare=WeixinSession
App「复制链接」短链 http://xhslink.cn/o/xxxxx.cn 不是 .com
PC 收藏页explore/<id>?xsec_token=...&xsec_source=pc_collect

短链是干净的 HTTP 302(不是 JS 跳转),urllib 自动跟随;但它落地到 /discovery/item/<id> 而不是 /explore/<id>——NOTE_RE 必须同时匹配两种路径,别把 discovery/item 删了。

用户从 IM 粘过来常带一句话前后缀(来【小红书】围观这篇笔记!),把 URL 摘出来单独传。

输出笔记元数据、下载媒体、抽 3 张探针帧。看输出里的两个关键信号:

  • type: video 还是别的 → 决定走 Step 2 还是 Step 5
  • audio=NO → 这条无音轨,ASR 路线不可用,只能读硬字幕(实测确有这种笔记:纯屏录演示,0 音轨)
  • BLOCKED: redirected to /404 → 笔记被删,或 xsec_token 过期。让用户重新分享一次拿新链接;不要重试原链接。

Step 2 — 定位字幕带(你亲自看)

别写算法猜字幕位置。 试过按「静止背景 + 离散跳变」打分,在动画背景视频上会选中画面中部(错),因为整屏都在动。你读图一眼就能定位,鲁棒得多。

Read 上一步的 2~3 张探针帧,然后判断:

  1. 有没有硬字幕? 底部(偶尔顶部)那条随口播变化的文字。注意和这些区分开:标题文字、画面里的 UI 文字、贴纸、水印——它们不随口播走。
  2. 字幕带的 y 和高度。 直接读探针帧上的像素坐标(512 宽的图),往上下各留一点余量,两行字幕要整条框进去。

没有硬字幕 → 跳到 Step 4。

Step 3 — 提字幕

python3 "${SKILL_DIR}/scripts/subtitles.py" <video> --band <y>,<h> --out-dir <dir>

--band探针帧坐标(512 宽那张图上量的),脚本自己换算到原始分辨率——不要手动换算。

竖版加 --strip-width 360 竖版字幕字号大(带高约 70px vs 横版 34px),512 宽下每行要 48 token;360 宽实测依然清晰可读,每行降到 24,省一半。横版字小,保持默认 512。

然后 Read 每一张 strip。每张从上到下就是时间顺序,输出里每张都附了逐行时间戳。

会看到同一句重复 2~4 次:字幕没变但背景在动,触发了去重阈值。这是已知行为,不是 bug——读的时候合并即可,别为此调参。真要压:

现象调法
重复太多,且字幕压在深色背景上--luma 200(浅色背景无效,实测没用)
重复太多,背景浅色--threshold 10;再高就会漏真实换句
漏句(时间轴有跳跃)--fps 3--threshold 3
只想看某一段--start 0:30 --end 1:00

Step 4 — 本地 ASR

python3 "${SKILL_DIR}/scripts/transcribe.py" <video> --out-dir <dir>

本地 whisper.cpp,中文默认,不联网不花钱。约 7.7 倍实时(229 s 音频 → 29.6 s,large-v3-turbo / 8 线程)。模型缺失时脚本会打印下载命令——先告诉用户要下 1.5 GB,等他同意再下

什么时候走这步:

  • Step 2 没找到硬字幕(且 audio=yes)→ 必走,这是唯一的取词路径
  • 用户只想知道"讲了什么"、不做文案拆解 → 直接走这条,比硬字幕省约 3 倍,跳过 Step 2/3
  • 做文案拆解 → 不要用它替代硬字幕;分屏节奏会丢。硬字幕重复太多、读起来吃力时可以两条都跑,用 ASR 校对断句

audio=NO 且无硬字幕 → 直说这条拿不到任何台词,只能看画面。

Step 5 — 看画面

python3 "${SKILL_DIR}/scripts/frames.py" <video> --hook --count 12 --out-dir <dir>

--hook 会给开头 5 秒每秒一帧——钩子拆解要的就是这几帧。Read 全部。

图文笔记type: normal)没有这步。fetch.py 已经把图片下到 images/已缩到 512 宽,原图在 images/orig/),按顺序 Read 全部,配合 title + desc 拆解。

  • 图文的"钩子"是首图 + 标题,不是前 3 秒。首图通常是大字观点卡,标题决定点击率。
  • 512 宽实测能读清论文解读级别的密集正文。别去 Read orig/ 里的原图——1440×2400 是 4608 token/张,9 张 41k,比缩放版贵 8 倍。只在某张图有小字表格、缩放后确实看不清时,单张读原图或裁剪局部。
  • 图文的"叙事结构"是翻页节奏:第几张抛观点、第几张给论据、第几张给结论、最后一张是不是 CTA/互动引导。

Step 6 — 出报告

四段,按这个顺序(数据在前,方便先判断这条值不值得细拆):

1. 流量数据

赞/藏/评/转的绝对值,加上两个比值的解读:

  • 藏赞比高(收藏 ≥ 点赞)→ 工具型/干货,用户存起来备用
  • 评赞比高 → 有争议或有互动钩子
  • 话题标签、发布时间、作者、IP

2. 钩子拆解

前 3~5 秒画面 + 首句文案逐帧讲清楚怎么抓人的,引用字幕原文。点明用了哪种钩子:悬念、反常识、痛点直击、身份代入、利益前置……

3. 叙事结构时间轴

把逐字稿切成段落,每段标时间戳、时长占比、作用。常见骨架:钩子 → 问题铺垫 → 概念解释 → 方案 → 案例 → CTA。指出节奏问题(哪段拖了、哪段太赶)。

4. 完整文案

  • 视频:带时间戳的逐字稿,重复句合并。要能直接拿去改写成自己的脚本,所以别概括、别删句。
  • 图文:改成逐页要点 + 关键数据/图表。正文动辄几千字,逐字抄没意义;但数字锚点必须原样保留(论文阈值、百分比、p 值这类),那是评论区吵架和二次传播的抓手。顺手核对标题/desc/正文的数字是否自相矛盾——实测遇到过 desc 写 30%、正文写 45% 的情况,这种不一致值得点出来。

最后跟一句可复用的结论:这条能抄的是什么(钩子公式/结构/选题角度),不是泛泛夸好。

用户如果问了具体问题("开头怎么抓人的"),先直接答那个问题,报告按需裁剪——别不管问什么都甩四段全文。

成本

两条真实笔记实测:

横版 1280×720 / 7:06竖版 720×1280 / 3:49
字幕状态381247
strip 宽度512(默认)360(--strip-width 360
strip7 张 × 55 行 ≈ 8.9k7 张 × 38 行 ≈ 6.4k
每行 token2324
抽取耗时3.7 s2.4 s
同片 ASR 对照2.2k / 29.6 s

加上整帧(frames.py --hook --count 12):横版 512×288 约 196/张,13 张 ≈ 2.5k。竖版整帧贵得多——512 宽下是 512×910 ≈ 621/张,加 --width 360(360×640 ≈ 307/张)并把 --count 压到 6~8。

图文笔记(9 图实测):缩到 512 宽后 5.3k 读完全部 9 张(约 582/张)。原图 1440×2400 要 41k,贵 8 倍

对比密集整帧抽样:要覆盖同样的字幕密度,横版那条要 381 张整帧 = 75k token,贵 6.6 倍

指纹只走一次 ffmpeg(852 帧一次调用),别改回逐帧调用。

边界

  • xsec_token 会过期。/404 就是要新链接,重试无用。
  • 登录态不需要。 带新鲜 token 的分享链接匿名可取,实测通过;不要为此启动 CDP 或读浏览器 cookie。
  • 字幕带位置每条视频都要重新看。 竖版(3:4 / 9:16)和横版坐标完全不同,别套用上一条的数值。
  • 只读,绝不写。 不点赞、不收藏、不关注、不评论、不发布。使用者往往自己也在运营账号,账号上的自动化痕迹是真实风险;这个 skill 的所有脚本都只做 GET,不要替用户加任何互动操作。
  • 别拿它做批量采集。 脚本按单条笔记设计,一次一条、用户主动给链接。循环跑整个账号或话题页是另一回事,风控和道义上都不在本 skill 的范围内。

Skills associés