--- name: space-xhs-hotspot description: 小红书热点搜集与选题判断。按关键词/赛道拉取近期高互动笔记,输出热点表格、趋势判断和可直接开写的选题建议。当用户说"小红书热点""小红书最近火什么""查一下 XX 赛道的爆款""小红书选题""找小红书素材""这个词在小红书热不热""小红书热榜/热门笔记/爆款笔记""帮我看看小红书数据"时触发。也适用于用户报出一个赛道词(如"减脂餐""通勤穿搭""AI 工具")并问"能不能写"的场景。多数据源自动降级:红狐 API / socialdatax CLI / 怪壳 CLI,均未配置时走 WebSearch 手动兜底。 --- # 小红书热点搜集(space-xhs-hotspot) 给创作者用的选题雷达。目标不是把数据倒出来,而是**回答三个问题**:这个赛道现在有没有流量?流量集中在哪几种内容形态上?我下一篇该写什么。 **产出链路**:本 skill 出选题 → `space-xhs-title` 起标题 → `space-xhs-writer` 写正文。所以最后一段必须是**可以直接粘给下游的选题卡**,不是一句"建议多观察"。 --- ## 数据说明(展示任何数据之前必须先说明,逐字保留口径) - **收录门槛**:红狐库只收录**互动数 1000+** 的笔记。搜不到 ≠ 这个方向没人写,只等于**这个方向没出过 1000+ 互动的爆款**——这本身就是一条判断(小众/低天花板 or 蓝海)。 - **更新节奏**:每日**早上 7 点**更新**昨日**数据。当天数据永远查不到,用户说"今天"时按"昨天"处理并说明。 - **数据快照**:互动数是**入库时刻**的快照,不是实时值。入库后还会继续涨——所以"3 天前的 8000 互动"实际热度可能高于"昨天的 1.2w"。 - **时间窗**:库内只有**昨天到 30 天前**的数据。超过 30 天的请求要明确告知并降级到最近可用范围。 - **链接口径**:`note_url` / `noteLink` **必须原样输出**,包含 `xsec_token` 查询参数。禁止截断、脱敏、重建,禁止只拿 `note_id` 自己拼 URL——拼出来的链接打不开。`note_id` 是 24 位小写十六进制,必须完整复制。 --- ## 第 0 步:数据源探测与降级(每次执行前先做,不要假设 Key 存在) ```bash env | grep -E '^(REDFOX_API_KEY|SOCIALDATAX_API_KEY|GUAIKEI_API_TOKEN)=' | sed 's/=.*/=/' ``` 按下表**从上往下**取第一条可用路线;某条路线报错(401/余额不足/网络失败)时继续往下降级,并在输出里注明"本次数据来自 X 路线"。 | 优先级 | 环境变量 | 路线 | 强项 | 短板 | |---|---|---|---|---| | 1 | `REDFOX_API_KEY` | 红狐 API(本 skill 自带脚本) | 唯一有**热度/相关性/时效三维评分**和 `relatedSearches` 拓词;天然只含 1000+ 爆款,信噪比最高 | 只有近 30 天;T+1 更新;无评论 | | 2 | `SOCIALDATAX_API_KEY` | socialdatax CLI(npx,见 `xhs-content-research`) | 近实时;有 `--since-days`、多种排序、图文/视频筛选 | 无评分,需自己按互动排序;按量计费 | | 3 | `GUAIKEI_API_TOKEN` | 怪壳 Node CLI(见 `xiaohongshu-content-tools`) | 能拿**笔记详情 + 评论区 + 博主全部作品**,做深挖唯一选择 | 需 node,脚本在另一 skill 目录下 | | 兜底 | 无 | WebSearch 手动 | 零配置 | 无互动数,只能看到标题和大致方向 | 具体命令、参数、报错处理见 `references/data_sources.md`(执行前读它)。 **三个 Key 都没有时**,不要静默失败,按此模板回复: ``` 未检测到小红书数据源,本次用公开搜索兜底(拿不到互动数,只能看内容方向)。 想要带互动数据的完整热点分析,配置任一即可(推荐第 1 个): export REDFOX_API_KEY=... # https://redfox.hk/settings/api-keys 近30天爆款库,带热度评分 export SOCIALDATAX_API_KEY=... # https://socialdatax.com/ai 近实时搜索 export GUAIKEI_API_TOKEN=... # https://www.guaikei.com 详情+评论深挖 写进 ~/.zshrc 后重开终端即可。 ``` 然后**继续用 WebSearch 兜底跑完流程**(`site:xiaohongshu.com <关键词>` + 小红书热点类聚合站),只是把"互动数"列换成"来源"列,并在结论里标注"未经互动数据验证"。不要因为没 Key 就停在提示上。 --- ## 第 1 步:把用户的话变成能查的词 **核心判断:泛化词 vs 细分词。** 拿泛化词去查,返回的是一堆彼此无关的爆款,看不出任何趋势;拿过细的词去查,返回 0 条。 | 类型 | 特征 | 例 | 动作 | |---|---|---|---| | 泛化词 | 上位概念、行业分类,无场景/人群/风格修饰 | 美妆、穿搭、职场、AI、母婴 | 先拓 6~10 个细分词,**同时开跑**,用结果对比出热度分布 | | 细分词 | 有一层修饰(场景/人群/风格/意图) | 通勤穿搭、减脂早餐、小个子显高、AI 做 PPT | 直接查,这是甜点区 | | 过细词 | 两层以上修饰或长尾组合 | 微胖小个子秋冬通勤穿搭 | 砍到一层修饰再查,同时保留原词做人工筛 | **与原版的差别**:识别到泛化词时**不要停下来等用户回复"拓展/不拓展"**。直接说明"「穿搭」太宽,我按 8 个细分方向并行查了",然后一次跑完(红狐支持逗号分隔多词)。用户想改方向,看到结果再改效率更高。只有当拓展词方向存在多种明显不同的商业意图(如"保险"→ 买保险 / 卖保险 / 保险从业)时,才值得先问一句。 **拓展词生成原则**: - 大小适中——"中产穿搭"这种自造词查不到数据,"老钱风""通勤""松弛感"这种平台上真实存在的说法才查得到。 - 覆盖四个维度,各 2~3 个:**趋势词**(老钱风、多巴胺、松弛感)、**人群词**(学生党、小个子、宝妈、打工人)、**场景词**(通勤、约会、露营、租房)、**意图词**(平替、避雷、测评、清单)。 - 优先用用户自述里出现过的词。用户说"我平时写小众电影、书评、港台文化",就该查「小众电影/港台电影/书单推荐」,而不是查「电影」。 ### 赛道词库:`references/xhs_sectors.json` 不要凭空想拓展词——先查词库。它按小红书官方 24 个一级赛道组织,每个赛道给 `trend` / `audience` / `scene` / `intent` 四个维度的可查询细分词,正好对应上面四个维度。 **什么时候读它**(三种场景,其余场景别浪费上下文): | 场景 | 用法 | |---|---| | 用户给的是泛化词("穿搭""职场""AI") | 找到对应一级赛道,**四个维度各取 2~3 个**凑 6~10 个词并行查,这就是赛道下切 | | 用户给的是细分词("通勤穿搭") | 直接查该词,**同时**从同赛道同维度取 2~3 个邻近词做横向对比(见第 4 步),用来回答"这个词在赛道里算热还是算冷" | | 用户说不清方向、只说"我该写什么" | 先问定位,再从其人设匹配的 1~2 个赛道取词 | **词库是起点不是终点**:跑完第一轮后,必须拿接口返回的 `relatedSearches`(红狐)或本轮高频标题词(其他路线)二次拓词——那才是平台**当下**的真实说法。词库里的趋势词会过期,查出来 0 条就说明它已经凉了,这本身是条结论,别硬凑。 赛道找不到对应项(如"跨境电商""考编")时,就近映射到最相关的一级赛道(互联网 / 教育),并说明是近似映射,不要为了对齐词库改写用户的方向。 --- ## 第 2 步:查询与时间窗策略 **默认窗口 7 天**(`startDate = 今天 - 7`)。换算:今天→昨天,最近/近一周→7 天,近 N 天→今天-N,最多 30 天。 **数据不足时只扩时间,不换词**(换词会把两个不同赛道的数据混在一起,趋势判断就废了): ``` 1 天 → 3 天 → 7 天 → 30 天 ``` 每次扩窗都要告知:"「XX」近 7 天只有 3 条 1000+ 笔记,已扩到近 30 天。"扩到 30 天仍 < 5 条,就停手,直接给结论:**这是一个低产出赛道**——要么受众太窄,要么平台不给这个方向流量,要么就是没人写的蓝海。这三种可能要在结论里替用户区分(看 `relatedSearches` 有没有词、看邻近词的数据量)。 --- ## 第 3 步:读数据,做趋势判断(本 skill 的核心,不要跳过) 拿到笔记列表后,**逐条不是重点,模式才是**。按下面六个切口过一遍,前五个是赛道现状,第六个是爆款共性: ### 1. 形态分布 把 top 20 按内容形态归类,数出占比:**清单/盘点|教程步骤|测评对比|个人经历叙事|避雷吐槽|数据结论|资源合集**。占比最高的形态 = 平台当前在这个赛道给流量的形态,也是最安全的模仿对象。占比为 0 但用户擅长的形态 = 差异化机会(要标风险)。 ### 2. 标题钩子分布 统计 top 20 标题里出现的钩子:数字("5 个""3 天")、人群标签("打工人""学生党")、痛点原话(带引号的吐槽)、反差("没想到""原来")、身份背书("三甲医生""HR")、时效("2026""最新")。哪种钩子重复出现最多,就是这个赛道读者当下吃的那一套——直接传给 `space-xhs-title`。 ### 3. 账号量级 看 `authorFans`。**如果 top 榜里有明显的小号(<1 万粉)跑出 1w+ 互动,说明这个赛道流量吃内容不吃账号,新号可进**;如果全是 50 万+ 大号霸榜,说明是存量竞争,新号进去大概率沉。这条对用户的决策价值最高,务必写出来。 ### 4. 时间分布 爆款集中在最近 3 天 = 上升期热点,抓紧写;均匀分散在 30 天 = 常青需求,什么时候写都行;集中在 3 周前后没有新的 = 热点已过,别追。 ### 5. 互动结构 比较 `likedCount` / `collectedCount` / `commentsCount`: - **收藏 > 点赞** → 工具型/资料型内容,读者要留着用。适合做清单、模板、合集。 - **评论 > 收藏且评论占比高** → 话题型/争议型,读者要表态。适合做观点、提问、对比。 - **点赞压倒性高** → 情绪型/审美型,读者只是路过认同。转化弱,涨粉一般。 > 账号量级这一条只有红狐路线有 `authorFans`。怪壳路线**实测拿不到粉丝数**,此时写"粉丝字段缺失,本路线无法判断账号量级",**不要估算**,其余四个切口照常给。 ### 6. 爆款共性提取(样本 ≥ 8 条时必做) 上面五个切口回答"这个赛道现在是什么样",共性提取回答**"这批爆款为什么爆,哪些我能抄,哪些抄不了"**——后者才是用户真正要的东西。 执行前读 `references/pattern_extraction.md`,按它做三件事: 1. **逐条打两个标签**:形态标签(清单/教程/测评/经历/避雷/数据/资源/身份背书)+ 爆款机制标签(新鲜感/结果感/场景感/身份感/情绪感/反差感/收藏动机/争议感),一条笔记取最强的 1~2 个机制。 2. **数成分布**:形态 X/20、机制 X/20、标题高频词 top 10~14。**≥40% 才叫共性,20%~40% 叫次主流,<20% 且只有 1~2 条支撑的只能叫个例**,不许包装成趋势。 3. **拆成三张清单**:可复用 / 不可复用(身份壁垒、资源壁垒、账号壁垒)/ 空位。**不可复用清单不能省**——只给"可以抄的"等于把用户往坑里带。 样本 < 8 条时不做占比,只做定性描述,并写明"样本 N 条,结论仅供参考"。 --- ## 第 4 步:对比(用户问"变没变""哪个更值得写"时做,否则跳过) 单次快照只能说"现在什么样",说不了"在变好还是变差""A 和 B 哪个能进"。这两类问题要靠两次以上查询的**对比**。 **触发条件**:用户问"最近还火吗""比上个月怎么样""哪个赛道更值得写""我该选 A 还是 B",或第 1 步做了赛道下切拿到多组数据。 **做法**:把每次查询的结果 JSON 各自落盘,再用 `scripts/compare_sets.py` 归一对齐(离线脚本,不联网、不需要 Key)。 ```bash S=~/.claude/skills/space-xhs-hotspot/scripts # 多赛道横向:同一时间窗,谁的量级更高、形态和钩子有什么差别 python3 $S/compare_sets.py 通勤穿搭=a.json 老钱风=b.json 学生党穿搭=c.json --top 20 # 单赛道纵向:同一个词,本周 vs 上月 python3 $S/compare_sets.py 本周=this.json 上月=last.json --label-kind time # 要结构化数据自己再加工时 python3 $S/compare_sets.py a.json b.json --json ``` - 输入是**已落盘的 JSON**,两种格式自动识别:红狐脚本输出(`items[]`)、怪壳 `search-cli.js` 的结果文件(`results[]`)。怪壳 **stdout 混着日志行不能直接解析**,用它自动落盘的 `xiaohongshu-content-tools/logs/*_search.json`。 - 标签就是查询词,脚本会用它剔除高频词里的查询词本身(不然 top 词永远是查询词自己)。 - 输出:对比总表(样本/互动中位数/互动最高/藏赞比/评赞比/小号占比/主形态/主钩子)+ 每组的形态、钩子、标题高频词、最高互动笔记 + 词层交集与独有词。 - 样本 < 8 条的组,脚本会自己打 ⚠️,转述时要带上这句警告。 **怎么读对比结果**: | 观察 | 结论 | |---|---| | 同词跨时间:互动中位数明显下滑、高频词换了一批 | 热点在退潮,别追旧说法,跟着新高频词走 | | 同词跨时间:中位数稳定、高频词几乎不变 | 常青需求,什么时候写都行,拼的是执行 | | 跨赛道:A 的中位数高但主形态是"身份背书" | 天花板高但**你进不去**,要在结论里说破 | | 跨赛道:B 中位数中等但小号占比高、主形态是清单 | 这才是新号的入口 | | 词层"共有高频词" | 跨赛道通用钩子,可复用性最强 | | 词层"独有词" | 该赛道的专属搜索入口,交给 `space-xhs-title` | **红线**:不同数据源的数字**不能直接比大小**(红狐是 1000+ 收录库的入库快照,怪壳是实时抓取的全量搜索)。跨路线对比时只比**结构性指标**(形态占比、藏赞比、高频词),并注明"两组数据来自不同路线,绝对量级不可比"。 --- ## 输出格式 ### ① 数据说明(一行) > 数据源:红狐 API|收录门槛 互动 1000+|每日 7 点更新昨日数据|互动数为入库快照 > 📅 查询范围:X月X日 - X月X日|关键词:A、B、C ### ② 热点笔记表格 有关键词(红狐路线,带评分): | # | 笔记标题 | 作者(粉丝) | 互动 | 赞/藏/评 | 发布 | 相关性 | 热度 | 时效 | **总分** | |---|---|---|---|---|---|---|---|---|---| 无关键词全站热门 / 非红狐路线(无评分字段,按互动降序): | # | 笔记标题 | 作者(粉丝) | 互动 | 赞/藏/评 | 发布 | |---|---|---|---|---|---| - 标题和作者都做成 Markdown 链接。笔记链接**原样使用返回值**(含 `xsec_token`),作者链接 `https://www.xiaohongshu.com/user/profile/{authorId}`。 - 默认展示前 10 条,多于 10 条时在表下写"共 X 条,已展示前 10,要全部就说一声"——**说明即可,不要停下来等回复**,直接继续往下做趋势判断。 - 多关键词并行查询时,按关键词分组小标题,每组展示 top 5。 ### ③ 赛道体检(对应第 3 步前五个切口) ``` 形态分布:清单 45% | 测评 25% | 经历叙事 20% | 其他 10% 钩子分布:数字 12/20,人群标签 9/20,痛点原话 5/20 账号量级:top10 里 4 个 <1 万粉 → 内容驱动,新号可进 时间分布:8/10 集中在近 5 天 → 上升期 互动结构:收藏平均高于点赞 1.3 倍 → 工具型需求为主 ``` 每条后面跟一句话解读,不要只丢数字。 ### ④ 爆款共性(样本 ≥ 8 条时必给,格式见 `references/pattern_extraction.md`) ``` 共性:收藏动机 12/20(60%,主流)|身份感 9/20(45%,主流)|反差感 3/20(个例) 可复用:清单式收纳合集 —— 对标《XXX》1.2w(链接)—— 换到你的赛道就是「租房党的 X 件……」 不可复用:top3 有 2 条是三甲医生出镜科普(身份壁垒),你没这个身份照抄说服力归零 空位:教程形态占比 0,但该赛道读者藏赞比 1.3 明显偏工具型 —— 可能是机会,也可能是平台不给这个形态流量,先小成本试 选题公式:收藏动机 + 清单 + 打工人 →「打工人通勤的 5 件平价单品,闭眼买」 ``` ### ⑤ 对比结论(只在做了第 4 步时给) 贴 `compare_sets.py` 的对比总表,后面跟 2~3 句解读:量级在涨还是在跌、新号能进哪个、高频词换没换。跨路线数据要标注"绝对量级不可比"。 ### ⑥ 拓词与邻近机会 `relatedSearches` 原样列出,并标注哪几个值得下一轮查(挑与用户人设匹配的),哪几个是无关噪音。非红狐路线用本轮标题高频词代替,并注明来源不同。 ### ⑦ 选题建议(3~5 条,交付重点) 每条按这个卡片给,让用户能整条粘给 `space-xhs-title` / `space-xhs-writer`: ``` 【选题 N】一句话选题 形态:清单 / 教程 / 测评 / 叙事 / 避雷 依据:对标笔记《XXX》互动 1.2w(链接),同类形态本轮出现 5 次 钩子方向:数字 + 人群标签(如"打工人的 5 个 XX") 预期互动结构:偏收藏 → 内容要有可保存的清单/模板 风险:赛道已被 50w 粉大号占据 / 属于时效热点,7 天后失效 ``` **依据必须挂到具体笔记**,不能写"因为这个方向很火"。没有对标笔记支撑的选题不要给。选题应当从 ④ 的选题公式长出来,公式和选题要能互相对上。 --- ## 红线 - **不编数据**。互动数、粉丝数、发布时间一律来自接口返回;WebSearch 兜底时明确写"无互动数据",不要估算。 - **链接不改写**。丢了 `xsec_token` 的链接等于给了个 404,比不给更糟。 - **不把"搜不到"说成"没人写"**。收录门槛是互动 1000+,两者不是一回事,必须区分表述。 - **不把相关说成因果**。"top10 里 6 篇带数字标题"是观察,"用数字标题就能爆"是错误推论——写成"这个赛道读者对数字钩子响应更好"。 - **不承诺结果**。给的是概率更高的方向,不是"照这个写必爆"。 - **不只给能抄的**。共性提取必须同时给「不可复用」清单,指明是身份壁垒、资源壁垒还是账号壁垒。 - **不跨源比绝对值**。不同数据源的互动数口径不同,对比时只比结构性指标并注明。 - **超窗口不糊弄**。用户要 60 天,就说"库内只有 30 天,已按 30 天返回",不要默默改成 30 天当作满足了需求。 - **不越权深挖**。要评论区/博主全量作品时,走怪壳路线并说明需要 `GUAIKEI_API_TOKEN`,不要用搜索结果脑补评论区在说什么。 --- ## 自检(输出前过一遍) - [ ] 顶部有数据源标注 + 收录口径 + 时间范围? - [ ] 所有笔记链接都保留了 `xsec_token` 原样? - [ ] 泛化词是否已查 `xhs_sectors.json` 做赛道下切并并行查询,而不是拿大词硬查? - [ ] 数据不足时是否扩了时间窗并告知,而不是偷偷换词? - [ ] 五个切口的赛道体检是否都给了,且每条有解读不只有数字?粉丝字段缺失时是否如实说明而不是估算? - [ ] 样本 ≥8 条时是否给了共性提取,且**三张清单齐全**(可复用 / 不可复用 / 空位)?占比是否按 40%/20% 阈值分级表述? - [ ] 做了多组查询时,是否跑了 `compare_sets.py` 而不是拿眼睛估?跨路线是否标了"绝对量级不可比"? - [ ] 选题建议是否 ≥3 条,每条都挂了具体对标笔记和链接? - [ ] 有没有出现接口没返回的数字? --- ## 目录结构 ``` space-xhs-hotspot/ ├── SKILL.md ├── scripts/ │ ├── fetch_xhs_hot_articles.py # 红狐 API 查询脚本(需 REDFOX_API_KEY) │ │ # 来源:creator-buddy/skills/xhs-hotnotes,原样复用未改动 │ └── compare_sets.py # 第 4 步用:多组结果 JSON 归一对比(离线,不需要 Key) │ # 吃红狐 items[] 和怪壳 results[] 两种格式,自动识别 └── references/ ├── data_sources.md # 三条路线的命令、参数、报错处理、字段映射、怪壳实测须知 ├── xhs_hot_article_format.md # 红狐接口字段说明(同样来自 xhs-hotnotes) ├── xhs_sectors.json # 第 1 步用:24 个一级赛道 × 四维度细分词库 └── pattern_extraction.md # 第 3 步用:爆款共性提取方法(标签表、阈值、三张清单、选题公式) ``` **按需读取**:`data_sources.md` 每次执行前必读;`xhs_sectors.json` 只在需要赛道下切时读;`pattern_extraction.md` 只在样本 ≥8 条要做共性提取时读;`xhs_hot_article_format.md` 只在走红狐路线时读。