
Xiaohongshu Title Score
- 237 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use xiaohongshu-title-score for development tasks
About
xiaohongshu-title-score: A skill for development. This provides functionality for development workflows.
- xiaohongshu-title-score
Xiaohongshu Title Score by the numbers
- 237 all-time installs (skills.sh)
- +17 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,595 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-title-scoreAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 237 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use xiaohongshu-title-score for development tasks
Files
小红书标题生成与评分
功能路由
根据用户意图选择执行路径:
- 创作新标题(如"帮我写标题"、"生成爆款标题"、"关于XX的标题")→ 执行功能一
- 评估已有标题(如"评分"、"打分"、"这个标题怎么样"、"评估标题")→ 执行功能二
无论执行哪个功能,用户输入的任何信息都基于此生成爆款标题或评估标题潜力。
全局规则
鉴权
获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置 API Key
REDFOX_API_KEY从环境变量获取,格式ak_xxxxxxxx- 若未设置,提示用户自行配置:
export REDFOX_API_KEY=<你的apikey>;若用户不会配置,Agent应主动帮用户设置: - macOS/Linux:将
export REDFOX_API_KEY=<值>追加到~/.zshrc(zsh)或~/.bashrc(bash),然后source对应文件使其全局生效 - Windows:使用
[Environment]::SetEnvironmentVariable("REDFOX_API_KEY", "<值>", "User")设置用户级永久环境变量(需重启终端生效) - 配置完成后应验证:
echo $REDFOX_API_KEY(macOS/Linux)或echo %REDFOX_API_KEY%(Windows),确保换一个skill也能读取到
用词规范
- 禁止:"爬取"、"抓取"
- 替代:使用"获取"
关键词精准匹配
- 用户输入的是什么产品,就只查询什么产品,不随意扩展到相关但不同的产品
- 理解产品具体形态边界:霜≠喷雾≠衣;膏≠液≠粉;液≠霜≠气垫;口红≠唇釉≠唇油
- 核心原则:用户输入的产品是什么形态/类型,就严格限定在该范围内
关键词类型判断
- 细分词/垂直赛道(含具体场景/属性修饰,如"职场穿搭"、"减脂餐")→ 直接查询
- 具体产品词(如"防晒霜"、"睫毛膏")→ 直接查询,不扩展到其他产品
- 泛化词/大分类(纯大类词无修饰,如"穿搭"、"美妆")→ 执行泛化词拓展策略
详细判断标准与示例见 references/guide.md
泛化词拓展策略
仅当关键词为泛化词时执行,细分词/具体产品词跳过此步直接查询。
1. 查询近7天网页资讯中与泛化词相关的小红书热点,生成10个细分方向(覆盖趋势词、人群词、场景词、意图词各2-3个,词的大小适中不加组合) 2. 输出推荐并停止执行,等待用户回复「拓展」或「不拓展」 3. 用户回复「拓展」→搜索10个细分词;回复「不拓展」/「继续」→搜索原关键词
数据查询规则
时间计算:先获取当前系统时间,再计算 startDate(格式 yyyy-MM-dd)
- 今天:startDate = 昨天
- 近N天:startDate = 今天 - N天
数据不足时自动扩展时间(禁止换词): 1. 近1天 → 近3天 → 近7天 → 近30天 2. 每次扩展后提示用户:"该关键词近X天数据不足5条,已自动扩展时间范围至近Y天" 3. 即使扩展到近30天仍不足5条,如实展示并提示数据不足
超出范围说明:
- 用户说"今天/今日":"非常抱歉,今天的数据暂未更新,已为您展示最近可用的数据"
- 时间超出30天:"非常抱歉,当前仅支持最近30天的数据,已为您展示最接近的数据"
执行命令:
python scripts/fetch_xhs_trends.py --keyword <关键词> --start-date <日期>- 多关键词用逗号分隔:
python scripts/fetch_xhs_trends.py --keyword "防晒霜,防晒喷雾" --start-date 2024-01-15 - 全站热门:
python scripts/fetch_xhs_trends.py --keyword "" --start-date <日期>
---
功能一:爆款标题生成
第一步:提取关键词
从用户输入中提取核心关键词,判断关键词类型(见全局规则),泛化词需先执行拓展策略。
第二步:查询数据
- 默认时间范围:近7天(startDate = 今天 - 7天)
- 执行数据查询命令(见全局规则)
- 读取生成的 Markdown 文件:
关键词_爆款数据.md - 必须向用户输出数据获取数量:从脚本执行的 stderr 输出中读取各类别数据条数,向用户汇报(如"共获取到爆款数据 XX 条,其中低粉爆款 XX 条、点赞最多 XX 条、单日互动 XX 条、7日增长 XX 条")
- 数据时间差说明(内部参考,不展示):互动数据截止为入库时间,非实时数据
第三步:生成爆款标题
必须先内部完成爆款标题分析,再生成标题,顺序不能颠倒。
1. [仅内部执行]分析爆款标题:从数据中提取所有标题,分析标题结构、关键词、情绪、目标人群、痛点、利益承诺。分析结果不展示给用户。 2. 生成10个新爆款标题(向用户展示):
- 基于分析规律创新创作,非直接采用参考爆款
- 标题字数控制在20字以内
- 推荐理由须详细说明:标题结构、关键词、目标人群、痛点、价值、平台适配性
- 匹配指数8-10之间,保留一位小数,同一指数最多重复2次
- 参考爆款须带链接:
[标题文字](https://www.xiaohongshu.com/explore/{photoId})
输出格式(必须严格遵守)
标题列表前必须输出数据说明:
⚠️数据说明:!!!受小红书风控规则限制,部分作品链接可能无法正常跳转,您可复制对应作品标题前往小红书搜索查看,感谢理解🙇♀️🙇♀️
每个标题格式:
**标题X:[标题内容]**
📈匹配指数:[8.0-10.0]
🔥参考的爆款:[标题1](https://www.xiaohongshu.com/explore/{photoId})(互动数:XXX)、[标题2](...)(互动数:YYY)
👍推荐理由:[详细推荐理由]
---格式校验:数据说明在标题列表前 | 标题行粗体+20字内 | 匹配指数一位小数8-10 | 参考爆款带链接+互动数 | 推荐理由详细 | 块间分隔线 | emoji一致(📈🔥👍) | 共10个标题
---
功能二:爆款标题评分
第一步:提取关键信息
识别两个核心要素: 1. 待评分标题:用户想要评估的标题 2. 主题关键词:用于查询爆款数据(用户未提供则从标题中提取)
第二步:查询数据
- 默认时间范围:近30天(startDate = 今天 - 30天),获取更全面的爆款规律
- 执行数据查询命令(见全局规则)
- 必须向用户输出数据获取数量:从脚本执行的 stderr 输出中读取各类别数据条数,向用户汇报(如"共获取到爆款数据 XX 条,其中低粉爆款 XX 条、点赞最多 XX 条、单日互动 XX 条、7日增长 XX 条")
第三步:评分(必须向用户输出)
先检查标题重合:用户标题与爆款标题完全一致(或仅标点/空格差异)→ 直接S级(9.5+分)
6维度加权评分:主题匹配度(15%)、结构合规度(20%)、利益清晰度(25%)、情绪唤醒度(20%)、稀缺性感知(15%)、合规安全性(5%)
等级:S级(9.0+)/A级(7.0-8.9)/B级(5.0-6.9)/C级(<5.0)
输出要求:评分结果必须完整输出给用户,包括综合得分、等级、6维度评分明细表,不得省略或仅内部参考。
评分标准、计算公式和输出格式模板见 references/guide.md
第四步:输出优化建议(必须向用户输出)
- S级:基于6维度爆款规律说明为什么好 + 3-5条同主题高赞标题及相似之处
- A/B/C级:核心问题清单 + 3-5条参考爆款标题(含可复用点)+ 2-3个修改版本(干货风/情绪风/猎奇风,标注适用场景和预期效果)
详细输出格式模板见 references/guide.md
---
使用示例
功能一:爆款标题生成
- 场景/输入:用户输入"防晒霜"
- 预期产出:查询防晒霜爆款数据 → 汇报获取数量(如"共获取爆款数据 35 条,其中低粉爆款 10 条...")→ 生成10个新爆款标题
- 关键要点:只查询防晒霜,不包含防晒喷雾、防晒衣等;必须输出数据获取数量
功能二:标题评分
- 场景/输入:用户输入"帮我评分'这款防晒霜真的绝了',关键词防晒霜"
- 预期产出:查询数据并汇报获取数量 → 评分报告(6维度加权得分+等级)→ 优化建议(核心问题+参考爆款+修改版本)
- 关键要点:基于防晒霜相关爆款数据评分,必须输出数据获取数量,优化建议有针对性
---
资源索引
- 数据查询脚本:scripts/fetch_xhs_trends.py(查询小红书爆款数据,参数:--keyword 关键词 --start-date 起始日期)
- 评分与关键词指南:references/guide.md(执行功能二时读取评分标准与输出模板;判断关键词类型时读取泛化词/具体词详细定义与示例)
Xiaohongshu Title Generator & Scorer / xiaohongshu-title-score
---
Overview
Based on continuously collected viral note data from across the platform, we analyze viral title patterns and generate 10 quality viral titles in one click; meanwhile, we score existing titles across six weighted dimensions, delivering grade ratings and optimization suggestions.
Core Value
- Generate + Score dual mode: Create new titles based on viral patterns or evaluate existing titles' viral potential—two capabilities covering the full content creation workflow.
- Data-driven creation: Based on real-time viral data rather than guesswork, each title comes with a match score and a reference viral link—grounded in evidence.
- Precision without drift: Whatever product you input, samples are aligned strictly to that direction, without expanding into unrelated categories.
Intended Users
- 📝 Xiaohongshu creators — Stop agonizing over titles; use data-driven patterns to improve click-through and exposure.
- 🛍️ Brand / e-commerce operators — Quickly produce multiple title options from product keywords, and score to pick the best version.
- 🏢 MCN / content planners — Batch proposals and title optimization in the same niche, building reusable title formulas.
---
Features
Core Capabilities
- Viral title generation: Enter a keyword, analyze real-time viral patterns first, then create 10 new titles—each with a match score, reference link, and recommendation reason.
- Viral title scoring: Enter an existing title and keyword, score across six weighted dimensions (topic relevance, structural compliance, benefit clarity, emotional arousal, scarcity perception, compliance safety), output a grade (S / A / B / C) with optimization suggestions.
- Keyword precision: Whatever product you enter, only that product form is queried, with strict form boundaries (cream ≠ spray ≠ clothing); broad category keywords first recommend sub-niches for you to confirm.
- Smart time strategy: When samples are insufficient, the query time range is automatically expanded (recent 1 → 3 → 7 → 30 days), without changing your core keyword.
Highlights
- Product form precision: Whatever product form you enter, it is strictly limited to that scope—no expansion into unrelated categories.
- Six-dimension scoring system: Topic relevance, structural compliance, benefit clarity, emotional arousal, scarcity perception, compliance safety—six dimensions fully quantify a title's viral potential.
- Dual-function mode: Generation and scoring in one tool—create new titles or evaluate existing ones, covering the full workflow from topic selection to publication.
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis issued by RedFoxHub (https://redfox.hk).- Register at RedFoxHub to obtain
REDFOX_API_KEY. - Configure
REDFOX_API_KEYon your device before using this skill. - Before providing your key, confirm its source, scope, validity period, and whether it can be reset or revoked.
- Do not hard-code or expose keys in plain text in code, prompts, logs, or output files.
---
Usage Guide
Simply describe your product, title, or evaluation need in natural language—no fixed commands to memorize.
Quick Reference
| Intent | Example phrase | Result |
|---|---|---|
| Titles for a product | "Help me write a few Xiaohongshu viral titles for sunscreen" | Align samples to keywords, analyze first, then deliver 10 options |
| Score an existing title | "Score 'This sunscreen is amazing,' keyword sunscreen" | Six-dimension weighted score + grade + optimization suggestions |
| Broad category first | "I want beauty titles but haven't picked a direction yet" | Recommend sub-niches first; you confirm before continuing |
Output Example
Title Generation
After analysis, you receive 10 titles, each formatted as follows:
Title 1: 7 days of fat-loss meals! Waistline really shrunk
📈 Match score: 9.4 🔥 Reference viral: Scrambled eggs with lettuce for a week, waistline shrunk! (engagement: 6815) 👍 Why it works: Uses a "time + result" dual promise structure, precisely hitting the "lose weight without hunger" core pain point.
---
(10 titles total, separated by dividers for easy copy and selection.)
Title Scoring
"This sunscreen is amazing" - Title Scoring Report
Grade A - 7.8/10
| Dimension | Score | Weight | Weighted Score |
|---|---|---|---|
| Topic relevance | 8 | 15% | 1.20 |
| Structural compliance | 7 | 20% | 1.40 |
| Benefit clarity | 8 | 25% | 2.00 |
| Emotional arousal | 9 | 20% | 1.80 |
| Scarcity perception | 6 | 15% | 0.90 |
| Compliance safety | 10 | 5% | 0.50 |
---
Use Cases
| Scenario | Role | Example question | Benefit |
|---|---|---|---|
| New product titles | E-commerce / brand | "New launch—write Xiaohongshu titles highlighting ingredients" | 10 publish-ready options quickly; higher click-through |
| Title evaluation | Creator / editor | "Score 'This fat-loss meal is so tasty'" | Quantify viral potential; get targeted optimization tips |
| Broad category trial | New creator | "I want beauty content but only know the broad category" | Sub-niche first, then generate—lower trial-and-error cost |
| Hot-trend adaptation | Content ops | "What titles are hot in the fat-loss niche? Help me adapt" | Turn trending patterns into titles matching your content |
---
小红书标题生成与评分 / xiaohongshu-title-score
---
简介
基于全网持续收录的爆款笔记数据,拆解爆款标题逻辑,一键生成 10 个优质爆款标题;同时对已有标题从六大维度加权评分,输出等级评定与优化建议。
核心价值
- 生成 + 评分双模式:既能基于爆款规律创作新标题,也能评估已有标题的爆款潜力,两种能力覆盖内容创作全流程。
- 数据驱动创作:基于实时爆款数据而非凭空想象,每条标题附带匹配指数与可参考的爆款链接,有据可依。
- 精准不跑偏:输入什么产品就只围绕该方向对齐样本,不擅自扩展到无关品类。
适用对象
- 📝 小红书博主 — 告别标题纠结,用爆款规律提升点击率与曝光。
- 🛍️ 品牌 / 电商运营 — 按产品词快速产出多组备选标题,还能评分筛选最优版本。
- 🏢 MCN / 内容策划 — 同赛道批量提案与标题优化,沉淀可复用的标题套路。
---
功能特性
核心功能
- 爆款标题生成:输入关键词,基于实时爆款数据先分析规律、再创作 10 条新标题,每条附带匹配指数、参考链接与推荐理由。
- 爆款标题评分:输入已有标题与关键词,从主题匹配度、结构合规度、利益清晰度、情绪唤醒度、稀缺性感知、合规安全性六大维度加权评分,输出等级(S / A / B / C)与优化建议。
- 关键词精准匹配:输入什么产品就只查询什么产品,严格限定形态边界(霜 ≠ 喷雾 ≠ 衣);泛化词会先推荐细分方向供你确认。
- 智能时间策略:样本不足时自动扩大时间范围(近 1 → 3 → 7 → 30 天),不擅自更换你的核心关键词。
特色亮点
- 产品形态精准:你输入什么形态的产品,就严格限定在该范围内,不擅自扩展到其他品类。
- 六维度评分体系:主题匹配度、结构合规度、利益清晰度、情绪唤醒度、稀缺性感知、合规安全性——六大维度全面量化标题的爆款潜力。
- 双功能模式:生成与评分一体化,既可创作新标题,也可评估已有标题,覆盖从选题到发布的完整流程。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言说出你的产品、标题或评估需求即可,无需记忆固定命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 为单品起标题 | 「帮我给防晒霜写几个小红书爆款标题」 | 按关键词对齐爆款样本,先分析再出 10 条备选 |
| 评估已有标题 | 「帮我评分'这款防晒霜真的绝了',关键词防晒霜」 | 六维度加权评分 + 等级 + 优化建议 |
| 大类先细分 | 「想做美妆方向的标题,方向还没定」 | 先推荐细分方向,你确认后再继续 |
输出示例
标题生成
完成分析后,你将收到 10 条标题,每条格式如下:
标题1:连吃7天减脂餐!腰围真的小了一圈
📈 匹配指数:9.4 🔥 参考的爆款:生菜拌鸡蛋狂吃一周,腰围小一圈!(互动数:6815) 👍 推荐理由:采用"时间 + 效果"双承诺结构,精准踩中减脂人群"不饿也能瘦"的核心痛点。
---
(共 10 条,条与条之间以分隔线区分,便于复制选用。)
标题评分
这款防晒霜真的绝了-标题评分报告
A级 - 7.8分(满分10分)
| 维度 | 得分 | 权重 | 加权得分 |
|---|---|---|---|
| 主题匹配度 | 8分 | 15% | 1.20分 |
| 结构合规度 | 7分 | 20% | 1.40分 |
| 利益清晰度 | 8分 | 25% | 2.00分 |
| 情绪唤醒度 | 9分 | 20% | 1.80分 |
| 稀缺性感知 | 6分 | 15% | 0.90分 |
| 合规安全性 | 10分 | 5% | 0.50分 |
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 新品起标题 | 电商 / 品牌运营 | 「新品上市,帮我写小红书标题,突出成分和功效」 | 快速得到 10 组可发布备选,提升点击率 |
| 标题效果评估 | 博主 / 编导 | 「帮我评分'减脂餐太好吃了吧'」 | 量化标题爆款潜力,获得针对性优化建议 |
| 大类试水 | 新手创作者 | 「想做美妆内容,但只知道大类」 | 先细分方向再生成,降低盲目试错成本 |
| 追热点改编 | 内容运营 | 「最近减脂赛道什么标题火?帮我改几条」 | 基于热门规律快速产出适配标题 |
---
关键词判断与评分详细指南
目录
1. 关键词类型判断 2. 泛化词拓展策略 3. 评分维度与权重 4. 综合得分计算 5. 标题重合判定规则 6. 输出格式模板 7. 爆款规律提炼规则
关键词类型判断
细分词/垂直赛道
含具体场景/属性修饰的词,可直接查询数据,无需拓展询问。
示例:"职场穿搭"、"减脂餐"、"小个子穿搭"、"学生党便当"、"早八穿搭"
具体产品词
指向明确产品的词,直接查询该产品数据,不扩展到其他相关产品。
产品形态边界判断:
- 霜≠喷雾≠衣≠帽≠伞:用户输入"防晒霜"→只查询防晒霜(膏状/乳状),不包含防晒喷雾、防晒衣、防晒帽
- 膏≠液≠粉≠笔:用户输入"睫毛膏"→只查询睫毛膏(膏状),不包含假睫毛、睫毛增长液
- 液≠霜≠膏≠气垫:用户输入"粉底液"→只查询粉底液(液体状),不包含气垫、BB霜、粉底膏
- 膏/棒≠釉≠彩≠油:用户输入"口红"→只查询口红(膏状/棒状),不包含唇釉、唇彩、唇油
- 跑鞋≠运动鞋≠休闲鞋:用户输入"跑鞋"→只查询专门用于跑步的鞋
核心原则:用户输入的产品是什么形态/类型,就严格限定在该产品形态/类型范围内。
泛化词/大分类
纯大类词,无任何修饰,须执行泛化词拓展策略。
特征:
- 语义上为上位概念(如"美妆"包含"粉底液/口红";"运动"包含"跑步/瑜伽")
- 上下文中常搭配"领域""类型"等概括词(如"美妆领域""运动类型")
- 覆盖范围广,可包含多个子类
常见泛化词示例:美妆、穿搭、美食、运动、护肤、旅行、家居、健身、摄影、AI
泛化词拓展策略
仅当关键词为泛化词时执行。
流程
1. 查询近7天网页资讯中与泛化词相关的小红书热点(禁止调用脚本搜索数据) 2. 生成10个细分方向,原则:
- 词的大小适中,避免过细,不加组合
- 参考热门话题,选择热度较高的方向
- 覆盖不同场景:趋势词、人群词、场景词、意图词各2-3个
3. 输出推荐并停止执行,等待用户回复 4. 用户回复「拓展」→搜索10个细分词;回复「不拓展」/「继续」→搜索原关键词
输出示例
我识别到「美妆」是较大的分类,已查询近期热门趋势,推荐以下细分方向:
柔焦底妆、养肤妆、亚裔妆、油皮定妆、通勤妆、夏日妆容、新手妆容、平价彩妆、妆容教程、彩妆测评
回复「拓展」将同时搜索这10个词,回复「不拓展」将继续搜索「美妆」评分维度与权重
总分10分,按维度加权计算,对应等级:
| 等级 | 分数范围 | 说明 |
|---|---|---|
| S级 | 9.0+分 | 流量潜力Top10%,符合爆款所有关键要素 |
| A级 | 7.0-8.9分 | 符合爆款基础要求,有不错的流量潜力 |
| B级 | 5.0-6.9分 | 有一些缺陷,建议针对性优化 |
| C级 | 5.0分以下 | 建议重写,多维度不符合爆款规律 |
评分维度明细:
| 评分维度 | 权重 | 打分标准 |
|---|---|---|
| 主题匹配度 | 15% | 10分:踩中同赛道热点关键词,符合近期流量趋势;<7分:无热点、主题过时 |
| 结构合规度 | 20% | 10分:符合同赛道爆款主流结构(有钩子+有利益);<5分:平铺直叙无钩子 |
| 利益清晰度 | 25% | 10分:明确标注具体收益/时效/成本,无模糊表述;<5分:用户看不到明确价值 |
| 情绪唤醒度 | 20% | 10分:有明确的情绪钩子(好奇/焦虑/爽点/惊喜);<5分:平淡无情绪波动 |
| 稀缺性感知 | 15% | 10分:有差异化/独家性表述;<5分:同质化严重,和同类标题没有区别 |
| 合规安全性 | 5% | 10分:无违规/限流词;0分:存在明确违规内容,建议直接修改 |
综合得分计算
综合得分 = 主题匹配度 x 0.15 + 结构合规度 x 0.20 + 利益清晰度 x 0.25 + 情绪唤醒度 x 0.20 + 稀缺性感知 x 0.15 + 合规安全性 x 0.05
标题重合判定规则
评分前必须先检查用户输入的标题与查询到的爆款标题是否存在重合:
- 重合判定标准:用户标题与爆款标题完全一致,或仅存在标点符号、空格差异
- 若存在重合:
- 直接给予S级评分(9.5分以上)
- 输出格式中标注"该标题与爆款标题重合"
- 跳过常规评分流程,直接进入S级输出格式
- 在爆款分析中说明"该标题已被市场验证为爆款"
输出格式模板
评分报告通用格式
## [用户输入的标题]-标题评分报告
**数据说明**:查询到相关小红书爆款标题[X]个,已据此总结相关爆款规律,以下是对您标题的评分。
### 综合得分
**[S/A/B/C]级**-**[X.X]分**(满分10分)
[该等级的具体说明]
### 各维度评分
| 维度 | 得分 | 权重 | 加权得分 |
|------|------|------|----------|
| 主题匹配度 | [X]分 | 15% | [X.X]分 |
| 结构合规度 | [X]分 | 20% | [X.X]分 |
| 利益清晰度 | [X]分 | 25% | [X.X]分 |
| 情绪唤醒度 | [X]分 | 20% | [X.X]分 |
| 稀缺性感知 | [X]分 | 15% | [X.X]分 |
| 合规安全性 | [X]分 | 5% | [X.X]分 |S级输出格式
## 爆款分析
**[若标题与爆款重合,输出:该标题与爆款标题重合,已被市场验证为爆款!]**
**[若标题不重合,输出:这个标题非常优秀,完美踩中了爆款规律!]**
### 爆款亮点
- **主题匹配度**:[基于实际爆款规律说明为什么好]
- **结构合规度**:[基于实际爆款规律说明为什么好]
- **利益清晰度**:[基于实际爆款规律说明为什么好]
- **情绪唤醒度**:[基于实际爆款规律说明为什么好]
- **稀缺性感知**:[基于实际爆款规律说明为什么好]
- **合规安全性**:[基于实际爆款规律说明为什么好]
### 参考爆款标题
1. [参考标题1](https://www.xiaohongshu.com/explore/{photoId})(作者:[作者名](https://www.xiaohongshu.com/user/profile/{userId}),互动数:XXX)
- [若重合:完全一致] [若不重合:相似之处:说明与用户标题的相似点]
2. [参考标题2](https://www.xiaohongshu.com/explore/{photoId})(作者:[作者名](https://www.xiaohongshu.com/user/profile/{userId}),互动数:YYY)
- 相似之处:[说明与用户标题的相似点]
3-5. [同理至5条]A/B/C级输出格式
## 优化建议
### 核心问题
1. [问题1]
2. [问题2]
3. [问题3]
### 参考爆款标题
1. [参考标题1](https://www.xiaohongshu.com/explore/{photoId})(作者:[作者名](https://www.xiaohongshu.com/user/profile/{userId}),互动数:XXX)
- 可复用点:[结构特点/用词技巧/利益表达]
2. [参考标题2](...同理至5条)
### 修改版本建议
**版本1:干货风**
- 修改后标题:[新标题]
- 适用场景:[适合的内容类型/人群]
- 预期效果:[基于爆款规律的预期表现]
**版本2:情绪风**
- 修改后标题:[新标题]
- 适用场景:[适合的内容类型/人群]
- 预期效果:[基于爆款规律的预期表现]
**版本3:猎奇风**(可选)
- 修改后标题:[新标题]
- 适用场景:[适合的内容类型/人群]
- 预期效果:[基于爆款规律的预期表现]爆款规律提炼规则
所有统计数据必须基于实际召回的爆款数据计算,严禁虚构任何百分比、比例或数值。
规律维度与评分维度一一对应:
1. 主题匹配度规律:提取爆款中热点关键词,统计高频主题词及出现频率(如"防晒(80%,8/10)") 2. 结构合规度规律:统计爆款标题主流结构占比(数字开头、疑问句式、感叹句式等),计算平均字数 3. 利益清晰度规律:统计爆款标题中明确标注的具体收益类型(时效性、成本、效果等) 4. 情绪唤醒度规律:统计爆款标题中的情绪钩子类型(好奇、焦虑、爽点、惊喜等) 5. 稀缺性感知规律:分析爆款标题中的差异化/限定性表述使用情况 6. 合规安全性规律:检查爆款标题是否存在违规/限流词,统计合规标题占比
数据计算要求:
- 所有占比数据必须标注分母(如"8/10")
- 必须基于实际召回的爆款标题进行计算
- 若召回数据少于5条,需说明"数据样本较少,规律仅供参考"
- 召回数据为空时,需说明"暂无相关爆款数据,无法提炼规律"
#!/usr/bin/env python3
"""
小红书热门数据查询脚本
- 接口地址:https://redfox.hk/story/api/cozeSkill/getXhsCozeSkillData
- 认证方式:X-API-KEY(通过环境变量 REDFOX_API_KEY 获取)
"""
import os
import sys
import re
import argparse
import json
import time
import platform
import subprocess
from datetime import datetime
import requests
# ========== API Key 获取逻辑 ==========
def get_api_key():
"""获取 API Key,优先从环境变量,其次从 shell 配置文件,仍未获取则提示用户配置"""
# 1. 从当前环境变量获取
api_key = os.getenv("REDFOX_API_KEY")
if api_key:
return api_key
# 2. 从 shell 配置文件中读取
system = platform.system()
if system == "Windows":
# Windows: 尝试通过 PowerShell 获取用户级永久环境变量
try:
result = subprocess.run(
['powershell', '-NoProfile', '-Command',
'[Environment]::GetEnvironmentVariable("REDFOX_API_KEY", "User")'],
capture_output=True, text=True, timeout=5
)
if result.returncode == 0 and result.stdout.strip():
api_key = result.stdout.strip()
if api_key:
return api_key
except Exception:
pass
else:
# macOS/Linux: 从 ~/.zshrc, ~/.bashrc, ~/.bash_profile 读取
home = os.path.expanduser("~")
shell_configs = [
os.path.join(home, '.zshrc'),
os.path.join(home, '.bashrc'),
os.path.join(home, '.bash_profile'),
]
for config_file in shell_configs:
if os.path.exists(config_file):
try:
with open(config_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
# 匹配: export REDFOX_API_KEY="value" 或 export REDFOX_API_KEY=value
match = re.search(
r'export\s+REDFOX_API_KEY\s*=\s*["\']?([^"\'\s]+)["\']?',
line
)
if match:
api_key = match.group(1)
if api_key:
return api_key
except Exception:
pass
# 3. 未获取到,提示用户配置
system = platform.system()
if system == "Windows":
hint = (
"缺少 API Key 配置,请设置环境变量 REDFOX_API_KEY。\n"
"Windows 设置方式:\n"
" PowerShell 永久设置:[Environment]::SetEnvironmentVariable('REDFOX_API_KEY', '<你的apikey>', 'User')\n"
" CMD 永久设置:setx REDFOX_API_KEY <你的apikey>\n"
"设置后需重启终端生效。\n"
"获取 API Key: 访问 https://redfox.hk 注册账号,在个人中心获取"
)
else:
hint = (
"缺少 API Key 配置,请设置环境变量 REDFOX_API_KEY。\n"
"macOS/Linux 设置方式:\n"
" 在 ~/.zshrc(zsh)或 ~/.bashrc(bash)中添加:\n"
" export REDFOX_API_KEY=<你的apikey>\n"
" 然后 source ~/.zshrc 或 source ~/.bashrc 使其生效\n"
"获取 API Key: 访问 https://redfox.hk 注册账号,在个人中心获取"
)
raise ValueError(hint)
# ========== 业务逻辑 ==========
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类爆款数据
"""
api_key = get_api_key()
url = "https://redfox.hk/story/api/cozeSkill/getXhsCozeSkillData"
params = {"keyword": keyword, "source": "小红书标题生成与评分-GitHub"}
if start_date:
params["startDate"] = start_date
headers = {
"X-API-KEY": api_key,
"Content-Type": "application/json",
}
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=60)
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[:200]}")
data = response.json()
if "data" not in data:
raise Exception(f"API 错误: {data.get('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)}"
except Exception as e:
last_error = str(e)
if debug:
print(f" 错误: {last_error[:100]}", file=sys.stderr)
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
raise Exception(f"{last_error}(已尝试 {max_retries} 次)")
# ========== 格式化输出 ==========
# 四类数据的配置
CATEGORY_CONFIG = [
('low_fan_explosive', '低粉高赞', '粉丝<5000的博主中点赞最多的内容', 'standard'),
('daily_like_top500', '点赞最多', '统计时间内点赞数最多的内容', 'like_highlight'),
('daily_increment', '单日互动爆发', '当天互动量增长最多的内容', 'ana_add'),
('weekly_increment', '7日持续增长', '近7天互动量持续增长最多的内容', 'ana_add'),
]
def process_title(item):
"""处理标题:空标题用desc替代,转义特殊字符,截断过长标题"""
title = item.get('title', '')
if not title or not title.strip():
desc = item.get('desc', '')
if desc:
title = desc.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(desc) > 30:
title += '...'
if not title or not title.strip():
title = '无标题'
title = title.replace('|', '\\|').replace('\n', ' ').replace('\r', ' ')
title = ' '.join(title.split())
if len(title) > 30:
title = title[:30] + "..."
return title
def format_time(item):
"""格式化发布时间为 X月X日"""
pub_time = item.get('publicTime', '')
if pub_time:
try:
return f"{int(pub_time[5:7])}月{int(pub_time[8:10])}日"
except (ValueError, IndexError):
pass
return '--'
def format_author(item):
"""生成作者信息(含主页链接)"""
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
return f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
return f"{user_name}(粉丝:{fans})"
def format_title_with_link(item):
"""生成带作品链接的标题"""
title = process_title(item)
photo_id = item.get('photoId', '')
if photo_id:
return f"[{title}](https://www.xiaohongshu.com/explore/{photo_id})"
return title
def get_ana_add_stats(item):
"""从 anaAdd 对象获取新增互动数据"""
ana_add = item.get('anaAdd', {})
if ana_add:
return (
ana_add.get('addCollectedCunt', 0),
ana_add.get('addShareCount', 0),
ana_add.get('addCommentCount', 0),
ana_add.get('addLikeCount', 0),
ana_add.get('addInteractiveount', 0),
)
return (0, 0, 0, 0, 0)
def dedup_items(items):
"""按 photoId 去重"""
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
def sort_by_time_desc(items):
"""按发布时间倒序排列"""
return sorted(items, key=lambda x: x.get('publicTime', '') or '0', reverse=True)
def render_category_table(items, layout_type):
"""渲染单个类别的 Markdown 表格行"""
rows = []
for idx, item in enumerate(items, 1):
pub_time = format_time(item)
title_with_link = format_title_with_link(item)
author_str = format_author(item)
if layout_type == 'standard':
rows.append(
f"| {idx} | {pub_time} | {title_with_link} | {author_str} "
f"| {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} "
f"| {item.get('useCommentCount', 0)} | {item.get('useLikeCount', 0)} "
f"| **{item.get('interactiveCount', 0)}** |"
)
elif layout_type == 'like_highlight':
rows.append(
f"| {idx} | {pub_time} | {title_with_link} | {author_str} "
f"| **{item.get('useLikeCount', 0)}** | {item.get('collectedCount', 0)} "
f"| {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} "
f"| {item.get('interactiveCount', 0)} |"
)
elif layout_type == 'ana_add':
collected, share, comment, like, total = get_ana_add_stats(item)
rows.append(
f"| {idx} | {pub_time} | {title_with_link} | {author_str} "
f"| {collected} | {share} | {comment} | {like} | **{total}** |"
)
return rows
CATEGORY_HEADERS = {
'standard': (
"| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **互动总数** |",
"|------|----------|------|------|------|------|------|------|-------------|"
),
'like_highlight': (
"| 序号 | 发布时间 | 标题 | 作者 | **点赞** | 收藏 | 分享 | 评论 | 互动总数 |",
"|------|----------|------|------|--------|------|------|------|------------|"
),
'ana_add': (
"| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |",
"|------|----------|------|------|------|------|------|------|------------|"
),
}
def format_output(data: dict, max_items: int = None, start_date: str = None):
"""格式化输出热门数据(Markdown 表格)"""
# 计算统计时间范围
time_range = "近30天"
if start_date:
try:
days = (datetime.now() - datetime.strptime(start_date, '%Y-%m-%d')).days
time_range = f"近{days}天" if days > 1 else "近1天"
except ValueError:
pass
# 去重 + 检查数据总量
deduped = {}
total_count = 0
for key, _, _, _ in CATEGORY_CONFIG:
items = dedup_items(data.get(key, []))
deduped[key] = items
total_count += len(items)
output = []
# 无数据时输出友好提示
if total_count == 0:
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n---\n\n")
output.append(f"## 暂无相关爆款数据\n\n很抱歉,当前关键词 **「{keyword}」** 尚未有足够的爆款笔记数据。\n\n")
output.append("### 可能原因\n\n- 该关键词相对小众或新兴,爆款内容积累较少\n")
output.append("- 近期该赛道热度较低,暂无突出爆款笔记\n- 关键词表述方式可以更加具体或热门\n\n")
output.append("### 建议操作\n\n- 更换为更热门的关键词,如:**\"早八穿搭\"**、**\"减脂餐\"**、**\"职场干货\"** 等\n")
output.append("- 尝试更细分的长尾关键词,如:**\"小个子穿搭\"**、**\"学生党便当\"** 等\n\n")
output.append("---\n\n*数据来源:小红书爆款雷达,每日更新最新热门内容*\n")
return "\n".join(output)
# 按类别渲染表格
for key, name, desc, layout_type in CATEGORY_CONFIG:
items = sort_by_time_desc(deduped[key])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **{name}**({desc})\n")
if not items:
output.append("(无数据)\n")
else:
header, separator = CATEGORY_HEADERS[layout_type]
output.append(header)
output.append(separator)
output.extend(render_category_table(items, layout_type))
return "\n".join(output)
# ========== 入口 ==========
def main():
parser = argparse.ArgumentParser(description='小红书热门数据查询工具')
parser.add_argument('--keyword', required=True, help='搜索关键词')
parser.add_argument('--max-items', type=int, default=10, help='每类爆款内容最多展示数量(默认10条)')
parser.add_argument('--output-format', choices=['text', 'json', 'markdown'], default='markdown',
help='输出格式:text/json/markdown(默认markdown)')
parser.add_argument('--output-file', type=str, default=None, help='输出文件路径(默认:关键词_爆款数据.md)')
parser.add_argument('--start-date', type=str, default=None, help='开始日期,格式 yyyy-MM-dd')
parser.add_argument('--debug', action='store_true', help='启用调试模式')
parser.add_argument('--max-retries', type=int, default=3, help='最大重试次数(默认3次)')
args = parser.parse_args()
try:
data = fetch_xhs_trends(args.keyword, debug=args.debug, max_retries=args.max_retries,
start_date=args.start_date)
if args.output_format == 'json':
output_content = json.dumps(data, ensure_ascii=False, indent=2)
elif args.output_format == 'markdown':
markdown_header = f"# 小红书爆款数据分析报告\n\n**关键词**:{args.keyword}\n\n"
output_content = markdown_header + format_output(data, max_items=args.max_items,
start_date=args.start_date)
else:
output_content = format_output(data, max_items=args.max_items, start_date=args.start_date)
output_file = args.output_file
if output_file is None and args.output_format == 'markdown':
output_file = f"{args.keyword}_爆款数据.md"
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(output_content)
total_items = sum(len(data.get(k, [])) for k, _, _, _ in CATEGORY_CONFIG)
print(f"✓ 结果已保存到: {output_file}", file=sys.stderr)
print(f"✓ 关键词: {args.keyword} | 总计: {total_items} 条数据", file=sys.stderr)
for key, name, _, _ in CATEGORY_CONFIG:
print(f" - {name}: {len(data.get(key, []))} 条", file=sys.stderr)
else:
print(output_content)
except Exception as e:
print(f"❌ 错误: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()