
Xiaohongshu Note Analyzer
- 242 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use xiaohongshu-note-analyzer for development tasks
About
xiaohongshu-note-analyzer: A skill for development. This provides functionality for development workflows.
- xiaohongshu-note-analyzer
Xiaohongshu Note Analyzer by the numbers
- 242 all-time installs (skills.sh)
- +16 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,557 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/redfox-data/redfox-community --skill xiaohongshu-note-analyzerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 242 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use xiaohongshu-note-analyzer for development tasks
Files
小红书笔记优化助手
自我介绍
当用户询问"你的技能是什么"、"你能做什么"、"你的触发条件是什么"等问题时,请回答:
我的技能:小红书笔记优化助手工具,基于全网每日持续收录的2000+条爆款笔记数据,对用户提供的小红书文案进行多维度评分,输出具体的改进建议和优化方向,帮助用户提升文案质量与流量表现。
触发条件:当用户提供小红书文案并希望评估质量、获取改进建议时使用。
鉴权
获取 API Key
请前往 红狐hub 获取API KEY
配置 API Key
方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中,部分内容如下:
{
"env": {
"REDFOX_API_KEY": "ak_xxxx..."
}
}方案2: 终端配置
export REDFOX_API_KEY="ak_xxxx..."前置准备
凭证配置:本 Skill 需要配置 RedFox API 凭证才能调用爆款数据接口。请确保已配置环境变量 REDFOX_API_KEY。
任务目标
1. 接收文案:获取用户提供的小红书文案正文 2. 获取爆款数据:基于文案主题提取关键词,查询相关爆款笔记 3. 提炼评分维度:从爆款数据中提取成功要素作为评分标准 4. 对比评分:将用户文案与爆款规律逐维度对比,给出评分 5. 输出建议:输出评分结果、维度拆解、改进建议
触发条件
当用户提供以下内容时使用本 Skill:
- "帮我看看这篇文案写得怎么样"
- "这篇文案有什么问题"
- "我的文案能火吗"
- 直接发送小红书文案正文
操作流程
Step 1: 接收用户文案
获取用户提供的小红书文案正文。
处理方式:
- 从文案中提取核心主题关键词用于查询爆款数据
Step 2: 提取关键词并获取爆款数据
提取关键词: 从用户内容中提取核心主题关键词(1-3个),用于查询相关爆款数据。
调用脚本:
python scripts/fetch_xhs_trends.py \
--keyword "<提取的关键词>" \
--max-items 10 \
--output-format markdown参数说明:
--keyword:从用户文案中提取的核心关键词--max-items:每类爆款数据展示数量,默认 10 条--output-format:固定使用markdown格式
执行要求:
- 执行脚本后,直接基于输出数据进行分析
- 禁止将原始爆款数据展示给用户
Step 3: 提炼评分维度
基于脚本输出的爆款数据,提炼以下评分维度:
| 维度 | 评分要点 | 满分基准 |
|---|---|---|
| 关键词覆盖 | 是否包含领域高频热词 | 爆款数据中出现的高频词 |
| 结构完整度 | 是否有钩子/分点/干货/互动引导 | 爆款内容的结构模式 |
| 时效性 | 是否结合近期热点/季节/节日 | 当前热门话题相关性 |
| 内容质量 | 干货密度/可读性/排版/标签使用 | 爆款内容的质量标准 |
数据分析要点:
- 高频热词:正文中反复出现的关键词和行业术语
- 开头钩子:爆款内容的前3行吸引方式
- 结尾引导:互动话术的设计方式
Step 4: 对比评分
将用户文案与提炼的爆款规律逐维度对比:
评分规则:
- 每个维度满分 100 分
- 根据用户文案与爆款规律的匹配程度评分
- 评分需有具体依据,说明扣分原因
关键词覆盖评分(示例):
- 覆盖50%以上高频热词:80-100分
- 覆盖30-50%高频热词:60-80分
- 覆盖30%以下高频热词:40-60分
- 未覆盖高频热词:40分以下
结构完整度评分(示例):
- 有开头钩子:+25分
- 有分点结构:+25分
- 有干货内容:+25分
- 有互动引导:+25分
- 其他情况酌情给分
时效性评分(示例):
- 结合当前热点:80-100分
- 结合季节/节日:60-80分
- 常青内容:50-70分
- 过时内容:50分以下
内容质量评分(示例):
- 干货密度高:+25分
- 排版清晰易读:+25分
- 使用恰当Emoji:+25分
- 标签使用合理:+25分
- 其他情况酌情给分
Step 5: 输出前自检
在输出前,逐项检查输出格式的每一个字段是否完整:
- [ ] 评分结果:总分是否计算正确?
- [ ] 维度拆解:表格是否包含所有维度及得分说明?
- [ ] 改进建议:是否有针对性的优化建议?
- [ ] 参考爆款规律:是否简述提炼的爆款公式?
- [ ] 参考的爆款笔记:是否列出2-3篇核心参考笔记?
如有任何字段遗漏或不完整,必须补齐后再输出。
输出格式
评分原则:
- 客观公正,写的优秀不压分,能上90就上90
- 当用户提供的是数据库中查询到的爆款原文或基于爆款改写的文案,应评为优秀(90分以上)
输出开头说明:在输出最开头告知用户:
本次评分基于真实爆款数据分析,数据来源于全网每日持续收录的爆款笔记。
评级达到优秀(90分以上)时的输出格式:
本次评分基于近期真实爆款数据分析,爆款规律提炼自全网热门笔记。
### 评分结果
总分:XX/100
评级:优秀 - 文案质量极高,具备爆款潜力
### 维度拆解
| 维度 | 得分 | 说明 |
|------|------|------|
| 关键词覆盖 | XX | [具体说明:覆盖/缺少哪些热词] |
| 结构完整度 | XX | [具体说明:具备/缺少哪些要素] |
| 时效性 | XX | [具体说明:是否结合热点] |
| 内容质量 | XX | [具体说明:干货密度/排版等] |
**恭喜!您的文案已达到优秀标准,可以直接发布!**
### 亮点说明
[列出文案的2-3个亮点,如开头钩子设计巧妙、干货密度高、互动引导自然等]
### 参考的爆款笔记
!!!受小红书风控规则限制,部分作品链接可能无法正常跳转,您可复制对应作品标题前往小红书搜索查看,感谢理解🙇♀️🙇♀️
1. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
2. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
3. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X注意:评级达到优秀时,不再询问是否需要优化,直接结束。
评级未达到优秀(90分以下)时的输出格式:
本次评分基于近期真实爆款数据分析,爆款规律提炼自全网热门笔记。
### 评分结果
总分:XX/100
评级:良好/一般/需改进 - [对应说明:文案质量较好,有小幅优化空间 / 文案质量中等,有明显提升空间 / 文案存在较多问题,建议重新调整]
### 维度拆解
| 维度 | 得分 | 说明 |
|------|------|------|
| 关键词覆盖 | XX | [具体说明:覆盖/缺少哪些热词] |
| 结构完整度 | XX | [具体说明:具备/缺少哪些要素] |
| 时效性 | XX | [具体说明:是否结合热点] |
| 内容质量 | XX | [具体说明:干货密度/排版等] |
### 改进建议
1. [针对最低分维度的具体改进建议,仅针对文案正文]
2. [针对次低分维度的具体改进建议,仅针对文案正文]
3. [其他优化建议,仅针对文案正文]
**注意**:用户仅提供文案正文,改进建议仅针对正文内容,禁止出现标题优化相关建议。
### 参考爆款规律
[简述提炼的爆款公式,如"痛点开场 + 分点干货 + 互动收尾"]
### 参考的爆款笔记
!!!受小红书风控规则限制,部分作品链接可能无法正常跳转,您可复制对应作品标题前往小红书搜索查看,感谢理解🙇♀️🙇♀️
1. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
2. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
3. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X输出后询问用户(非强制,用户无需求则直接结束):
需要我帮你优化文案吗?
用户确认优化后执行:
优化输出
当用户确认需要优化时,先输出改法指导,再输出优化后的文案:
执行逻辑:
1. 定位问题维度:识别评分低于70的维度 2. 制定改法:针对问题维度给出具体改法指导 3. 精准修改:仅修改问题维度对应的文案部分 4. 保持原味:其他部分一字不改,保留用户原文风格
改法指导格式:
### 改法指导
1. [优化方向](如:开头钩子优化)
原句:[用户文案中的原句]
改法:[具体改法,如"在开头直接加入痛点:XXX"]
原因:[基于爆款数据的具体原因]
2. [优化方向]
原句:[用户文案中的原句]
改法:[具体改法]
原因:[基于爆款数据的具体原因]优化后文案输出: 改法指导输出完毕后,输出优化后的完整文案,使用小标题"### 优化后文案"作为提示,排版整齐清晰。
输出格式:
### 优化后文案
[完整的优化后文案内容]
**排版要求**:符合小红书风格,段落间空行,适当使用Emoji点缀,避免密密麻麻。修改原则:
- 只修改评分低于70的维度对应的文案内容,其他部分一个字不动
- 保留用户原文的用词习惯和语气风格,尤其是个人风格明显的文案(口语化、网络用语等)
- 优先保持原味,禁止用AI味表达替换用户原味表达(如把"绝绝子"改成"非常棒")
禁止事项:
- 禁止整篇重写
- 禁止改动评分≥70的维度相关内容
注意:用户不选择优化则直接结束,不强制输出优化内容。
---
输出格式要求:
- 总分计算方式:各维度得分的平均值(四舍五入取整)
- 维度说明需具体指出用户文案的优缺点
- 改进建议需针对性强、可操作性强
- 参考的爆款笔记需从脚本输出的数据中选取
禁止输出:
- 原始爆款数据表格
- 脚本执行命令
- 文件路径或下载链接
资源索引
- 脚本:见 scripts/fetch_xhs_trends.py(用途:获取小红书爆款数据;参数:关键词、数量限制、输出格式)
- 参考:见 references/xhs_trend_data_format.md(何时读取:需要了解数据字段格式时)
注意事项
- 评分必须基于查询到的真实爆款数据,禁止凭空评分
- 改进建议必须具体可操作,避免泛泛而谈
- 参考的爆款笔记必须是实际查询到的数据
- 若用户文案与关键词不匹配,需调整关键词重新查询
- 优化时必须精准修改,禁止整篇重写,禁止破坏用户原味表达
- 改法指导必须具体可执行,禁止"建议优化XX"等笼统表述
XHS Copywriting Score / xiaohongshu-note-analyzer
---
Introduction
Powered by 2000+ viral notes collected daily across the platform, this skill scores your Xiaohongshu (XHS) copywriting across multiple dimensions, delivers concrete improvement suggestions, and helps you boost content quality and traffic performance.
Core Value
- Real data foundation: Every score is grounded in live viral notes retrieved on demand — not rule-of-thumb judgment — so every conclusion is traceable.
- Four-dimension scoring: Keyword coverage, structural completeness, timeliness, and content quality are scored individually, pinpointing weak spots at a glance.
- Actionable improvement guidance: Only the underperforming sections are rewritten; your original voice and style stay intact.
Who It's For
- 📝 XHS Creators — Run a quick quality check before publishing to reduce the chance of low traffic.
- 🛍️ Brand / E-commerce Operators — Measure how well promotional copy aligns with current viral patterns.
- 🏢 MCN / Content Teams — Review content at scale and establish a quantifiable copywriting quality standard.
---
Features
Core Capabilities
- Keyword Coverage Analysis: Compares your copy against high-frequency words in viral notes from the same niche to identify missing traffic keywords.
- Structural Completeness Scoring: Checks for key viral elements — opening hook, bulleted tips, and engagement call-to-action.
- Timeliness Assessment: Evaluates whether the copy connects to recent trends, seasons, or holidays to enhance contextual relevance.
- Content Quality Evaluation: Measures readability through tip density, layout clarity, and emoji usage.
- Precision Optimization: Upon confirmation, only low-scoring sections are revised — high-scoring parts remain untouched to avoid full rewrites.
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis provided by RedFoxHub (https://redfox.hk).- Visit RedFoxHub to register and obtain your
REDFOX_API_KEY. - Configure the environment variable
REDFOX_API_KEYon your device before using this skill. - Before supplying a key, confirm its source, permitted scope, expiry, and whether it can be reset or revoked.
- Never hard-code or expose the key in plain text within code, prompts, logs, or output files.
---
Usage Guide
Just paste your XHS copy directly — no commands to memorize.
Quick Reference
| Intent | Example Phrase | Result |
|---|---|---|
| Evaluate copy quality | "Check how well this copy is written" | Four-dimension score with a detailed breakdown |
| Find specific problems | "What's wrong with this copy?" | Identifies low-scoring dimensions with actionable fixes |
| Gauge viral potential | "Can this copy go viral?" | Compares against same-niche viral patterns for an objective rating |
| Paste copy directly | Paste the body text | Auto-detects topic, extracts keywords, and starts scoring |
| Request optimization | "Help me improve it" | Outputs a rewrite guide + an improved version that keeps your original tone |
Output Example
After scoring, you will receive a report structured as follows:
Score: Total XX/100 with a rating (Excellent / Good / Average / Needs Work)
Dimension Breakdown: Individual scores and explanations for keyword coverage, structural completeness, timeliness, and content quality
Improvement Suggestions: Specific, actionable advice for underperforming dimensions (provided when rating is below Excellent)
Viral Formula Reference: A pattern distilled from real data, e.g. "Pain-point opener + bullet tips + engagement close"
Reference Viral Notes: 2–3 real viral notes used in this analysis, with engagement metrics and links
---
Use Cases
| Scenario | Role | Example Request | Benefit |
|---|---|---|---|
| Pre-publish check | Creator / Blogger | "Check this restaurant review copy before I post it" | Catch weaknesses before going live |
| Find improvement direction | Operator / Editor | "What's wrong with this copy and how do I fix it?" | Pinpoint issues with concrete, actionable fixes |
| Benchmark against viral notes | New creator | "Where does my copy fall short compared to viral posts?" | Understand the gap and build a viral copywriting intuition |
| Batch quality review | MCN / Content team | Submit copies one by one for review | Standardize quality benchmarks and improve team output |
小红书笔记优化助手 / xiaohongshu-note-analyzer
---
简介
基于全网每日持续收录的 2000+ 条爆款笔记数据,对你的小红书文案进行多维度评分,输出具体改进建议和优化方向,帮你提升文案质量与流量表现。
核心价值
- 真实数据背书:每次评分均基于实时查询到的爆款笔记,而非经验判断,结论有据可查。
- 四维精准评分:从关键词覆盖、结构完整度、时效性、内容质量四个维度逐一打分,定位短板一目了然。
- 可落地的改进建议:针对低分维度给出具体改法指导,仅改问题部分,保留你的原文风格与语气。
适用对象
- 📝 小红书博主 — 发布前快速自检文案质量,降低踩雷概率。
- 🛍️ 品牌 / 电商运营 — 评估推广文案与平台爆款规律的匹配度。
- 🏢 MCN / 内容策划 — 批量审核内容,建立可量化的文案质量标准。
---
功能特性
核心功能
- 关键词覆盖分析:对比同赛道爆款高频词,识别文案中缺失的流量词汇。
- 结构完整度评分:检测开头钩子、分点干货、互动引导等爆款结构要素是否到位。
- 时效性判断:评估文案是否结合近期热点、季节或节日,提升内容应景感。
- 内容质量评估:综合干货密度、排版清晰度、Emoji 使用等维度衡量可读性。
- 精准优化输出:用户确认后,只修改低分维度对应内容,一字不动高分部分,避免整篇重写。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk) 提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接把你的小红书文案正文发过来即可,无需记忆固定命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 评估文案质量 | 「帮我看看这篇文案写得怎么样」 | 基于爆款数据四维评分,输出总分与维度拆解 |
| 找出具体问题 | 「这篇文案有什么问题」 | 定位低分维度,给出可操作的改进建议 |
| 判断爆款潜力 | 「我的文案能火吗」 | 与同赛道爆款规律对比,给出客观评级 |
| 直接发文案 | 粘贴文案正文 | 自动识别主题,提取关键词后开始评分 |
| 确认优化 | 「帮我优化一下」 | 输出改法指导 + 保留原味的优化版文案 |
输出示例
评分完成后,你将收到类似以下结构的报告:
评分结果:总分 XX/100,评级(优秀 / 良好 / 一般 / 需改进)
维度拆解表:关键词覆盖、结构完整度、时效性、内容质量各维度得分及说明
改进建议:针对低分维度的具体可操作建议(仅在未达优秀时提供)
参考爆款规律:提炼自真实数据的爆款公式,如「痛点开场 + 分点干货 + 互动收尾」
参考的爆款笔记:2~3 篇本次分析所参考的真实爆款,附互动数据与链接
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 发布前自检 | 博主 / 创作者 | 「帮我看看这篇探店文案写得怎么样」 | 发布前发现短板,避免低流量 |
| 找改进方向 | 运营 / 编导 | 「这篇文案有什么问题,怎么改」 | 精准定位问题,获得可落地的改法 |
| 对标爆款 | 新手博主 | 「我的文案和爆款差在哪里」 | 了解差距,建立爆款文案认知 |
| 批量质检 | MCN / 内容团队 | 逐篇发送待审文案 | 统一评分标准,提升团队产出质量 |
小红书热门数据格式说明
概览
本文档定义了小红书热门数据查询脚本 fetch_xhs_trends.py 的输入输出格式规范。
输入格式
脚本参数
python scripts/fetch_xhs_trends.py --keyword <关键词> [选项]| 参数 | 必填 | 说明 | 默认值 |
|---|---|---|---|
--keyword | 是 | 搜索关键词(支持多个关键词,逗号分隔,最多5个,总长度不超过200字符) | - |
--start-date | 否 | 开始日期,格式 yyyy-MM-dd | 最近30天 |
--max-items | 否 | 每类内容最多展示数量 | 50 |
--output-format | 否 | 输出格式:text、json 或 markdown | markdown |
--debug | 否 | 调试模式,打印原始API响应 | False |
输出格式
四类爆款内容
脚本返回近30天的小红书热门数据,包含以下四类爆款内容:
| 内容类型 | 适用场景 |
|---|---|
| 新手友好爆款 | 适合模仿学习,发现低成本爆款 |
| 当日点赞爆款 | 了解当前最热门内容 |
| 爆发增长内容 | 发现快速增长的内容 |
| 持续增长内容 | 发现持续增长的内容 |
作品数据字段(完整)
每个作品包含以下字段:
作品基本信息
| 字段名 | 类型 | 说明 |
|---|---|---|
photoId | string | 作品ID(唯一标识) |
title | string | 作品标题 |
desc | string | 作品描述/正文 |
publicTime | string | 发布时间(格式:YYYY-MM-DD HH:MM:SS) |
作者信息
| 字段名 | 类型 | 说明 |
|---|---|---|
userId | string | 作者ID |
userName | string | 作者名称 |
userHeadUrl | string | 作者头像URL |
fans | int | 粉丝数 |
作者主页链接拼接规则:
https://www.xiaohongshu.com/user/profile/{userId}作品链接拼接规则:
https://www.xiaohongshu.com/explore/{photoId}互动数据(非增量类)
| 字段名 | 类型 | 说明 |
|---|---|---|
useLikeCount | int | 点赞数 |
collectedCount | int | 收藏数 |
useCommentCount | int | 评论数 |
useShareCount | int | 分享数 |
interactiveCount | int | 互动总数 |
互动数据(增量类)
增量类(单日增量、七日增量)的数据在 anaAdd 对象中:
| 字段名 | 类型 | 说明 |
|---|---|---|
anaAdd.addLikeCount | int | 新增点赞数 |
anaAdd.addCollectedCunt | int | 新增收藏数(注意:API字段名有拼写错误) |
anaAdd.addCommentCount | int | 新增评论数 |
anaAdd.addShareCount | int | 新增分享数 |
anaAdd.addInteractiveount | int | 新增互动总数(注意:API字段名有拼写错误) |
anaAdd.useLikeCount | int | 总点赞数 |
anaAdd.collectedCount | int | 总收藏数 |
anaAdd.useCommentCount | int | 总评论数 |
anaAdd.useShareCount | int | 总分享数 |
anaAdd.interactiveCount | int | 总互动数 |
anaAdd.pred_readnum | int | 预测阅读数 |
图片链接
| 字段名 | 类型 | 说明 |
|---|---|---|
coverUrl | string | 封面图URL |
thumbnail | string | 缩略图URL |
---
评分维度定义
基于爆款数据分析,提炼以下4个评分维度:
评分总原则:客观公正,不压分,好与坏差距拉开,优秀的能上90就上90。
1. 关键词覆盖(满分100分)
评分要点:是否包含领域高频热词
| 覆盖率 | 得分区间 | 说明 |
|---|---|---|
| 50%以上 | 80-100分 | 覆盖大部分爆款高频词 |
| 30%-50% | 60-80分 | 覆盖部分高频词 |
| 10%-30% | 40-60分 | 覆盖少量高频词 |
| 10%以下 | 40分以下 | 几乎未覆盖高频词 |
高频词来源:从爆款数据的 title 和 desc 字段中提取
2. 结构完整度(满分100分)
评分要点:内容结构是否符合爆款模式
| 结构要素 | 分值 | 说明 |
|---|---|---|
| 开头钩子 | +25分 | 前3行能吸引注意力(痛点共鸣/惊人数据/反差对比) |
| 分点结构 | +25分 | 内容分点清晰,易于阅读 |
| 干货内容 | +25分 | 提供有价值的信息或方法 |
| 互动引导 | +25分 | 结尾引导用户互动(评论/收藏/分享) |
3. 时效性(满分100分)
评分要点:是否结合当前热点
| 时效性等级 | 得分区间 | 说明 |
|---|---|---|
| 热点内容 | 90-100分 | 结合当前热门事件/话题 |
| 季节内容 | 80-90分 | 结合季节/节日/特定时段 |
| 常青内容 | 70-85分 | 长期有效的内容,无时效性 |
| 过时内容 | 60分以下 | 内容已过时或不再适用 |
评分原则:不压分,常青内容也给到70-85分的基础分,热点内容可达满分。
4. 内容质量(满分100分)
评分要点:内容的整体质量
| 质量要素 | 分值 | 说明 |
|---|---|---|
| 干货密度 | +25分 | 信息量充足,有实用价值 |
| 排版清晰 | +25分 | 分段合理,易于阅读 |
| Emoji使用 | +25分 | 适量使用(每段1-2个),不过度 |
| 标签合理 | +25分 | 标签与内容相关,数量适中 |
评分原则:优秀内容不压分,四项都达标即可达到90分以上;差距拉开,差的文案果断给低分。
---
JSON 输出示例
{
"keyword": "高考",
"low_fan_explosive": [
{
"photoId": "69aa603c0000000015021b18",
"title": "对于26高考女宝们的选大学建议",
"desc": "一定要选人文关怀好以及男女平等的大学...",
"publicTime": "2026-03-06 13:03:56",
"userId": "68ebaae60000000037006191",
"userName": "Alley",
"fans": 2,
"useLikeCount": 23439,
"collectedCount": 15610,
"useCommentCount": 846,
"useShareCount": 697,
"interactiveCount": 39895,
"coverUrl": "http://sns-img-hw.xhscdn.com/..."
}
],
"daily_like_top": [...],
"daily_increment": [...],
"weekly_increment": [...]
}#!/usr/bin/env python3
"""
小红书热门数据查询脚本
从环境变量 REDFOX_API_KEY 获取凭证,请求头新增 X-API-KEY
"""
import os
import sys
import argparse
import json
import requests
def fetch_xhs_trends(keyword: str, debug: bool = False, max_retries: int = 3, start_date: str = None):
"""
调用接口获取小红书热门数据
Args:
keyword: 搜索关键词(多个关键词用逗号分隔,最多5个,总长度不超过200)
debug: 是否打印调试信息
max_retries: 最大重试次数
start_date: 开始日期,格式 yyyy-MM-dd,最长为最近30天
Returns:
dict: 包含4类爆款数据
Raises:
Exception: 当API调用失败时抛出异常
"""
# 获取凭证
api_key = os.getenv("REDFOX_API_KEY")
if not api_key:
raise ValueError("缺少凭证配置,请配置环境变量 REDFOX_API_KEY")
# 接口地址
url = "https://redfox.hk/story/api/cozeSkill/getXhsCozeSkillData"
# 构建请求参数
params = {
"keyword": keyword,
"source": "小红书笔记创作-GitHub"
}
if start_date:
params["startDate"] = start_date
# 构建请求头
headers = {
"Content-Type": "application/json",
"X-API-KEY": api_key,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
}
last_error = None
for attempt in range(max_retries):
try:
if debug:
print(f"\n=== DEBUG: 第 {attempt + 1} 次尝试 ===", file=sys.stderr)
response = requests.get(url, params=params, headers=headers, timeout=30)
if debug:
print(f"状态码: {response.status_code}", file=sys.stderr)
print(f"响应长度: {len(response.text)} 字节", file=sys.stderr)
if response.status_code >= 400:
raise Exception(f"HTTP请求失败: 状态码 {response.status_code}, {response.text}")
data = response.json()
if "data" not in data:
error_msg = data.get("msg", "未知错误")
raise Exception(f"API 错误: {error_msg}")
result_data = data.get("data", {})
if debug:
print("=== DEBUG: API 返回的 data 字段键 ===", file=sys.stderr)
print(json.dumps(list(result_data.keys()), ensure_ascii=False, indent=2), file=sys.stderr)
return {
"keyword": keyword,
"low_fan_explosive": result_data.get("lowPowderExplosiveArticle", []),
"daily_like_top500": result_data.get("likeTheTop500", []),
"daily_increment": result_data.get("singleDayIncrements", []),
"weekly_increment": result_data.get("sevenDaysOfIncrements", [])
}
except requests.exceptions.RequestException as e:
last_error = f"请求失败: {str(e)}"
if debug:
print(f" 错误: {str(e)[:100]}", file=sys.stderr)
import time
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
except Exception as e:
last_error = str(e)
if debug:
print(f" 错误: {type(e).__name__}: {str(e)[:100]}", file=sys.stderr)
import time
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raise Exception(f"{last_error}(已尝试 {max_retries} 次)")
def format_output(data: dict, max_items: int = None):
"""
格式化输出热门数据(表格形式)
Args:
data: 原始数据
max_items: 每类爆款数据最多展示数量,None 表示展示所有数据
"""
def process_title(item):
"""处理标题:转义特殊字符,空标题使用desc替代,并添加作品链接"""
title = item.get('title', '')
# 如果标题为空,尝试使用 desc 字段
if not title or title.strip() == '':
desc = item.get('desc', '')
if desc:
# 移除 desc 中的换行符并截取前30个字符
title = desc.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(desc) > 30:
title = title + '...'
if not title or title.strip() == '':
title = '无标题'
# 转义 Markdown 表格特殊字符(|)
title = title.replace('|', '\\|')
# 移除换行符
title = title.replace('\n', ' ').replace('\r', ' ')
# 移除多余空格
title = ' '.join(title.split())
# 截断过长标题
if len(title) > 30:
title = title[:30] + "..."
# 添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
work_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title = f"[{title}]({work_link})"
return title
output = []
# 按 photoId 去重(API 返回数据可能有重复)
def dedup_items(items):
seen = set()
result = []
for item in items:
photo_id = item.get('photoId', '')
if photo_id and photo_id not in seen:
seen.add(photo_id)
result.append(item)
return result
# 检查是否有任何数据
low_fan_items = dedup_items(data.get("low_fan_explosive", []))
daily_like_items = dedup_items(data.get("daily_like_top500", []))
daily_increment_items = dedup_items(data.get("daily_increment", []))
weekly_increment_items = dedup_items(data.get("weekly_increment", []))
total_count = len(low_fan_items) + len(daily_like_items) + len(daily_increment_items) + len(weekly_increment_items)
# 如果所有类型都没有数据,输出友好提示
if total_count == 0:
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n**爆款总数**:{total_count} 条\n\n")
output.append("---\n\n")
output.append("## 暂无相关爆款数据\n\n")
output.append(f"很抱歉,当前关键词 **「{keyword}」** 尚未有足够的爆款笔记数据。\n\n")
output.append("### 可能原因\n\n")
output.append("- 该关键词相对小众或新兴,爆款内容积累较少\n")
output.append("- 近期该赛道热度较低,暂无突出爆款笔记\n")
output.append("- 关键词表述方式可以更加具体或热门\n\n")
output.append("### 建议操作\n\n")
output.append("- 更换为更热门的关键词,如:**\"早八穿搭\"**、**\"减脂餐\"**、**\"职场干货\"** 等\n")
output.append("- 尝试更细分的长尾关键词,如:**\"小个子穿搭\"**、**\"学生党便当\"** 等\n")
output.append("- 输入其他感兴趣的领域或赛道进行追踪\n\n")
output.append("---\n\n")
output.append("*数据来源:小红书爆款雷达,每日更新最新热门内容*\n")
return "\n".join(output)
# 1. 新手友好爆款
items = low_fan_items
if max_items is not None:
items = items[:max_items]
# 计算实际展示的总数
display_low_fan = items
display_daily_like = daily_like_items[:max_items] if max_items is not None else daily_like_items
display_daily_increment = daily_increment_items[:max_items] if max_items is not None else daily_increment_items
display_weekly_increment = weekly_increment_items[:max_items] if max_items is not None else weekly_increment_items
display_total = len(display_low_fan) + len(display_daily_like) + len(display_daily_increment) + len(display_weekly_increment)
# 输出标题和总数量
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n**爆款总数**:{display_total} 条\n\n---\n")
output.append(f"\n## 爆款笔记(共 {len(items)} 条)")
output.append(f"### - **新手友好爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | **互动总数** | 收藏 | 分享 | 评论 | 点赞 |")
output.append("|------|------|------|------------|------|------|------|------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
output.append(f"| {idx} | {title} | {author_str} | **{item.get('interactiveCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('useLikeCount', 0)} |")
# 2. 当日点赞爆款
items = daily_like_items[:max_items] if max_items is not None else daily_like_items
output.append(f"\n### - **当日点赞爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | **点赞** | 收藏 | 分享 | 评论 |")
output.append("|------|------|------|-------|------|------|------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
output.append(f"| {idx} | {title} | {author_str} | **{item.get('useLikeCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} |")
# 3. 当日增长爆款
items = daily_increment_items[:max_items] if max_items is not None else daily_increment_items
output.append(f"\n### - **当日增长爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **新增互动总量** |")
output.append("|------|------|------|------|------|------|------|---------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
ana_add = item.get('anaAdd', {})
add_interactive = ana_add.get('addInteractiveount', 0)
output.append(f"| {idx} | {title} | {author_str} | {ana_add.get('collectedCount', 0)} | {ana_add.get('addShareCount', 0)} | {ana_add.get('addCommentCount', 0)} | {ana_add.get('addLikeCount', 0)} | **{add_interactive}** |")
# 4. 持续增长爆款
items = weekly_increment_items[:max_items] if max_items is not None else weekly_increment_items
output.append(f"\n### - **持续增长爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **新增互动总量** |")
output.append("|------|------|------|------|------|------|------|---------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
ana_add = item.get('anaAdd', {})
add_interactive = ana_add.get('addInteractiveount', 0)
output.append(f"| {idx} | {title} | {author_str} | {ana_add.get('collectedCount', 0)} | {ana_add.get('addShareCount', 0)} | {ana_add.get('addCommentCount', 0)} | {ana_add.get('addLikeCount', 0)} | **{add_interactive}** |")
return "\n".join(output)
def main():
parser = argparse.ArgumentParser(description="获取小红书热门数据")
parser.add_argument("--keyword", required=True, help="搜索关键词")
parser.add_argument("--start-date", help="开始日期,格式 yyyy-MM-dd")
parser.add_argument("--max-items", type=int, default=50, help="每类内容最多展示数量")
parser.add_argument("--output-format", choices=["text", "json", "markdown"], default="markdown", help="输出格式")
parser.add_argument("--debug", action="store_true", help="调试模式")
args = parser.parse_args()
try:
data = fetch_xhs_trends(
keyword=args.keyword,
debug=args.debug,
start_date=args.start_date
)
if args.output_format == "json":
print(json.dumps(data, ensure_ascii=False, indent=2))
else:
output = format_output(data, max_items=args.max_items)
print(output)
except Exception as e:
print(f"错误: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()