From 35a8a4c3a242707253d6139bd373de0463b4e210 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Sun, 19 Apr 2026 16:15:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=BF=90=E8=90=A5?= =?UTF-8?q?=E6=8A=80=E5=B7=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/xiaohongshu-note-analyzer/SKILL.md | 190 --------- .../references/analysis-examples.md | 229 ----------- .../references/keyword-strategy.md | 170 -------- .../references/sensitive-words.md | 113 ------ .../references/title-formulas.md | 142 ------- .agents/skills/xiaohongshu/LICENSE | 25 -- .agents/skills/xiaohongshu/README.md | 315 --------------- .agents/skills/xiaohongshu/README_CN.md | 373 ------------------ .agents/skills/xiaohongshu/SKILL.md | 202 ---------- .agents/skills/xiaohongshu/scripts/comment.sh | 16 - .../skills/xiaohongshu/scripts/cookies.json | 1 - .../xiaohongshu/scripts/export-long-image.py | 260 ------------ .../xiaohongshu/scripts/export-long-image.sh | 20 - .../xiaohongshu/scripts/install-check.sh | 67 ---- .agents/skills/xiaohongshu/scripts/login.sh | 10 - .../skills/xiaohongshu/scripts/mcp-call.sh | 82 ---- .../skills/xiaohongshu/scripts/post-detail.sh | 17 - .../skills/xiaohongshu/scripts/recommend.sh | 5 - .agents/skills/xiaohongshu/scripts/search.sh | 13 - .../skills/xiaohongshu/scripts/start-mcp.sh | 166 -------- .agents/skills/xiaohongshu/scripts/status.sh | 5 - .../skills/xiaohongshu/scripts/stop-mcp.sh | 29 -- .../skills/xiaohongshu/scripts/track-topic.py | 313 --------------- .../skills/xiaohongshu/scripts/track-topic.sh | 5 - .../xiaohongshu/scripts/user-profile.sh | 17 - .../tools/xhs-downloader/README.md | 98 ----- .../tools/xhs-downloader/batch_download.py | 48 --- .../tools/xhs-downloader/export_memory.py | 67 ---- .../xhs-downloader/export_to_workspace.py | 101 ----- .claude/skills/post-to-xhs/SKILL.md | 86 ++++ .claude/skills/setup-xhs-mcp/SKILL.md | 143 +++++++ .claude/skills/xhs-content-creator/SKILL.md | 212 ---------- .claude/skills/xhs-content-plan/SKILL.md | 41 ++ .claude/skills/xhs-explore/SKILL.md | 44 +++ .claude/skills/xhs-interact/SKILL.md | 70 ++++ .claude/skills/xhs-login/SKILL.md | 55 +++ .claude/skills/xhs-profile/SKILL.md | 29 ++ .claude/skills/xhs-search/SKILL.md | 44 +++ .claude/skills/xiaohongshu | 1 - .claude/skills/xiaohongshu-note-analyzer | 1 - .obsidian/graph.json | 2 +- .obsidian/workspace.json | 25 +- skills/xiaohongshu | 1 - skills/xiaohongshu-note-analyzer | 1 - wiki/entities/and-her-pilates.md | 51 +++ wiki/entities/放羊的杨.md | 53 +++ wiki/ideas/品牌介绍帖-focus-core.md | 147 +++++++ wiki/meta/index.md | 7 +- wiki/meta/log.md | 18 +- wiki/raw/xhs-产后恢复引流帖-v2.md | 135 +++++++ wiki/raw/普拉提引流调研报告.md | 168 ++++++++ wiki/sources/xhs-普拉提私教-竞品爆款分析.md | 101 +++++ wiki/topics/普拉提一人一馆-内容矩阵策划.md | 95 +++++ 53 files changed, 1304 insertions(+), 3325 deletions(-) delete mode 100644 .agents/skills/xiaohongshu-note-analyzer/SKILL.md delete mode 100644 .agents/skills/xiaohongshu-note-analyzer/references/analysis-examples.md delete mode 100644 .agents/skills/xiaohongshu-note-analyzer/references/keyword-strategy.md delete mode 100644 .agents/skills/xiaohongshu-note-analyzer/references/sensitive-words.md delete mode 100644 .agents/skills/xiaohongshu-note-analyzer/references/title-formulas.md delete mode 100644 .agents/skills/xiaohongshu/LICENSE delete mode 100644 .agents/skills/xiaohongshu/README.md delete mode 100644 .agents/skills/xiaohongshu/README_CN.md delete mode 100644 .agents/skills/xiaohongshu/SKILL.md delete mode 100755 .agents/skills/xiaohongshu/scripts/comment.sh delete mode 100644 .agents/skills/xiaohongshu/scripts/cookies.json delete mode 100644 .agents/skills/xiaohongshu/scripts/export-long-image.py delete mode 100755 .agents/skills/xiaohongshu/scripts/export-long-image.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/install-check.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/login.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/mcp-call.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/post-detail.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/recommend.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/search.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/start-mcp.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/status.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/stop-mcp.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/track-topic.py delete mode 100755 .agents/skills/xiaohongshu/scripts/track-topic.sh delete mode 100755 .agents/skills/xiaohongshu/scripts/user-profile.sh delete mode 100644 .agents/skills/xiaohongshu/tools/xhs-downloader/README.md delete mode 100644 .agents/skills/xiaohongshu/tools/xhs-downloader/batch_download.py delete mode 100644 .agents/skills/xiaohongshu/tools/xhs-downloader/export_memory.py delete mode 100644 .agents/skills/xiaohongshu/tools/xhs-downloader/export_to_workspace.py create mode 100644 .claude/skills/post-to-xhs/SKILL.md create mode 100644 .claude/skills/setup-xhs-mcp/SKILL.md delete mode 100644 .claude/skills/xhs-content-creator/SKILL.md create mode 100644 .claude/skills/xhs-content-plan/SKILL.md create mode 100644 .claude/skills/xhs-explore/SKILL.md create mode 100644 .claude/skills/xhs-interact/SKILL.md create mode 100644 .claude/skills/xhs-login/SKILL.md create mode 100644 .claude/skills/xhs-profile/SKILL.md create mode 100644 .claude/skills/xhs-search/SKILL.md delete mode 120000 .claude/skills/xiaohongshu delete mode 120000 .claude/skills/xiaohongshu-note-analyzer delete mode 120000 skills/xiaohongshu delete mode 120000 skills/xiaohongshu-note-analyzer create mode 100644 wiki/entities/and-her-pilates.md create mode 100644 wiki/entities/放羊的杨.md create mode 100644 wiki/ideas/品牌介绍帖-focus-core.md create mode 100644 wiki/raw/xhs-产后恢复引流帖-v2.md create mode 100644 wiki/raw/普拉提引流调研报告.md create mode 100644 wiki/sources/xhs-普拉提私教-竞品爆款分析.md create mode 100644 wiki/topics/普拉提一人一馆-内容矩阵策划.md diff --git a/.agents/skills/xiaohongshu-note-analyzer/SKILL.md b/.agents/skills/xiaohongshu-note-analyzer/SKILL.md deleted file mode 100644 index 4ab1e05..0000000 --- a/.agents/skills/xiaohongshu-note-analyzer/SKILL.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -name: xiaohongshu-note-analyzer -description: 全面分析小红书笔记的内容质量、关键词优化、标题吸引力、敏感内容风险、商业化程度、互动潜力等。适用于发布前审核、内容优化建议、提升笔记曝光率。触发词包括"分析小红书笔记"、"小红书内容审核"、"笔记优化"、"XHS分析",或上传小红书笔记内容请求分析。 ---- - -# 小红书笔记分析器 (XiaoHongShu Note Analyzer) - -对小红书笔记进行全方位分析,提供优化建议,提升内容质量和曝光率。 - -## 分析维度 - -1. **关键词分析** — 搜索热度、关键词布局、标签优化 -2. **标题/首段吸引力** — 爆款标题元素、首图文案 -3. **敏感内容风险** — 违规词检测、限流风险评估 -4. **商业化程度** — 软广硬广识别、自然度评分 -5. **互动触发潜力** — 讨论点、分享动机、收藏价值 -6. **内容结构** — 排版、emoji使用、段落节奏 - -## 分析流程 - -``` -1. 提取笔记内容 → 标题、正文、标签、图片描述 -2. 关键词分析 → 核心词、长尾词、布局检查 -3. 敏感词扫描 → 违规风险、限流风险 -4. 商业化评估 → 广告痕迹、自然度 -5. 互动潜力评估 → 讨论点、情感共鸣 -6. 生成优化建议 → 具体修改方案 -``` - -## 1. 关键词分析 - -### 检查要点 - -| 维度 | 优秀 | 待改进 | -|------|------|--------| -| 核心关键词 | 标题+首段+正文+标签都包含 | 仅出现1-2处 | -| 长尾关键词 | 3-5个相关长尾词自然分布 | 无长尾词或堆砌 | -| 标签数量 | 5-10个相关标签 | <3个或>15个 | -| 关键词密度 | 2-3%自然出现 | <1%或>5%堆砌 | - -### 关键词布局公式 - -``` -标题: 必含核心关键词 + 吸引词 -首段(前50字): 核心关键词 + 痛点/好奇点 -正文: 长尾关键词自然分布 -标签: #核心词 #长尾词 #场景词 #人群词 -``` - -详见 `references/keyword-strategy.md` - -## 2. 标题/首段吸引力 - -### 爆款标题公式 - -| 类型 | 公式 | 示例 | -|------|------|------| -| 数字型 | 数字+关键词+结果 | "5个技巧让你月瘦10斤" | -| 痛点型 | 痛点+解决方案 | "毛孔粗大?这个方法亲测有效" | -| 好奇型 | 悬念+关键词 | "闺蜜问我怎么突然变白的..." | -| 对比型 | Before/After | "用了这个精华,同事都问我怎么了" | -| 权威型 | 身份+干货 | "皮肤科医生自用的5款防晒" | -| 情绪型 | 强烈情绪词 | "后悔没早点知道!这个神器太绝了" | - -### 首段黄金50字 - -首段必须包含: -- ✅ 核心关键词 -- ✅ 痛点/需求点 -- ✅ 吸引继续阅读的钩子 -- ✅ 与封面图呼应 - -详见 `references/title-formulas.md` - -## 3. 敏感内容风险评估 - -### 风险等级 - -| 等级 | 说明 | 后果 | -|------|------|------| -| 🔴 高危 | 明确违规词 | 删帖/封号 | -| 🟠 中危 | 灰色地带词 | 限流/不推荐 | -| 🟡 低危 | 可能触发审核 | 延迟发布 | -| 🟢 安全 | 无敏感内容 | 正常推荐 | - -### 常见敏感类别 - -1. **医疗健康类** — 疾病名称、药品、治疗效果承诺 -2. **金融理财类** — 收益承诺、投资建议、借贷 -3. **政治敏感类** — 时政、领导人、敏感事件 -4. **虚假宣传类** — 最、第一、100%、绝对 -5. **引流违规类** — 微信号、外链、二维码暗示 -6. **低俗擦边类** — 性暗示、身材过度暴露 - -详见 `references/sensitive-words.md` - -## 4. 商业化程度评估 - -### 自然度评分标准 - -| 分数 | 描述 | 特征 | -|------|------|------| -| 9-10 | 纯分享 | 无品牌露出,真实体验 | -| 7-8 | 软植入 | 自然提及品牌,不刻意 | -| 5-6 | 明显软广 | 品牌多次出现,有推荐意图 | -| 3-4 | 硬广 | 明显推销,价格引导 | -| 1-2 | 纯广告 | 通篇产品介绍,无真实体验 | - -### 降低商业感技巧 - -- ✅ 先讲痛点/故事,后引出产品 -- ✅ 提及缺点(真实感) -- ✅ 对比其他产品(客观感) -- ✅ 强调个人体验而非产品功能 -- ❌ 避免价格、购买链接、促销信息 -- ❌ 避免品牌名在标题 - -## 5. 互动触发潜力 - -### 讨论触发点 - -| 类型 | 方法 | 示例 | -|------|------|------| -| 提问式 | 结尾抛出问题 | "你们觉得哪个颜色更好看?" | -| 争议式 | 轻度争议观点 | "我觉得XX比XX好用,有人同意吗?" | -| 求助式 | 请求建议 | "姐妹们帮我看看选哪个!" | -| 共鸣式 | 引发情感共鸣 | "有没有和我一样的..." | -| 抽奖式 | 互动福利 | "评论区抽3位送同款" | - -### 分享动机触发 - -用户分享笔记的原因: -1. **实用价值** — 干货教程、省钱攻略 -2. **社交货币** — 显得有品味/见识 -3. **情感共鸣** — "说出了我的心声" -4. **收藏备用** — 清单、合集、测评 - -### 收藏价值评估 - -高收藏内容特征: -- ✅ 清单/合集形式 -- ✅ 步骤教程 -- ✅ 对比测评 -- ✅ 省钱/避坑指南 -- ✅ 信息密度高 - -## 输出格式 - -```markdown -# 小红书笔记分析报告 - -## 📊 综合评分: X/10 - -## 1️⃣ 关键词分析 -- **核心关键词**: [识别的关键词] -- **关键词布局**: ✅/❌ [评价] -- **标签优化**: [建议] - -## 2️⃣ 标题/首段评估 -- **标题类型**: [数字型/痛点型/...] -- **吸引力评分**: X/10 -- **优化建议**: [具体建议] - -## 3️⃣ 敏感内容风险 -- **风险等级**: 🟢/🟡/🟠/🔴 -- **检测到的敏感词**: [列表] -- **修改建议**: [具体建议] - -## 4️⃣ 商业化程度 -- **自然度评分**: X/10 -- **商业痕迹**: [分析] -- **降低商业感建议**: [具体建议] - -## 5️⃣ 互动潜力 -- **讨论触发点**: ✅/❌ -- **分享动机**: [分析] -- **收藏价值**: X/10 - -## 6️⃣ 优化后版本 -[提供优化后的标题和首段] - -## 📝 修改优先级 -1. [最重要的修改] -2. [次重要的修改] -3. [可选优化] -``` - -## 分析示例 - -详见 `references/analysis-examples.md` diff --git a/.agents/skills/xiaohongshu-note-analyzer/references/analysis-examples.md b/.agents/skills/xiaohongshu-note-analyzer/references/analysis-examples.md deleted file mode 100644 index e1f70b7..0000000 --- a/.agents/skills/xiaohongshu-note-analyzer/references/analysis-examples.md +++ /dev/null @@ -1,229 +0,0 @@ -# 分析示例 (Analysis Examples) - -## 示例1: 护肤类笔记分析 - -### 原始笔记 - -**标题**: 分享一个好用的精华 - -**正文**: -``` -最近用了一款精华感觉还不错,分享给大家。 -这个精华质地很清爽,吸收也快。 -我用了大概两周,感觉皮肤状态好了一些。 -推荐给大家试试。 - -#精华 #护肤 -``` - -### 分析报告 - -```markdown -# 小红书笔记分析报告 - -## 📊 综合评分: 4/10 - -## 1️⃣ 关键词分析 -- **核心关键词**: 精华、护肤 -- **关键词布局**: ❌ 仅在标签出现,标题和正文缺乏 -- **标签优化**: ❌ 只有2个标签,过少 -- **问题**: 无长尾关键词,难以被精准搜索触达 - -**优化建议**: -- 标题加入具体关键词:"油皮精华"、"补水精华" -- 增加标签至5-8个 -- 正文加入肤质、功效等长尾词 - -## 2️⃣ 标题/首段评估 -- **标题类型**: 无类型(过于笼统) -- **吸引力评分**: 2/10 -- **问题**: - - "好用"无具体信息 - - 无数字、无痛点、无悬念 - - 不知道是什么精华、适合什么肤质 - -**优化建议**: -将 "分享一个好用的精华" -改为 "油皮亲测|这款平价精华控油效果绝了" - -## 3️⃣ 敏感内容风险 -- **风险等级**: 🟢 安全 -- **检测到的敏感词**: 无 -- **说明**: 内容较为保守,无违规风险 - -## 4️⃣ 商业化程度 -- **自然度评分**: 6/10 -- **商业痕迹**: 低,但内容过于单薄 -- **问题**: 缺乏真实体验细节,反而显得不够真诚 - -**优化建议**: -- 加入使用前的皮肤问题 -- 加入具体使用感受(气味、肤感) -- 可以提一个小缺点增加真实感 - -## 5️⃣ 互动潜力 -- **讨论触发点**: ❌ 无 -- **分享动机**: 低(无实用价值) -- **收藏价值**: 2/10 - -**问题**: -- 无提问引导评论 -- 内容信息量低,无收藏必要 - -**优化建议**: -- 结尾加问题:"姐妹们还有什么平价精华推荐吗?" -- 加入使用步骤增加实用性 - -## 6️⃣ 优化后版本 - -**标题**: 油皮亲测|这款百元精华控油效果绝了 - -**正文**: -``` -作为一个大油皮,夏天真的太难了😭 -出油、毛孔粗、还容易闷痘... - -试了很多精华,这款终于让我看到效果! - -💧质地:水状精华,清爽不粘腻 -👃气味:淡淡的草本味,很舒服 -✨效果:用了两周,出油明显减少,毛孔也没那么明显了 - -唯一小缺点是瓶口设计不太好控制用量 - -油皮姐妹可以试试! -你们还有什么控油精华推荐吗?评论区告诉我👇 - -#油皮护肤 #控油精华 #平价精华 #夏日护肤 #毛孔护理 #学生党护肤 -``` - -## 📝 修改优先级 -1. 【必改】标题重写,加入关键词和吸引点 -2. 【必改】增加标签至5-8个 -3. 【建议】丰富正文内容,加入真实体验 -4. 【建议】结尾加互动问题 -``` - ---- - -## 示例2: 检测到敏感内容的笔记 - -### 原始笔记 - -**标题**: 这个方法治好了我的痘痘! - -**正文**: -``` -长了三年的痘痘终于治好了! -用了这个产品,痘痘全消了,绝对有效! -加我VX:xxx123,我告诉你具体方法 -这是最好的祛痘方法,100%有效! -``` - -### 分析报告 - -```markdown -# 小红书笔记分析报告 - -## 📊 综合评分: 1/10 (高风险,不建议发布) - -## 3️⃣ 敏感内容风险 -- **风险等级**: 🔴 高危 -- **检测到的敏感词**: - 1. "治好" — 医疗效果承诺 - 2. "绝对有效" — 绝对化用语 - 3. "加我VX" — 引流违规 - 4. "最好的" — 绝对化用语 - 5. "100%有效" — 虚假宣传 - -**后果**: 大概率被删帖,可能影响账号权重 - -## 修改建议 - -| 原文 | 问题 | 修改为 | -|------|------|--------| -| 治好了我的痘痘 | 医疗效果承诺 | 我的痘痘情况改善了很多 | -| 绝对有效 | 绝对化用语 | 我个人体验很有效 | -| 加我VX | 引流违规 | 删除,或改为"可以评论区交流" | -| 最好的 | 绝对化用语 | 我用过很有效的 | -| 100%有效 | 虚假宣传 | 对我来说效果很好 | - -## 优化后版本 - -**标题**: 困扰我三年的痘痘终于好转了!分享我的方法 - -**正文**: -``` -长了三年的痘痘,最近终于有好转了! -分享一下我的祛痘心得,希望对姐妹们有帮助~ - -⚠️ 每个人肤质不同,我的方法仅供参考哦 - -[具体方法内容] - -有同样困扰的姐妹可以评论区交流~ -你们有什么祛痘好方法吗?👇 -``` -``` - ---- - -## 示例3: 商业化程度过高的笔记 - -### 原始笔记 - -**标题**: XX品牌精华测评 - -**正文**: -``` -今天给大家介绍XX品牌的明星产品! -这款精华含有专利成分XXX,官方介绍可以XXX。 -现在官方旗舰店有活动,原价299现在只要199! -姐妹们快去抢!链接在评论区! -``` - -### 分析报告 - -```markdown -## 4️⃣ 商业化程度 -- **自然度评分**: 2/10 -- **商业痕迹**: - - ❌ 标题直接品牌名 - - ❌ 复述官方介绍而非真实体验 - - ❌ 强调价格促销 - - ❌ 引导购买链接 - -**问题**: 这是一篇明显的硬广,用户信任度低,平台可能限流 - -## 优化建议 - -1. **标题去品牌化**: 改为功效/场景导向 -2. **先讲故事/痛点**: 不要上来就介绍产品 -3. **真实体验为主**: 质地、气味、使用感受 -4. **加入小缺点**: 增加可信度 -5. **删除价格促销**: 避免商业感 -6. **不提链接**: 想了解的自然会搜 - -## 优化后版本 - -**标题**: 换季维稳精华|敏感肌亲测不踩雷 - -**正文**: -``` -换季皮肤又开始闹脾气了😢 -泛红、起皮、还有点刺痛... - -朋友推荐我试了这款精华,用了两周来反馈! - -💧质地:精华液偏水状,流动性很好 -👃气味:几乎没什么味道,敏感肌友好 -✨使用感:上脸很温和,没有刺激感 - -我连续用了两周,泛红情况确实好了很多 -唯一觉得不太好的是按压头有点难控制用量 - -敏感肌姐妹可以考虑~你们换季用什么维稳?👇 - -#敏感肌护肤 #换季护肤 #维稳精华 #敏感肌精华推荐 -``` -``` diff --git a/.agents/skills/xiaohongshu-note-analyzer/references/keyword-strategy.md b/.agents/skills/xiaohongshu-note-analyzer/references/keyword-strategy.md deleted file mode 100644 index c2faebb..0000000 --- a/.agents/skills/xiaohongshu-note-analyzer/references/keyword-strategy.md +++ /dev/null @@ -1,170 +0,0 @@ -# 小红书关键词策略 (Keyword Strategy) - -## 关键词类型 - -### 1. 核心关键词 (Core Keywords) -用户搜索的主要词汇,竞争激烈但流量大 - -**特征**: -- 1-3个字 -- 高搜索量 -- 竞争激烈 - -**示例**: 护肤、穿搭、减肥、美妆、旅游 - -### 2. 长尾关键词 (Long-tail Keywords) -更具体的搜索词,竞争小但精准 - -**特征**: -- 4-10个字 -- 搜索量较小 -- 用户意图明确 -- 转化率高 - -**示例**: -- 核心词"护肤" → 长尾词"油皮夏天护肤步骤" -- 核心词"穿搭" → 长尾词"小个子梨形身材穿搭" - -### 3. 场景关键词 (Scenario Keywords) -描述使用场景的词汇 - -**示例**: 约会、通勤、旅游、居家、上班 - -### 4. 人群关键词 (Audience Keywords) -描述目标人群的词汇 - -**示例**: 学生党、上班族、宝妈、新手、敏感肌 - -### 5. 修饰关键词 (Modifier Keywords) -增加描述的词汇 - -**示例**: 平价、大牌、小众、百元、高性价比 - -## 关键词布局策略 - -### 布局位置优先级 - -``` -1. 标题 (权重最高) -2. 首段前50字 (权重高) -3. 正文小标题 (权重中) -4. 正文内容 (权重中) -5. 标签 (权重中) -6. 图片OCR文字 (权重低) -``` - -### 最佳布局公式 - -``` -标题: [核心关键词] + [修饰词] + [吸引词] - 例: "油皮护肤|平价好用的夏日护肤清单" - -首段: 包含核心关键词 + 1-2个长尾关键词 - 例: "作为一个油皮,夏天护肤真的太难了, - 出油、毛孔、闷痘...今天分享我的油皮夏日护肤心得" - -正文: 每200字自然出现1次关键词变体 - 例: "这款控油精华"、"适合油皮的XX" - -标签: 5-10个,覆盖不同类型关键词 - 例: #油皮护肤 #夏日护肤 #控油 #平价护肤 #学生党护肤 -``` - -## 标签策略 - -### 标签数量 -- **最佳**: 5-10个 -- **最少**: 3个 -- **最多**: 不超过15个 - -### 标签组合公式 - -``` -2-3个 核心词标签: #护肤 #美妆 -2-3个 长尾词标签: #油皮护肤 #夏日护肤推荐 -1-2个 场景词标签: #通勤妆容 #约会穿搭 -1-2个 人群词标签: #学生党 #新手化妆 -1-2个 热门话题标签: #好物分享 #我的日常 -``` - -### 标签注意事项 - -✅ **正确做法**: -- 标签与内容高度相关 -- 混合大词和小词 -- 使用平台热门话题标签 - -❌ **错误做法**: -- 堆砌不相关热门标签 -- 只用大词不用长尾词 -- 标签与内容不符(影响推荐精准度) - -## 关键词密度 - -### 理想密度 -- **核心关键词**: 2-3% (每100字出现2-3次) -- **长尾关键词**: 每个出现1-2次即可 - -### 检查方法 -``` -关键词密度 = (关键词出现次数 × 关键词字数) ÷ 总字数 × 100% -``` - -### 密度问题 - -| 密度 | 问题 | 解决方案 | -|------|------|----------| -| <1% | 关键词不足,搜索难触达 | 在标题、首段、小标题增加关键词 | -| 2-3% | ✅ 理想状态 | 保持 | -| >5% | 关键词堆砌,影响阅读 | 使用同义词替换,减少重复 | - -## 关键词挖掘方法 - -### 1. 小红书搜索框 -- 输入核心词,查看下拉推荐词 -- 这些是用户真实搜索的长尾词 - -### 2. 相关笔记分析 -- 查看同类爆款笔记使用的关键词和标签 -- 分析评论区用户使用的词汇 - -### 3. 关键词组合矩阵 - -``` -核心词 × 人群词 = 长尾词 -护肤 × 油皮 = 油皮护肤 -护肤 × 学生党 = 学生党护肤 -护肤 × 敏感肌 = 敏感肌护肤 - -核心词 × 场景词 = 长尾词 -穿搭 × 通勤 = 通勤穿搭 -穿搭 × 约会 = 约会穿搭 - -核心词 × 修饰词 = 长尾词 -护肤 × 平价 = 平价护肤 -护肤 × 大牌 = 大牌护肤 -``` - -## 关键词分析输出模板 - -```markdown -### 关键词分析结果 - -**识别的核心关键词**: [词汇] -**识别的长尾关键词**: [词汇列表] - -**当前布局情况**: -- 标题: ✅/❌ 包含核心词 -- 首段: ✅/❌ 包含核心词 -- 正文: X次出现 -- 标签: X个相关标签 - -**关键词密度**: X% - -**优化建议**: -1. [具体建议] -2. [具体建议] - -**推荐增加的标签**: -#标签1 #标签2 #标签3 -``` diff --git a/.agents/skills/xiaohongshu-note-analyzer/references/sensitive-words.md b/.agents/skills/xiaohongshu-note-analyzer/references/sensitive-words.md deleted file mode 100644 index 360bbc0..0000000 --- a/.agents/skills/xiaohongshu-note-analyzer/references/sensitive-words.md +++ /dev/null @@ -1,113 +0,0 @@ -# 小红书敏感词库 (Sensitive Words Reference) - -## 🔴 高危词汇 (删帖/封号风险) - -### 医疗违规 -- 治愈、根治、药到病除 -- 处方药名称 -- 癌症、肿瘤等重大疾病+治疗方案 -- 医美手术具体操作描述 - -### 金融违规 -- 稳赚、保本、高收益 -- 具体投资回报率承诺 -- 代投、跟单、带单 -- 虚拟货币交易引导 - -### 政治敏感 -- 国家领导人姓名+评价 -- 敏感政治事件 -- 境外政治内容 - -### 违法内容 -- 赌博、博彩相关 -- 毒品、违禁品 -- 枪支、管制刀具 -- 色情、低俗内容 - -### 引流违规 -- 直接微信号/QQ号 -- "私我"、"滴滴"、"DD" -- 明显外链、二维码 -- "主页有联系方式" - -## 🟠 中危词汇 (限流风险) - -### 绝对化用语 -- 最好、最佳、第一、首选 -- 100%、绝对、肯定 -- 全网最低、史上最强 -- 国家级、世界级 - -### 医疗擦边 -- 祛痘、美白、抗衰(需谨慎表述) -- 减肥、瘦身(避免效果承诺) -- 功效承诺类描述 -- "亲测有效"+"医疗效果" - -### 商业敏感 -- 价格对比贬低竞品 -- "比XX便宜" -- 购买链接暗示 -- 过度促销用语 - -### 版权风险 -- 未授权品牌logo -- 影视剧截图过多 -- 音乐版权内容 -- 他人原创内容搬运 - -## 🟡 低危词汇 (可能延迟审核) - -### 可能触发审核 -- 赚钱、副业、兼职 -- 借贷、贷款、信用卡 -- 整容、医美、手术 -- 政策、法规相关 - -### 行业特殊词 -- 保健品功效描述 -- 母婴产品安全声明 -- 食品功效暗示 -- 化妆品成分功效 - -## ✅ 安全表述替换 - -| 危险表述 | 安全替换 | -|----------|----------| -| 最好的 | 我用过很不错的 | -| 100%有效 | 我个人体验很好 | -| 治愈了我的XX | 改善了我的XX情况 | -| 加我微信 | 可以交流(不留号) | -| 绝对好用 | 亲测感觉很棒 | -| 全网最低价 | 我买的时候很划算 | -| 药到病除 | 对我的情况有帮助 | -| 专家推荐 | 我看到有人推荐 | -| 官方认证 | 我在官方渠道买的 | - -## 行业特殊规则 - -### 美妆护肤 -- ❌ 避免:药妆、医学护肤、治疗效果 -- ✅ 使用:护肤体验、个人感受、肤感描述 - -### 母婴育儿 -- ❌ 避免:治疗婴儿疾病、代替医嘱 -- ✅ 使用:个人育儿经验、仅供参考 - -### 健身减肥 -- ❌ 避免:X天瘦X斤、快速减肥 -- ✅ 使用:健身记录、饮食分享、个人体验 - -### 金融理财 -- ❌ 避免:投资建议、收益承诺 -- ✅ 使用:个人理财记录、学习笔记 - -## 检测方法 - -分析笔记时,按以下优先级检查: - -1. **全文扫描** — 检查是否包含高危词库中的词汇 -2. **上下文分析** — 判断中危词汇的使用语境 -3. **意图识别** — 判断是否有引流、违规推广意图 -4. **替换建议** — 提供安全表述替换方案 diff --git a/.agents/skills/xiaohongshu-note-analyzer/references/title-formulas.md b/.agents/skills/xiaohongshu-note-analyzer/references/title-formulas.md deleted file mode 100644 index 7942bb2..0000000 --- a/.agents/skills/xiaohongshu-note-analyzer/references/title-formulas.md +++ /dev/null @@ -1,142 +0,0 @@ -# 爆款标题公式 (Title Formulas) - -## 核心原则 - -好标题 = **关键词** + **情绪触发** + **价值预期** - -## 八大爆款标题公式 - -### 1️⃣ 数字具象型 -**公式**: 数字 + 关键词 + 具体结果 - -``` -✅ "5个技巧让我月瘦10斤" -✅ "3步画出日杂妆容" -✅ "7天养成早起习惯的方法" -✅ "100元搞定一周穿搭" -``` - -**为什么有效**: 数字给人具体、可执行、有结果的感觉 - -### 2️⃣ 痛点解决型 -**公式**: 痛点问题 + 解决方案暗示 - -``` -✅ "毛孔粗大?这个方法亲测有效" -✅ "总是存不下钱?试试这个记账法" -✅ "拍照不上镜?学会这几个姿势" -✅ "皮肤暗沉怎么办?我的美白心得" -``` - -**为什么有效**: 直击用户痛点,暗示有解决方案 - -### 3️⃣ 好奇悬念型 -**公式**: 制造信息缺口 + 引发好奇 - -``` -✅ "闺蜜问我怎么突然变白的..." -✅ "用了这个之后,同事都问我怎么了" -✅ "原来一直用错了!难怪没效果" -✅ "看完这个,我把XX扔了" -``` - -**为什么有效**: 信息缺口让人想知道答案 - -### 4️⃣ 对比反差型 -**公式**: Before vs After / 意外反差 - -``` -✅ "从120斤到100斤,我做了这件事" -✅ "黄皮穿对颜色,气质直接翻倍" -✅ "换了这个枕头,睡眠质量完全不一样" -✅ "以前嫌贵,用了才知道值" -``` - -**为什么有效**: 对比产生冲击力,暗示巨大改变 - -### 5️⃣ 身份权威型 -**公式**: 身份背书 + 干货内容 - -``` -✅ "皮肤科医生自用的5款防晒" -✅ "健身教练不会告诉你的减脂真相" -✅ "10年化妆师的底妆技巧" -✅ "留学生的省钱购物攻略" -``` - -**为什么有效**: 专业身份增加可信度 - -### 6️⃣ 情绪共鸣型 -**公式**: 强烈情绪词 + 内容主题 - -``` -✅ "后悔没早点知道!这个神器太绝了" -✅ "救命!这个也太好看了吧" -✅ "绝绝子!一整个爱住" -✅ "哭了,早买早享受" -``` - -**为什么有效**: 情绪感染,引发共鸣 - -### 7️⃣ 场景代入型 -**公式**: 具体场景 + 解决方案 - -``` -✅ "约会前一晚这样护肤" -✅ "出门旅游必带的10件好物" -✅ "上班通勤听的播客推荐" -✅ "租房改造,500块焕新" -``` - -**为什么有效**: 场景具体,用户容易代入 - -### 8️⃣ 清单合集型 -**公式**: 主题 + 合集/清单/盘点 - -``` -✅ "2024年度爱用物大盘点" -✅ "学生党平价护肤清单" -✅ "小个子穿搭合集|显高10cm" -✅ "懒人早餐食谱合集" -``` - -**为什么有效**: 信息密度高,收藏价值高 - -## 标题优化检查清单 - -### 必须包含 ✅ -- [ ] 核心关键词 -- [ ] 情绪触发点或价值点 -- [ ] 字数控制在20字以内(最佳15-18字) - -### 避免 ❌ -- [ ] 纯品牌名做标题 -- [ ] 过于笼统无具体信息 -- [ ] 绝对化用语(最好、第一) -- [ ] 标题党但内容不符 - -## 首段黄金50字 - -首段决定用户是否继续阅读,必须包含: - -### 结构公式 -``` -痛点/场景引入(10-15字) + -解决方案预告(15-20字) + -继续阅读的钩子(10-15字) -``` - -### 示例 -``` -❌ "今天给大家分享一个好东西"(无信息量) - -✅ "换季皮肤又开始爆痘了😭 - 试了很多方法终于找到有效的, - 往下看我是怎么3周恢复的👇" -``` - -### 首段钩子技巧 -- 抛出问题:"你们有没有这种情况?" -- 制造悬念:"但是有个关键点..." -- 预告价值:"下面分享我的方法" -- 引发共鸣:"和我一样的姐妹看过来" diff --git a/.agents/skills/xiaohongshu/LICENSE b/.agents/skills/xiaohongshu/LICENSE deleted file mode 100644 index 8a57463..0000000 --- a/.agents/skills/xiaohongshu/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -MIT License - -Copyright (c) 2025 - -This license applies to the shell script wrapper layer in this repository only. -The xiaohongshu-mcp binary (https://github.com/xpzouying/xiaohongshu-mcp) is a -separate project with its own licensing terms. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.agents/skills/xiaohongshu/README.md b/.agents/skills/xiaohongshu/README.md deleted file mode 100644 index 4302f9a..0000000 --- a/.agents/skills/xiaohongshu/README.md +++ /dev/null @@ -1,315 +0,0 @@ -# XHS AI Toolkit - -

- Make AI understand your Xiaohongshu (RedNote) -

- -

- 简体中文 | English -

- -

- License - Platform - Python - MCP -

- ---- - -AI-powered toolkit for **Xiaohongshu (小红书 / RedNote)** that turns your favorite posts into AI memory. - -- **MCP Integration** — Search, browse, comment via AI assistants -- **Trend Tracking** — Auto-generate topic reports with engagement analytics -- **Memory Export** — Convert your liked/saved posts into AI-searchable knowledge base - -Built on [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) and [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader). - -## Features - -| Feature | Description | -|---------|-------------| -| Search | Search posts by keywords | -| Feed | Get homepage recommendations | -| Post Details | Fetch post content, comments, engagement stats | -| Comment | Post comments to notes | -| User Profile | Get user info and their posts | -| Trend Tracking | Auto-generate topic analysis reports | -| Long Image Export | Export posts as annotated JPG long images | -| Memory Export | Export liked/saved posts as Markdown for AI memory | - -## Quick Start - -### 1. Install xiaohongshu-mcp - -Download from [GitHub Releases](https://github.com/xpzouying/xiaohongshu-mcp/releases): - -```bash -# Linux x64 -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-linux-amd64.tar.gz -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-login-linux-amd64.tar.gz - -# macOS ARM -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-darwin-arm64.tar.gz -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-login-darwin-arm64.tar.gz -``` - -Install: - -```bash -mkdir -p ~/.local/bin -tar -xzf xiaohongshu-mcp-*.tar.gz -C ~/.local/bin/ -tar -xzf xiaohongshu-login-*.tar.gz -C ~/.local/bin/ - -cd ~/.local/bin -mv xiaohongshu-mcp-* xiaohongshu-mcp -mv xiaohongshu-login-* xiaohongshu-login -chmod +x xiaohongshu-mcp xiaohongshu-login -``` - -### 2. Install This Toolkit - -```bash -# Clone to OpenClaw workspace -git clone https://github.com/zhjiang22/openclaw-xhs.git -cp -r openclaw-xhs ~/.openclaw/workspace/skills/xiaohongshu - -# Or use symlink -ln -s /path/to/openclaw-xhs ~/.openclaw/workspace/skills/xiaohongshu - -# Verify installation -cd ~/.openclaw/workspace/skills/xiaohongshu/scripts -./install-check.sh -``` - -### 3. Login (Get Cookies) - -**Option A: Desktop Environment** - -```bash -./login.sh # Opens browser, scan QR code with Xiaohongshu app -``` - -**Option B: Headless Server** - -Get cookies on your local machine, then copy to server: - -```bash -# On local machine with GUI -./xiaohongshu-login -# Cookies saved to /tmp/cookies.json - -# Copy to server -scp /tmp/cookies.json user@server:~/.xiaohongshu/cookies.json -``` - -### 4. Start Service - -```bash -./start-mcp.sh # Headless mode -./start-mcp.sh --headless=false # Show browser (debug) -``` - -Service runs at `http://localhost:18060/mcp`. - -#### Server Deployment (Headless Linux) - -On servers without a desktop environment, the underlying browser requires a virtual display. -`start-mcp.sh` **auto-detects** the environment — if no display is found, it starts Xvfb automatically. Just install it first: - -```bash -# Debian/Ubuntu -sudo apt-get install -y xvfb - -# CentOS/RHEL -sudo yum install -y xorg-x11-server-Xvfb -``` - -No extra configuration needed. The script handles: -- Detecting the `DISPLAY` environment variable -- Auto-starting `Xvfb :99` when no display is available -- Cleaning up Xvfb when `stop-mcp.sh` is called - -> **Note**: Without Xvfb, login and search will fail on headless servers. See [Issue #3](https://github.com/zhjiang22/openclaw-xhs/issues/3). - -## Usage - -### Basic Commands - -```bash -./status.sh # Check login status -./search.sh "coffee" # Search posts -./recommend.sh # Get recommendations -./post-detail.sh # Get post details -./comment.sh "Great post!" # Comment -./user-profile.sh # Get user profile -``` - -### Trend Tracking - -Auto-search trending posts and generate analysis reports: - -```bash -./track-topic.sh "AI" --limit 10 -./track-topic.sh "travel" --limit 5 --output report.md -./track-topic.sh "iPhone" --limit 5 --feishu # Export to Feishu -``` - -### MCP Tools - -| Tool | Description | -|------|-------------| -| `check_login_status` | Check login status | -| `search_feeds` | Search posts | -| `list_feeds` | Get homepage feed | -| `get_feed_detail` | Get post details & comments | -| `post_comment_to_feed` | Post comment | -| `user_profile` | Get user profile | -| `like_feed` | Like/unlike post | -| `favorite_feed` | Save/unsave post | -| `publish_content` | Publish image post | -| `publish_with_video` | Publish video post | - -### Long Image Export - -Export posts as annotated JPG long images (white background, black text): - -```bash -# Prepare posts.json -cat > posts.json << 'EOF' -[ - { - "title": "Post title", - "author": "Author", - "stats": "13k likes 100 saves", - "desc": "Post summary", - "images": ["https://...webp"], - "per_image_text": {"1": "Caption for 2nd image"} - } -] -EOF - -./export-long-image.sh --posts-file posts.json -o output.jpg -``` - -Requires: Python 3.10+, Pillow (`pip install Pillow`) - -## Memory Export (Turn Likes into AI Memory) - -Export your liked/saved posts as a searchable knowledge base for AI assistants. - -### 1. Install XHS-Downloader - -```bash -git clone https://github.com/JoeanAmier/XHS-Downloader.git -cd XHS-Downloader -pip install -r requirements.txt -``` - -### 2. Extract Post Links (Tampermonkey Script) - -1. Install [Tampermonkey](https://www.tampermonkey.net/) -2. Install [XHS-Downloader UserScript](https://raw.githubusercontent.com/JoeanAmier/XHS-Downloader/refs/heads/master/static/XHS-Downloader.js) -3. Go to Xiaohongshu web → Profile → Liked/Saved -4. Click Tampermonkey menu → "Extract liked posts" or "Extract saved posts" -5. Links auto-copied to clipboard -6. Paste into `links.md` - -### 3. Download & Export - -```bash -# Copy helper scripts -cp tools/xhs-downloader/*.py /path/to/XHS-Downloader/ - -# Download posts -cd /path/to/XHS-Downloader -python batch_download.py links.md - -# Export to workspace -python export_to_workspace.py -# Output: ~/.openclaw/workspace/xhs-memory/ -``` - -### 4. Configure OpenClaw Memory Search - -Edit `~/.openclaw/openclaw.json`: - -```json -{ - "memorySearch": { - "extraPaths": [ - "~/.openclaw/workspace/xhs-memory" - ] - } -} -``` - -Now your AI assistant can search your Xiaohongshu favorites! - -## Project Structure - -``` -openclaw-xhs/ -├── README.md # English docs -├── README_CN.md # Chinese docs -├── LICENSE -├── SKILL.md # Skill manifest -├── scripts/ # MCP wrapper scripts -│ ├── install-check.sh -│ ├── start-mcp.sh -│ ├── stop-mcp.sh -│ ├── login.sh -│ ├── mcp-call.sh -│ ├── status.sh -│ ├── search.sh -│ ├── recommend.sh -│ ├── post-detail.sh -│ ├── comment.sh -│ ├── user-profile.sh -│ ├── track-topic.sh -│ ├── track-topic.py -│ ├── export-long-image.sh -│ └── export-long-image.py -└── tools/ - └── xhs-downloader/ # Memory export tools - ├── README.md - ├── batch_download.py - ├── export_memory.py - └── export_to_workspace.py -``` - -## Security - -This project implements the following security measures: - -- **Cookie protection**: Cookie files are copied with `600` permissions (owner-only read/write) -- **Injection prevention**: All shell scripts use `jq` to build JSON payloads instead of string interpolation, preventing shell injection -- **Tool name validation**: MCP tool names are restricted to alphanumeric characters and underscores -- **Path validation**: Cross-skill script calls validate that target paths are within allowed directories -- **Third-party content**: Content fetched from Xiaohongshu is user-generated; exercise appropriate caution - - -## Disclaimer - -This project is a **wrapper layer** for [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp). - -- Does NOT contain xiaohongshu-mcp source code -- Users must download xiaohongshu-mcp binaries separately -- Scripts communicate via HTTP protocol only - -## Acknowledgments - -- [@xpzouying](https://github.com/xpzouying) — [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) -- [@JoeanAmier](https://github.com/JoeanAmier) — [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader) (GPL-3.0) - -## License - -MIT License (wrapper scripts only) - -**Note:** xiaohongshu-mcp has no declared license. Please respect the author's terms. - ---- - -

- If this project helps you, please give it a ⭐! -

diff --git a/.agents/skills/xiaohongshu/README_CN.md b/.agents/skills/xiaohongshu/README_CN.md deleted file mode 100644 index cafb74e..0000000 --- a/.agents/skills/xiaohongshu/README_CN.md +++ /dev/null @@ -1,373 +0,0 @@ -# XHS AI Toolkit - -

- 让 AI 读懂你的小红书 -

- -

- 简体中文 | English -

- -

- License - Platform - Python - MCP -

- ---- - -小红书 AI 工具包 — 把你的收藏变成 AI 的记忆。 - -- **MCP 集成** — 通过 AI 助手搜索、浏览、评论小红书 -- **热点跟踪** — 自动生成话题报告,含互动数据分析 -- **记忆导出** — 将收藏/点赞笔记转为 AI 可搜索的知识库 - -基于 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 和 [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader) 构建。 - -## 功能特性 - -| 功能 | 说明 | -|------|------| -| 搜索内容 | 按关键词搜索小红书笔记 | -| 首页推荐 | 获取首页推荐列表 | -| 帖子详情 | 获取笔记内容、评论、互动数据 | -| 发表评论 | 在笔记下发表评论 | -| 用户主页 | 获取用户资料和笔记列表 | -| 热点跟踪 | 自动生成话题分析报告 | -| 长图导出 | 将帖子导出为带注释的 JPG 长图 | -| 记忆导出 | 导出收藏/点赞为 Markdown 记忆库 | - -## 快速开始 - -### 1. 安装 xiaohongshu-mcp - -从 [GitHub Releases](https://github.com/xpzouying/xiaohongshu-mcp/releases) 下载: - -```bash -# Linux x64 -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-linux-amd64.tar.gz -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-login-linux-amd64.tar.gz - -# macOS ARM -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-darwin-arm64.tar.gz -wget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-login-darwin-arm64.tar.gz -``` - -解压安装: - -```bash -mkdir -p ~/.local/bin -tar -xzf xiaohongshu-mcp-*.tar.gz -C ~/.local/bin/ -tar -xzf xiaohongshu-login-*.tar.gz -C ~/.local/bin/ - -cd ~/.local/bin -mv xiaohongshu-mcp-* xiaohongshu-mcp -mv xiaohongshu-login-* xiaohongshu-login -chmod +x xiaohongshu-mcp xiaohongshu-login -``` - -### 2. 安装本工具包 - -```bash -# 克隆到 OpenClaw workspace -git clone https://github.com/zhjiang22/openclaw-xhs.git -cp -r openclaw-xhs ~/.openclaw/workspace/skills/xiaohongshu - -# 或使用软链接 -ln -s /path/to/openclaw-xhs ~/.openclaw/workspace/skills/xiaohongshu - -# 验证安装 -cd ~/.openclaw/workspace/skills/xiaohongshu/scripts -./install-check.sh -``` - -### 3. 登录获取 Cookies - -**方式一:本地桌面环境** - -```bash -./login.sh # 打开浏览器,用小红书 App 扫码登录 -``` - -**方式二:Linux 服务器(无桌面)** - -在本地电脑获取 cookies 后复制到服务器: - -```bash -# 本地电脑(有 GUI) -./xiaohongshu-login -# Cookies 保存在 /tmp/cookies.json - -# 复制到服务器 -scp /tmp/cookies.json user@server:~/.xiaohongshu/cookies.json -``` - -服务启动时会自动检查以下位置的 cookies(按优先级): - -1. 环境变量 `XHS_COOKIES_SRC` 指定的路径 -2. `~/cookies.json` -3. `~/.xiaohongshu/cookies.json` - -### 4. 启动服务 - -```bash -./start-mcp.sh # headless 模式 -./start-mcp.sh --headless=false # 显示浏览器(调试用) -``` - -服务监听 `http://localhost:18060/mcp`。 - -停止服务:`./stop-mcp.sh` - -#### 服务器部署(无桌面环境) - -在没有图形界面的 Linux 服务器上,`xiaohongshu-mcp` 底层的浏览器需要虚拟显示器才能正常工作。 -`start-mcp.sh` 会**自动检测**是否有桌面环境,如果没有则自动启动 Xvfb,你只需提前安装: - -```bash -# Debian/Ubuntu -sudo apt-get install -y xvfb - -# CentOS/RHEL -sudo yum install -y xorg-x11-server-Xvfb -``` - -安装后无需额外配置,`start-mcp.sh` 会自动处理: -- 检测 `DISPLAY` 环境变量 -- 没有显示器时自动启动 `Xvfb :99` -- `stop-mcp.sh` 停止服务时会一并清理 Xvfb 进程 - -> **提示**:如果不安装 Xvfb,登录和搜索功能会失败。参见 [Issue #3](https://github.com/zhjiang22/openclaw-xhs/issues/3)。 - -## 使用方法 - -### 基础命令 - -```bash -./status.sh # 检查登录状态 -./search.sh "咖啡" # 搜索内容 -./recommend.sh # 获取推荐 -./post-detail.sh # 获取帖子详情 -./comment.sh "写得真好!" # 发表评论 -./user-profile.sh # 获取用户主页 -``` - -### 热点跟踪 - -自动搜索热帖并生成分析报告: - -```bash -./track-topic.sh "DeepSeek" --limit 10 -./track-topic.sh "春节旅游" --limit 5 --output report.md -./track-topic.sh "iPhone 16" --limit 5 --feishu # 导出到飞书 -``` - -报告包含: -- 📊 概览统计(帖子数、点赞数、评论数) -- 📝 热帖详情(标题、作者、正文、热门评论) -- 💬 评论区热点关键词 -- 📈 趋势分析 - -### MCP 工具清单 - -| 工具名 | 描述 | -|--------|------| -| `check_login_status` | 检查登录状态 | -| `search_feeds` | 搜索内容 | -| `list_feeds` | 获取首页推荐 | -| `get_feed_detail` | 获取帖子详情和评论 | -| `post_comment_to_feed` | 发表评论 | -| `user_profile` | 获取用户主页 | -| `like_feed` | 点赞/取消 | -| `favorite_feed` | 收藏/取消 | -| `publish_content` | 发布图文笔记 | -| `publish_with_video` | 发布视频笔记 | - -### 通用 MCP 调用 - -```bash -./mcp-call.sh # 查看可用工具 -./mcp-call.sh search_feeds '{"keyword": "咖啡"}' -./mcp-call.sh like_feed '{"feed_id": "xxx", "xsec_token": "xxx", "like": true}' -``` - -### 长图导出 - -将搜索结果或帖子详情导出为带文字注释的 JPG 长图: - -```bash -# 准备 posts.json(搜索+拉详情后整理) -cat > posts.json << 'EOF' -[ - { - "title": "帖子标题", - "author": "作者名", - "stats": "1.3万赞 100收藏", - "desc": "正文摘要", - "images": ["https://...webp"], - "per_image_text": {"1": "第2张图的专属说明"} - } -] -EOF - -./export-long-image.sh --posts-file posts.json -o output.jpg -``` - -依赖:Python 3.10+、Pillow(`pip install Pillow`) - -## 记忆导出:把收藏变成 AI 的记忆 - -将你的收藏/点赞笔记导出为 AI 可搜索的知识库,让 AI 更懂你。 - -### 1. 安装 XHS-Downloader - -```bash -git clone https://github.com/JoeanAmier/XHS-Downloader.git -cd XHS-Downloader -pip install -r requirements.txt -``` - -### 2. 获取收藏/点赞链接(油猴脚本) - -手动复制链接效率太低,推荐使用油猴脚本批量提取: - -**安装脚本:** - -1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展 -2. 安装用户脚本:[XHS-Downloader.js](https://raw.githubusercontent.com/JoeanAmier/XHS-Downloader/refs/heads/master/static/XHS-Downloader.js) - -**提取链接:** - -1. 打开 [小红书网页版](https://www.xiaohongshu.com) 并登录 -2. 进入个人主页 → **收藏** 或 **点赞** 页面 -3. 点击 Tampermonkey 图标,选择: - - `提取收藏作品链接` - - `提取点赞作品链接` -4. 脚本会自动滚动页面加载全部内容 -5. 提取完成后链接自动复制到剪贴板 -6. 粘贴到 `links.md` 文件 - -> **注意**:自动滚动功能默认关闭,需在脚本设置中手动开启。开启后可能触发风控,建议适度使用。 - -### 3. 批量下载并导出 - -```bash -# 复制工具脚本到 XHS-Downloader 目录 -cp tools/xhs-downloader/*.py /path/to/XHS-Downloader/ - -# 批量下载 -cd /path/to/XHS-Downloader -python batch_download.py links.md - -# 导出为多文件(推荐) -python export_to_workspace.py -# 输出到 ~/.openclaw/workspace/xhs-memory/ - -# 或导出为单文件 -python export_memory.py -# 生成 xhs_memory.md -``` - -### 4. 配置 OpenClaw 记忆搜索 - -编辑 `~/.openclaw/openclaw.json`: - -```json -{ - "memorySearch": { - "extraPaths": [ - "~/.openclaw/workspace/xhs-memory" - ] - } -} -``` - -现在你的 AI 助手可以搜索你的小红书收藏了! - -## 安全说明 - -本项目在脚本安全方面采取了以下措施: - -- **Cookies 保护**:cookies 文件复制时自动设置 `600` 权限(仅当前用户可读写) -- **防注入**:所有 shell 脚本使用 `jq` 构建 JSON payload,不通过字符串拼接,防止 shell 注入攻击 -- **工具名校验**:MCP 工具名限制为字母数字和下划线,拒绝非法字符 -- **路径校验**:跨 skill 调用时校验目标路径在允许的目录范围内 -- **第三方内容**:从小红书获取的内容为用户生成内容(UGC),请注意甄别 - - -## 注意事项 - -1. **发布限制** - - 标题最多 20 个字符 - - 正文最多 1000 个字符 - - 每日发布上限约 50 条 - -2. **账号安全** - - 避免多设备同时登录同一账号 - - 手机 App 仅用于查看,不要同时操作 - -3. **首次运行** - - 会自动下载 headless 浏览器(约 150MB) - - 请确保网络畅通 - -4. **Cookies 有效期** - - 通常有效期约 30 天 - - 失效后需重新获取 - -## 项目结构 - -``` -openclaw-xhs/ -├── README.md # 英文文档 -├── README_CN.md # 中文文档 -├── LICENSE -├── SKILL.md # Skill 描述文件 -├── scripts/ # MCP 调用脚本 -│ ├── install-check.sh -│ ├── start-mcp.sh -│ ├── stop-mcp.sh -│ ├── login.sh -│ ├── mcp-call.sh -│ ├── status.sh -│ ├── search.sh -│ ├── recommend.sh -│ ├── post-detail.sh -│ ├── comment.sh -│ ├── user-profile.sh -│ ├── track-topic.sh -│ ├── track-topic.py -│ ├── export-long-image.sh -│ └── export-long-image.py -└── tools/ - └── xhs-downloader/ # 记忆导出工具 - ├── README.md - ├── batch_download.py - ├── export_memory.py - └── export_to_workspace.py -``` - -## 声明 - -本项目是 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 的**调用封装层**。 - -- **不包含** xiaohongshu-mcp 的任何源代码 -- **用户需自行下载** xiaohongshu-mcp 二进制文件 -- 脚本仅通过 HTTP 协议与 MCP 服务通信 - -## 致谢 - -- [@xpzouying](https://github.com/xpzouying) — [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) -- [@JoeanAmier](https://github.com/JoeanAmier) — [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader) (GPL-3.0) - -## License - -MIT License(仅限本项目脚本) - -**注意:** xiaohongshu-mcp 项目未声明开源许可证,请遵守其作者的使用条款。 - ---- - -

- 觉得有用?给个 ⭐ 支持一下! -

diff --git a/.agents/skills/xiaohongshu/SKILL.md b/.agents/skills/xiaohongshu/SKILL.md deleted file mode 100644 index 17791b0..0000000 --- a/.agents/skills/xiaohongshu/SKILL.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -name: xiaohongshu -description: | - 小红书(RedNote)内容工具。使用场景: - - 搜索小红书笔记并获取详情 - - 获取首页推荐列表 - - 获取帖子详情(正文、图片、互动数据、评论) - - 发表评论 / 回复评论 - - 获取用户主页和笔记列表 - - 点赞、收藏帖子 - - 发布图文或视频笔记 - - 热点话题跟踪与分析报告 - - 帖子导出为长图 - 触发词示例: - - "搜一下小红书上的XX" - - "跟踪一下小红书上的XX热点" - - "分析小红书上关于XX的讨论" - - "小红书XX话题报告" - - "生成XX的小红书舆情报告" ---- - -# 小红书 MCP Skill - -基于 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 封装的 shell 脚本工具集。 - -## 前置条件 - -```bash -cd scripts/ -./install-check.sh # 检查依赖(xiaohongshu-mcp、jq、python3) -./start-mcp.sh # 启动 MCP 服务(默认端口 18060) -./status.sh # 确认已登录 -``` - -未登录时需扫码:`mcp-call.sh get_login_qrcode` 获取二维码,用小红书 App 扫码。 - -服务端口可通过 `MCP_URL` 环境变量覆盖(默认 `http://localhost:18060/mcp`)。 - -## 核心数据流 - -**重要:** 大多数操作需要 `feed_id` + `xsec_token` 配对。这两个值从搜索/推荐/用户主页结果中获取,**不可自行构造**。 - -``` -search_feeds / list_feeds / user_profile - │ - ▼ - 返回 feeds 数组,每个 feed 包含: - ├── id → 用作 feed_id - ├── xsecToken → 用作 xsec_token - └── noteCard → 标题、作者、封面、互动数据 - │ - ▼ - get_feed_detail(feed_id, xsec_token) - │ - ▼ - 返回完整笔记: 正文、图片列表、评论列表 - 评论中包含 comment_id、user_id(用于回复评论) -``` - -## 脚本参考 - -| 脚本 | 用途 | 参数 | -|------|------|------| -| `search.sh <关键词>` | 搜索笔记 | 关键词 | -| `recommend.sh` | 首页推荐 | 无 | -| `post-detail.sh ` | 帖子详情+评论 | 从搜索结果获取 | -| `comment.sh <内容>` | 发表评论 | 从搜索结果获取 | -| `user-profile.sh ` | 用户主页+笔记 | 从搜索结果获取 | -| `track-topic.sh <话题> [选项]` | 热点分析报告 | `--limit N` `--output file` `--feishu` | -| `export-long-image.sh` | 帖子导出长图 | `--posts-file json -o output.jpg` | -| `mcp-call.sh [json_args]` | 通用 MCP 调用 | 见下方工具表 | -| `start-mcp.sh` | 启动服务 | `--headless=false` `--port=N` | -| `stop-mcp.sh` | 停止服务 | 无 | -| `status.sh` | 检查登录 | 无 | -| `install-check.sh` | 检查依赖 | 无 | - -## MCP 工具详细参数 - -### search_feeds — 搜索笔记 - -```json -{"keyword": "咖啡", "filters": {"sort_by": "最新", "note_type": "图文", "publish_time": "一周内"}} -``` - -filters 可选字段: -- `sort_by`: 综合 | 最新 | 最多点赞 | 最多评论 | 最多收藏 -- `note_type`: 不限 | 视频 | 图文 -- `publish_time`: 不限 | 一天内 | 一周内 | 半年内 -- `search_scope`: 不限 | 已看过 | 未看过 | 已关注 -- `location`: 不限 | 同城 | 附近 - -### get_feed_detail — 帖子详情 - -```json -{"feed_id": "...", "xsec_token": "...", "load_all_comments": true, "limit": 20} -``` - -- `load_all_comments`: false(默认) 返回前10条,true 滚动加载更多 -- `limit`: 加载评论上限(仅 load_all_comments=true 时生效),默认 20 -- `click_more_replies`: 是否展开二级回复,默认 false -- `reply_limit`: 跳过回复数超过此值的评论,默认 10 -- `scroll_speed`: slow | normal | fast - -### post_comment_to_feed — 发表评论 - -```json -{"feed_id": "...", "xsec_token": "...", "content": "写得真好!"} -``` - -### reply_comment_in_feed — 回复评论 - -```json -{"feed_id": "...", "xsec_token": "...", "content": "谢谢!", "comment_id": "...", "user_id": "..."} -``` - -`comment_id` 和 `user_id` 从 get_feed_detail 返回的评论列表中获取。 - -### user_profile — 用户主页 - -```json -{"user_id": "...", "xsec_token": "..."} -``` - -`user_id` 从 feed 的 `noteCard.user.userId` 获取,`xsec_token` 使用该 feed 的 `xsecToken`。 - -### like_feed — 点赞/取消 - -```json -{"feed_id": "...", "xsec_token": "..."} -{"feed_id": "...", "xsec_token": "...", "unlike": true} -``` - -### favorite_feed — 收藏/取消 - -```json -{"feed_id": "...", "xsec_token": "..."} -{"feed_id": "...", "xsec_token": "...", "unfavorite": true} -``` - -### publish_content — 发布图文 - -```json -{"title": "标题(≤20字)", "content": "正文(≤1000字)", "images": ["/path/to/img.jpg"], "tags": ["美食","旅行"]} -``` - -- `images`: 至少1张,支持本地路径或 HTTP URL -- `tags`: 可选,话题标签 -- `schedule_at`: 可选,定时发布(ISO8601,1小时~14天内) - -### publish_with_video — 发布视频 - -```json -{"title": "标题", "content": "正文", "video": "/path/to/video.mp4"} -``` - -### 其他工具 - -| 工具 | 参数 | 说明 | -|------|------|------| -| `check_login_status` | 无 | 检查登录状态 | -| `list_feeds` | 无 | 获取首页推荐 | -| `get_login_qrcode` | 无 | 获取登录二维码(Base64 PNG) | -| `delete_cookies` | 无 | 删除 cookies,重置登录 | - -## 热点跟踪 - -自动搜索 → 拉取详情 → 生成 Markdown 报告。 - -```bash -./track-topic.sh "DeepSeek" --limit 5 -./track-topic.sh "春节旅游" --limit 10 --output report.md -./track-topic.sh "iPhone 16" --limit 5 --feishu # 导出飞书 -``` - -报告包含:概览统计、热帖详情(正文+热评)、评论关键词、趋势分析。 - -## 长图导出 - -将帖子导出为白底黑字的 JPG 长图。 - -```bash -./export-long-image.sh --posts-file posts.json -o output.jpg -``` - -posts.json 格式: -```json -[{ - "title": "标题", "author": "作者", "stats": "1.3万赞", - "desc": "正文摘要", "images": ["https://..."], - "per_image_text": {"1": "第2张图的说明"} -}] -``` - -依赖:Python 3.10+、Pillow。 - -## 注意事项 - -- Cookies 有效期约 30 天,过期需重新扫码 -- 首次启动会下载 headless 浏览器(~150MB) -- 同一账号避免多客户端同时操作 -- 发布限制:标题≤20字符,正文≤1000字符,日发布≤50条 -- Linux 服务器无桌面环境需安装 xvfb(`apt-get install xvfb`,脚本自动管理) diff --git a/.agents/skills/xiaohongshu/scripts/comment.sh b/.agents/skills/xiaohongshu/scripts/comment.sh deleted file mode 100755 index 8a51d59..0000000 --- a/.agents/skills/xiaohongshu/scripts/comment.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# 发表评论到小红书帖子 - -NOTE_ID="$1" -XSEC_TOKEN="$2" -CONTENT="$3" - -if [ -z "$NOTE_ID" ] || [ -z "$XSEC_TOKEN" ] || [ -z "$CONTENT" ]; then - echo "用法: $0 <评论内容>" - exit 1 -fi - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ARGS=$(jq -n --arg fid "$NOTE_ID" --arg tok "$XSEC_TOKEN" --arg ct "$CONTENT" \ - '{"feed_id":$fid,"xsec_token":$tok,"content":$ct}') -"$SCRIPT_DIR/mcp-call.sh" post_comment_to_feed "$ARGS" diff --git a/.agents/skills/xiaohongshu/scripts/cookies.json b/.agents/skills/xiaohongshu/scripts/cookies.json deleted file mode 100644 index 819f8b6..0000000 --- a/.agents/skills/xiaohongshu/scripts/cookies.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"acw_tc","value":"0a00dbc717762232847051713ea1217a7acc4a89d81bf95e65906a490251e7","domain":"www.xiaohongshu.com","path":"/","expires":1776225084.815888,"size":68,"httpOnly":true,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"abRequestId","value":"0db952cd-3244-52d5-bf14-4ffb86d79784","domain":".xiaohongshu.com","path":"/","expires":1807759284.816125,"size":47,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"ets","value":"1776223285450","domain":".xiaohongshu.com","path":"/","expires":1778815285.450774,"size":16,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"webBuild","value":"6.6.0","domain":".xiaohongshu.com","path":"/","expires":-1,"size":13,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"xsecappid","value":"xhs-pc-web","domain":".xiaohongshu.com","path":"/","expires":1807759285,"size":19,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"loadts","value":"1776223285510","domain":".xiaohongshu.com","path":"/","expires":1807759285,"size":19,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"a1","value":"19d8f28710bg4n2alvzxu30gnyyxnprzioy5how6430000426473","domain":".xiaohongshu.com","path":"/","expires":1807759285,"size":54,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"webId","value":"74c0c5711a2be3b7ab536e24ab97e644","domain":".xiaohongshu.com","path":"/","expires":1807759285,"size":37,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"acw_tc","value":"0a4ae12217762232858201316ec263c2521ac3093f47d21bb05138d6c47855","domain":"edith.xiaohongshu.com","path":"/","expires":1776225085.794244,"size":68,"httpOnly":true,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"websectiga","value":"16f444b9ff5e3d7e258b5f7674489196303a0b160e16647c6c2b4dcb609f4134","domain":".xiaohongshu.com","path":"/","expires":1776482485,"size":74,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"sec_poison_id","value":"04a04fa0-b866-4141-b00c-8e9d86696803","domain":".xiaohongshu.com","path":"/","expires":1776223890,"size":49,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"acw_tc","value":"0a4adb3917762232862231622e397f82f8986c933f9409333119ea8ff76fe5","domain":"so.xiaohongshu.com","path":"/","expires":1776225086.198765,"size":68,"httpOnly":true,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"unread","value":"{%22ub%22:%2264be88f5000000000a01a738%22%2C%22ue%22:%2263f49daf0000000013004a95%22%2C%22uc%22:13}","domain":".xiaohongshu.com","path":"/","expires":-1,"size":103,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"gid","value":"yjfYiJYWfd3KyjfYiJYWyllE8Dk4IJ01huC7vK4q8kIvv2q8CIUFux8884JK4Wq8f0dSf0SW","domain":".xiaohongshu.com","path":"/","expires":1810783298.403007,"size":75,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"web_session","value":"0400698e3df40f57bfb4244cea3b4b5566c8bc","domain":".xiaohongshu.com","path":"/","expires":1807759309.695016,"size":49,"httpOnly":true,"secure":true,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"id_token","value":"VjEAAAE6HnlvwMhfB2lWeyhDp5C0798IDu1q6CFvQyi96bTV8pU4Im29xspYVZTHBEjxVUEH2Xkq5RxQgrTOfZBdGAY8c3Fk49zwLKmPTsJ7fxsQ/bcD+l+hcfi2X9+WcXoAIWKf","domain":".xiaohongshu.com","path":"/","expires":1807759309.695111,"size":144,"httpOnly":true,"secure":true,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443}] \ No newline at end of file diff --git a/.agents/skills/xiaohongshu/scripts/export-long-image.py b/.agents/skills/xiaohongshu/scripts/export-long-image.py deleted file mode 100644 index 6aad14c..0000000 --- a/.agents/skills/xiaohongshu/scripts/export-long-image.py +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env python3 -""" -小红书帖子长图导出工具 - -用法: - python3 export-long-image.py --posts '' --output output.jpg - python3 export-long-image.py --posts-file posts.json --output output.jpg - -posts JSON 格式: -[ - { - "title": "帖子标题", - "author": "作者名", - "stats": "1.3万赞 5171收藏", - "desc": "正文摘要,支持\\n换行", - "images": ["url1", "url2", ...], - "per_image_text": { - "1": "第2张图的说明文字(0-indexed)", - "3": "第4张图的说明文字" - } - }, - ... -] - -per_image_text 可选:如果原帖文字明确指向某张图,可以把说明放在对应图片上。 -未指定 per_image_text 时,所有文字放在该帖第一张图前的文字块中。 -""" - -import argparse -import json -import os -import sys -import tempfile -import urllib.request -from PIL import Image, ImageDraw, ImageFont - -# --- 配置 --- -WIDTH = 800 -PAD = 24 -LINE_SPACE = 10 -FONT_CANDIDATES = [ - "/System/Library/Fonts/STHeiti Medium.ttc", - "/System/Library/Fonts/Hiragino Sans GB.ttc", - "/System/Library/Fonts/Supplemental/Arial Unicode.ttf", - "/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc", - "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", -] - - -def find_font(): - for path in FONT_CANDIDATES: - if os.path.exists(path): - return path - return None - - -def load_font(path, size): - if path: - try: - return ImageFont.truetype(path, size, index=0) - except Exception: - pass - return ImageFont.load_default() - - -def wrap_text(text, font, max_width, draw): - lines = [] - for paragraph in text.split("\n"): - paragraph = paragraph.strip() - if not paragraph: - continue - current = "" - for char in paragraph: - test = current + char - bbox = draw.textbbox((0, 0), test, font=font) - if bbox[2] - bbox[0] > max_width: - if current: - lines.append(current) - current = char - else: - current = test - if current: - lines.append(current) - return lines - - -def draw_lines(draw, lines, font, x, y, fill): - for line in lines: - draw.text((x, y), line, font=font, fill=fill) - bbox = draw.textbbox((0, 0), line, font=font) - y += (bbox[3] - bbox[1]) + LINE_SPACE - return y - - -def measure_lines(lines, font, draw): - h = 0 - for line in lines: - bbox = draw.textbbox((0, 0), line if line else " ", font=font) - h += (bbox[3] - bbox[1]) + LINE_SPACE - return h - - -def make_text_block(title, author_line, desc, font_path, width): - """白底黑字文字块,模仿小红书原样""" - title_font = load_font(font_path, 32) - author_font = load_font(font_path, 20) - body_font = load_font(font_path, 24) - - tmp = Image.new("RGB", (width, 10)) - draw = ImageDraw.Draw(tmp) - max_w = width - PAD * 2 - - title_lines = wrap_text(title, title_font, max_w, draw) - author_lines = [author_line] if author_line else [] - desc_lines = wrap_text(desc, body_font, max_w, draw) if desc else [] - - # 计算高度 - total_h = PAD - total_h += measure_lines(title_lines, title_font, draw) - if author_lines: - total_h += 4 - total_h += measure_lines(author_lines, author_font, draw) - if desc_lines: - total_h += 8 - total_h += measure_lines(desc_lines, body_font, draw) - total_h += PAD - - # 绘制 - block = Image.new("RGB", (width, total_h), (255, 255, 255)) - draw = ImageDraw.Draw(block) - - y = PAD - y = draw_lines(draw, title_lines, title_font, PAD, y, (33, 33, 33)) - if author_lines: - y += 4 - y = draw_lines(draw, author_lines, author_font, PAD, y, (153, 153, 153)) - if desc_lines: - y += 8 - y = draw_lines(draw, desc_lines, body_font, PAD, y, (66, 66, 66)) - - return block - - -def make_image_caption(text, font_path, width): - """图片上方的小说明文字块""" - font = load_font(font_path, 20) - tmp = Image.new("RGB", (width, 10)) - draw = ImageDraw.Draw(tmp) - lines = wrap_text(text, font, width - PAD * 2, draw) - - h = PAD + measure_lines(lines, font, draw) + 8 - block = Image.new("RGB", (width, h), (245, 245, 245)) - draw = ImageDraw.Draw(block) - draw_lines(draw, lines, font, PAD, PAD // 2, (100, 100, 100)) - return block - - -def download_image(url, tmpdir, idx): - """下载图片到临时目录""" - ext = ".webp" - path = os.path.join(tmpdir, f"img_{idx}{ext}") - try: - req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - with urllib.request.urlopen(req, timeout=30) as resp: - with open(path, "wb") as f: - f.write(resp.read()) - return path - except Exception as e: - print(f" 警告: 下载失败 {url[:60]}... ({e})", file=sys.stderr) - return None - - -def main(): - parser = argparse.ArgumentParser(description="小红书帖子长图导出") - parser.add_argument("--posts", help="Posts JSON string") - parser.add_argument("--posts-file", help="Posts JSON file path") - parser.add_argument("--output", "-o", required=True, help="Output JPG path") - parser.add_argument("--width", type=int, default=800, help="Image width (default 800)") - parser.add_argument("--quality", type=int, default=88, help="JPEG quality (default 88)") - args = parser.parse_args() - - global WIDTH - WIDTH = args.width - - # 读取 posts 数据 - if args.posts: - posts = json.loads(args.posts) - elif args.posts_file: - with open(args.posts_file, "r") as f: - posts = json.load(f) - else: - print("错误: 需要 --posts 或 --posts-file", file=sys.stderr) - sys.exit(1) - - font_path = find_font() - if not font_path: - print("警告: 未找到中文字体,文字可能显示异常", file=sys.stderr) - - sep = Image.new("RGB", (WIDTH, 3), (230, 230, 230)) - pieces = [] - - with tempfile.TemporaryDirectory() as tmpdir: - img_counter = 0 - for pi, post in enumerate(posts): - title = post.get("title", "") - author = post.get("author", "") - stats = post.get("stats", "") - desc = post.get("desc", "") - images = post.get("images", []) - per_image_text = post.get("per_image_text", {}) - - # 作者行 - author_line = author - if stats: - author_line = f"{author} · {stats}" if author else stats - - # 主文字块 - text_block = make_text_block(title, author_line, desc, font_path, WIDTH) - pieces.append(text_block) - - # 图片 - for i, url in enumerate(images): - # 是否有针对这张图的说明 - img_key = str(i) - if img_key in per_image_text: - caption_block = make_image_caption(per_image_text[img_key], font_path, WIDTH) - pieces.append(caption_block) - - img_path = download_image(url, tmpdir, img_counter) - img_counter += 1 - if img_path: - try: - im = Image.open(img_path).convert("RGB") - ratio = WIDTH / im.width - im = im.resize((WIDTH, int(im.height * ratio)), Image.LANCZOS) - pieces.append(im) - except Exception as e: - print(f" 警告: 图片处理失败 ({e})", file=sys.stderr) - - # 帖子间分隔线 - if pi < len(posts) - 1: - pieces.append(sep) - - if not pieces: - print("错误: 没有内容可拼接", file=sys.stderr) - sys.exit(1) - - total_h = sum(p.height for p in pieces) - long_img = Image.new("RGB", (WIDTH, total_h), (255, 255, 255)) - y = 0 - for p in pieces: - long_img.paste(p, (0, y)) - y += p.height - - long_img.save(args.output, "JPEG", quality=args.quality) - print(f"完成: {args.output} ({WIDTH}x{total_h})") - - -if __name__ == "__main__": - main() diff --git a/.agents/skills/xiaohongshu/scripts/export-long-image.sh b/.agents/skills/xiaohongshu/scripts/export-long-image.sh deleted file mode 100755 index 556e455..0000000 --- a/.agents/skills/xiaohongshu/scripts/export-long-image.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# 小红书帖子导出长图 -# -# 用法: -# ./export-long-image.sh --posts-file posts.json -o output.jpg -# ./export-long-image.sh --posts '' -o output.jpg -# -# posts.json 示例: -# [ -# { -# "title": "帖子标题", -# "author": "作者", -# "stats": "1.3万赞 100收藏", -# "desc": "正文摘要", -# "images": ["https://...webp", "https://...webp"] -# } -# ] - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -python3 "$SCRIPT_DIR/export-long-image.py" "$@" diff --git a/.agents/skills/xiaohongshu/scripts/install-check.sh b/.agents/skills/xiaohongshu/scripts/install-check.sh deleted file mode 100755 index ad05126..0000000 --- a/.agents/skills/xiaohongshu/scripts/install-check.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -# 检查小红书 MCP 依赖是否已安装 - -set -e - -echo "检查小红书 MCP 依赖..." -echo "" - -XHS_MCP="$HOME/.local/bin/xiaohongshu-mcp" -XHS_LOGIN="$HOME/.local/bin/xiaohongshu-login" - -check_binary() { - local name="$1" - local path="$2" - if [ -f "$path" ]; then - echo "✅ $name: $path" - return 0 - else - echo "❌ $name: 未找到" - return 1 - fi -} - -MISSING=0 - -check_binary "xiaohongshu-mcp" "$XHS_MCP" || MISSING=1 -check_binary "xiaohongshu-login" "$XHS_LOGIN" || MISSING=1 - -echo "" - -# 检查 jq(必需,用于安全构建 JSON) -if command -v jq &> /dev/null; then - echo "✅ jq: $(which jq)" -else - echo "❌ jq: 未安装(必需,用于安全构建 JSON)" - echo " 安装: apt-get install jq / brew install jq" - MISSING=1 -fi - -# 检查 Python3(track-topic.py 需要) -if command -v python3 &> /dev/null; then - echo "✅ python3: $(python3 --version)" -else - echo "⚠️ python3: 未安装(热点跟踪功能需要)" -fi - -echo "" - -if [ $MISSING -eq 1 ]; then - echo "==========================================" - echo "缺少必要依赖,请按以下步骤安装:" - echo "" - echo "1. 从 GitHub Releases 下载对应平台的二进制文件:" - echo " https://github.com/xpzouying/xiaohongshu-mcp/releases" - echo "" - echo "2. 解压并安装到 ~/.local/bin/:" - echo " mkdir -p ~/.local/bin" - echo " mv xiaohongshu-mcp-linux-amd64 ~/.local/bin/xiaohongshu-mcp" - echo " mv xiaohongshu-login-linux-amd64 ~/.local/bin/xiaohongshu-login" - echo " chmod +x ~/.local/bin/xiaohongshu-*" - echo "" - echo "3. 确保 ~/.local/bin 在 PATH 中(可选)" - echo "==========================================" - exit 1 -else - echo "✅ 所有依赖已就绪" -fi diff --git a/.agents/skills/xiaohongshu/scripts/login.sh b/.agents/skills/xiaohongshu/scripts/login.sh deleted file mode 100755 index 6206621..0000000 --- a/.agents/skills/xiaohongshu/scripts/login.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# 启动小红书登录工具 - -XHS_LOGIN="$HOME/.local/bin/xiaohongshu-login" - -echo "启动小红书登录工具..." -echo "注意:需要桌面环境或 X11 转发" -echo "" - -"$XHS_LOGIN" diff --git a/.agents/skills/xiaohongshu/scripts/mcp-call.sh b/.agents/skills/xiaohongshu/scripts/mcp-call.sh deleted file mode 100755 index a081b41..0000000 --- a/.agents/skills/xiaohongshu/scripts/mcp-call.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# 通用 MCP 调用脚本(支持 Streamable HTTP + Session ID) - -set -e - -TOOL_NAME="$1" -TOOL_ARGS="$2" -MCP_URL="${MCP_URL:-http://localhost:18060/mcp}" -export no_proxy="${no_proxy:+$no_proxy,}localhost,127.0.0.1" - -# 检查 jq 依赖 -if ! command -v jq &> /dev/null; then - echo "错误: 需要安装 jq (apt-get install jq / brew install jq)" - exit 1 -fi - -if [ -z "$TOOL_NAME" ]; then - echo "用法: $0 [json_args]" - echo "" - echo "可用工具:" - echo " check_login_status - 检查登录状态" - echo " search_feeds - 搜索内容 {\"keyword\": \"...\", \"filters\": {\"sort_by\": \"最新\"}}" - echo " list_feeds - 获取首页推荐" - echo " get_feed_detail - 获取帖子详情 {\"feed_id\": \"...\", \"xsec_token\": \"...\"}" - echo " post_comment_to_feed - 发表评论 {\"feed_id\": \"...\", \"xsec_token\": \"...\", \"content\": \"...\"}" - echo " reply_comment_in_feed - 回复评论 {\"feed_id\": \"...\", \"xsec_token\": \"...\", \"content\": \"...\", \"comment_id\": \"...\", \"user_id\": \"...\"}" - echo " user_profile - 获取用户主页 {\"user_id\": \"...\", \"xsec_token\": \"...\"}" - echo " like_feed - 点赞 {\"feed_id\": \"...\", \"xsec_token\": \"...\"} 取消: {\"unlike\": true}" - echo " favorite_feed - 收藏 {\"feed_id\": \"...\", \"xsec_token\": \"...\"} 取消: {\"unfavorite\": true}" - echo " get_login_qrcode - 获取登录二维码" - echo " delete_cookies - 删除 cookies,重置登录状态" - echo " publish_content - 发布图文" - echo " publish_with_video - 发布视频" - exit 1 -fi - -# 校验 tool name,只允许字母数字和下划线 -if [[ ! "$TOOL_NAME" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then - echo "错误: 无效的工具名: $TOOL_NAME" - exit 1 -fi - -[ -z "$TOOL_ARGS" ] && TOOL_ARGS="{}" - -# 校验 TOOL_ARGS 是合法 JSON -if ! echo "$TOOL_ARGS" | jq empty 2>/dev/null; then - echo "错误: 参数不是合法的 JSON: $TOOL_ARGS" - exit 1 -fi - -# 1. Initialize 并获取 Session ID -INIT_RESPONSE=$(curl --noproxy '*' -s -i -X POST "$MCP_URL" \ - -H "Content-Type: application/json" \ - -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"openclaw","version":"1.0"}}}') - -SESSION_ID=$(echo "$INIT_RESPONSE" | grep -i "Mcp-Session-Id" | awk '{print $2}' | tr -d '\r\n') - -if [ -z "$SESSION_ID" ]; then - echo "错误: 无法获取 MCP Session ID" - echo "请确保 MCP 服务正在运行: ./start-mcp.sh" - exit 1 -fi - -# 2. Initialized notification -curl --noproxy '*' -s -X POST "$MCP_URL" \ - -H "Content-Type: application/json" \ - -H "Mcp-Session-Id: $SESSION_ID" \ - -d '{"jsonrpc":"2.0","method":"notifications/initialized"}' > /dev/null - -# 3. Call tool — 使用 jq 安全构建 JSON,避免 shell 注入 -CALL_PAYLOAD=$(jq -n \ - --arg name "$TOOL_NAME" \ - --argjson args "$TOOL_ARGS" \ - '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":$name,"arguments":$args}}') - -RESULT=$(curl --noproxy '*' -s --max-time 120 -X POST "$MCP_URL" \ - -H "Content-Type: application/json" \ - -H "Mcp-Session-Id: $SESSION_ID" \ - -d "$CALL_PAYLOAD") - -# 输出结果 -echo "$RESULT" | jq . diff --git a/.agents/skills/xiaohongshu/scripts/post-detail.sh b/.agents/skills/xiaohongshu/scripts/post-detail.sh deleted file mode 100755 index 033fc4a..0000000 --- a/.agents/skills/xiaohongshu/scripts/post-detail.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# 获取小红书帖子详情 - -NOTE_ID="$1" -XSEC_TOKEN="$2" - -if [ -z "$NOTE_ID" ] || [ -z "$XSEC_TOKEN" ]; then - echo "用法: $0 " - echo "" - echo "note_id 和 xsec_token 可从搜索或推荐结果中获取" - exit 1 -fi - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ARGS=$(jq -n --arg fid "$NOTE_ID" --arg tok "$XSEC_TOKEN" \ - '{"feed_id":$fid,"xsec_token":$tok}') -"$SCRIPT_DIR/mcp-call.sh" get_feed_detail "$ARGS" diff --git a/.agents/skills/xiaohongshu/scripts/recommend.sh b/.agents/skills/xiaohongshu/scripts/recommend.sh deleted file mode 100755 index b93ec1f..0000000 --- a/.agents/skills/xiaohongshu/scripts/recommend.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# 获取小红书首页推荐列表 - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -"$SCRIPT_DIR/mcp-call.sh" list_feeds diff --git a/.agents/skills/xiaohongshu/scripts/search.sh b/.agents/skills/xiaohongshu/scripts/search.sh deleted file mode 100755 index 9a9ed79..0000000 --- a/.agents/skills/xiaohongshu/scripts/search.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# 搜索小红书内容 - -KEYWORD="$1" - -if [ -z "$KEYWORD" ]; then - echo "用法: $0 <关键词>" - exit 1 -fi - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ARGS=$(jq -n --arg kw "$KEYWORD" '{"keyword":$kw}') -"$SCRIPT_DIR/mcp-call.sh" search_feeds "$ARGS" diff --git a/.agents/skills/xiaohongshu/scripts/start-mcp.sh b/.agents/skills/xiaohongshu/scripts/start-mcp.sh deleted file mode 100755 index bd7a413..0000000 --- a/.agents/skills/xiaohongshu/scripts/start-mcp.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/bin/bash -# 启动小红书 MCP 服务 - -XHS_MCP="$HOME/.local/bin/xiaohongshu-mcp" -PID_FILE="$HOME/.xiaohongshu/mcp.pid" -LOG_FILE="$HOME/.xiaohongshu/mcp.log" -XVFB_PID_FILE="$HOME/.xiaohongshu/xvfb.pid" -XVFB_DISPLAY_FILE="$HOME/.xiaohongshu/xvfb.display" - -# Cookies 路径(可通过环境变量覆盖) -# XHS_COOKIES_SRC: 源 cookies 文件(用于远程服务器场景) -# 默认检查 ~/cookies.json 和 ~/.xiaohongshu/cookies.json -COOKIES_DST="/tmp/cookies.json" - -mkdir -p "$HOME/.xiaohongshu" - -# 检测是否有显示器(桌面环境) -has_display() { - [ -n "$DISPLAY" ] && xdpyinfo >/dev/null 2>&1 -} - -# 在无桌面环境下自动启动 Xvfb -ensure_display() { - if has_display; then - return 0 - fi - - # 已有 Xvfb 在运行 - if [ -f "$XVFB_PID_FILE" ]; then - local pid - pid=$(cat "$XVFB_PID_FILE") - if kill -0 "$pid" 2>/dev/null; then - export DISPLAY=$(cat "$XVFB_DISPLAY_FILE" 2>/dev/null || echo ":99") - echo "复用已有 Xvfb (PID: $pid, DISPLAY=$DISPLAY)" - return 0 - fi - fi - - # 检查 Xvfb 是否安装 - if ! command -v Xvfb >/dev/null 2>&1; then - echo "⚠ 未检测到桌面环境,且未安装 Xvfb。" - echo " 请安装:sudo apt-get install -y xvfb" - echo " 安装后重新运行本脚本即可自动配置。" - exit 1 - fi - - echo "未检测到桌面环境,自动启动 Xvfb 虚拟显示..." - - # 自动选择可用的 display 号(99-109) - local display_num="" - local d - for d in $(seq 99 109); do - if [ ! -e "/tmp/.X${d}-lock" ]; then - display_num=$d - break - fi - # 锁文件存在但进程已死,尝试清理后使用 - local lock_pid - lock_pid=$(cat "/tmp/.X${d}-lock" 2>/dev/null | tr -d ' ') - if [ -n "$lock_pid" ] && ! kill -0 "$lock_pid" 2>/dev/null; then - rm -f "/tmp/.X${d}-lock" "/tmp/.X11-unix/X${d}" 2>/dev/null - if [ ! -e "/tmp/.X${d}-lock" ]; then - display_num=$d - break - fi - fi - done - - if [ -z "$display_num" ]; then - echo "✗ 无法找到可用的 display 号(:99-:109 均被占用)" - exit 1 - fi - - # -ac: 关闭访问控制,允许 chromium 连接虚拟显示(仅用于 headless 自动化) - Xvfb ":${display_num}" -screen 0 1024x768x24 -ac >/dev/null 2>&1 & - echo $! > "$XVFB_PID_FILE" - echo ":${display_num}" > "$XVFB_DISPLAY_FILE" - export DISPLAY=":${display_num}" - sleep 1 - - if kill -0 "$(cat "$XVFB_PID_FILE")" 2>/dev/null; then - echo "✓ Xvfb 已启动 (DISPLAY=:${display_num})" - else - echo "✗ Xvfb 启动失败" - exit 1 - fi -} - -# 同步 cookies(支持多个可能的来源) -sync_cookies() { - local src="" - - # 优先使用环境变量指定的路径 - if [ -n "$XHS_COOKIES_SRC" ] && [ -f "$XHS_COOKIES_SRC" ]; then - src="$XHS_COOKIES_SRC" - elif [ -f "$HOME/cookies.json" ]; then - src="$HOME/cookies.json" - elif [ -f "$HOME/.xiaohongshu/cookies.json" ]; then - src="$HOME/.xiaohongshu/cookies.json" - fi - - if [ -n "$src" ]; then - if [ ! -f "$COOKIES_DST" ] || [ "$src" -nt "$COOKIES_DST" ]; then - install -m 600 "$src" "$COOKIES_DST" - echo "已同步 cookies: $src -> $COOKIES_DST" - fi - else - # 确保已有的 cookies 文件权限正确 - [ -f "$COOKIES_DST" ] && chmod 600 "$COOKIES_DST" - fi -} - -sync_cookies -ensure_display - -# 检查是否已在运行 -if [ -f "$PID_FILE" ]; then - PID=$(cat "$PID_FILE") - if kill -0 "$PID" 2>/dev/null; then - echo "MCP 服务已在运行 (PID: $PID)" - echo "如需重启,请先运行 stop-mcp.sh" - exit 0 - fi -fi - -# 解析参数 -HEADLESS="true" -PORT="${XHS_MCP_PORT:-18060}" -for arg in "$@"; do - case $arg in - --headless=false) - HEADLESS="false" - ;; - --port=*) - PORT="${arg#*=}" - ;; - esac -done - -# 校验端口号 -if [[ ! "$PORT" =~ ^[0-9]+$ ]]; then - echo "错误: 无效端口号: $PORT" - exit 1 -fi - -# 启动服务 -echo "启动小红书 MCP 服务..." -if [ "$HEADLESS" = "false" ]; then - nohup "$XHS_MCP" -port ":${PORT}" -headless=false > "$LOG_FILE" 2>&1 & -else - nohup "$XHS_MCP" -port ":${PORT}" > "$LOG_FILE" 2>&1 & -fi - -echo $! > "$PID_FILE" -sleep 2 - -# 验证启动 -if kill -0 $(cat "$PID_FILE") 2>/dev/null; then - echo "✓ MCP 服务已启动 (PID: $(cat $PID_FILE))" - echo " 端点: http://localhost:${PORT}/mcp" - echo " 日志: $LOG_FILE" -else - echo "✗ 启动失败,查看日志: $LOG_FILE" - cat "$LOG_FILE" - exit 1 -fi diff --git a/.agents/skills/xiaohongshu/scripts/status.sh b/.agents/skills/xiaohongshu/scripts/status.sh deleted file mode 100755 index 567a603..0000000 --- a/.agents/skills/xiaohongshu/scripts/status.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# 检查小红书登录状态 - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -"$SCRIPT_DIR/mcp-call.sh" check_login_status diff --git a/.agents/skills/xiaohongshu/scripts/stop-mcp.sh b/.agents/skills/xiaohongshu/scripts/stop-mcp.sh deleted file mode 100755 index 88474a7..0000000 --- a/.agents/skills/xiaohongshu/scripts/stop-mcp.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# 停止小红书 MCP 服务 - -PID_FILE="$HOME/.xiaohongshu/mcp.pid" -XVFB_PID_FILE="$HOME/.xiaohongshu/xvfb.pid" - -if [ -f "$PID_FILE" ]; then - PID=$(cat "$PID_FILE") - if kill -0 "$PID" 2>/dev/null; then - kill "$PID" - rm -f "$PID_FILE" - echo "✓ MCP 服务已停止" - else - echo "进程不存在,清理 PID 文件" - rm -f "$PID_FILE" - fi -else - echo "MCP 服务未运行" -fi - -# 清理 Xvfb -if [ -f "$XVFB_PID_FILE" ]; then - XVFB_PID=$(cat "$XVFB_PID_FILE") - if kill -0 "$XVFB_PID" 2>/dev/null; then - kill "$XVFB_PID" - echo "✓ Xvfb 已停止" - fi - rm -f "$XVFB_PID_FILE" "$HOME/.xiaohongshu/xvfb.display" -fi diff --git a/.agents/skills/xiaohongshu/scripts/track-topic.py b/.agents/skills/xiaohongshu/scripts/track-topic.py deleted file mode 100755 index 231e68c..0000000 --- a/.agents/skills/xiaohongshu/scripts/track-topic.py +++ /dev/null @@ -1,313 +0,0 @@ -#!/usr/bin/env python3 -""" -小红书热点跟踪工具 - -用法: - python track-topic.py <话题> [--limit N] [--feishu] [--output FILE] - -示例: - python track-topic.py "DeepSeek" --limit 5 --feishu - python track-topic.py "春节旅游" --limit 10 --output report.md -""" - -import argparse -import json -import subprocess -import sys -import os -from datetime import datetime -from pathlib import Path - -# 获取脚本目录 -SCRIPT_DIR = Path(__file__).parent.resolve() -XHS_SCRIPTS = SCRIPT_DIR # 现在就在 xiaohongshu/scripts 目录下 - -# 飞书 skill 路径(支持多种可能的位置) -def find_feishu_scripts() -> Path: - """查找 feishu-docs skill 的 scripts 目录""" - # 只允许在已知的 skill 目录中查找 - allowed_roots = [ - SCRIPT_DIR.parent.parent, # 同级 skill 目录 - Path.home() / ".openclaw" / "workspace" / "skills", - Path.home() / ".claude" / "skills", - ] - for root in allowed_roots: - candidate = (root / "feishu-docs" / "scripts").resolve() - # 校验解析后的路径仍在允许的根目录下(防止符号链接逃逸) - if candidate.is_dir() and any( - str(candidate).startswith(str(r.resolve()) + os.sep) for r in allowed_roots - ): - return candidate - return allowed_roots[0] / "feishu-docs" / "scripts" # 返回默认路径(可能不存在) - -FEISHU_SCRIPTS = find_feishu_scripts() - - -def call_xhs_mcp(tool: str, args: dict) -> dict: - """调用小红书 MCP 工具""" - mcp_call = XHS_SCRIPTS / "mcp-call.sh" - if not mcp_call.exists(): - print(f"❌ 找不到 xiaohongshu skill: {mcp_call}", file=sys.stderr) - sys.exit(1) - - result = subprocess.run( - [str(mcp_call), tool, json.dumps(args)], - capture_output=True, text=True, timeout=120 - ) - - if result.returncode != 0: - print(f"❌ MCP 调用失败: {result.stderr}", file=sys.stderr) - return {} - - try: - response = json.loads(result.stdout) - if "result" in response and "content" in response["result"]: - text = response["result"]["content"][0].get("text", "{}") - return json.loads(text) if text else {} - elif "error" in response: - print(f"⚠️ MCP 错误: {response['error'].get('message', 'Unknown')}", file=sys.stderr) - return {} - return response - except json.JSONDecodeError: - return {} - - -def search_feeds(keyword: str) -> list: - """搜索小红书内容""" - print(f"🔍 搜索: {keyword}") - result = call_xhs_mcp("search_feeds", {"keyword": keyword}) - feeds = result.get("feeds", []) - # 过滤掉 hot_query 类型 - return [f for f in feeds if f.get("modelType") == "note"] - - -def get_feed_detail(feed_id: str, xsec_token: str, load_comments: bool = True) -> dict: - """获取帖子详情""" - args = { - "feed_id": feed_id, - "xsec_token": xsec_token, - "load_all_comments": load_comments - } - result = call_xhs_mcp("get_feed_detail", args) - return result.get("data", {}) - - -def format_timestamp(ts: int) -> str: - """格式化时间戳""" - if not ts: - return "未知" - try: - dt = datetime.fromtimestamp(ts / 1000) - return dt.strftime("%Y-%m-%d %H:%M") - except: - return "未知" - - -def get_comments_list(post: dict) -> list: - """安全地获取评论列表""" - comments = post.get("comments", {}) - if isinstance(comments, dict): - return comments.get("list", []) - elif isinstance(comments, list): - return comments - return [] - - -def generate_report(keyword: str, posts: list) -> str: - """生成 Markdown 报告""" - now = datetime.now().strftime("%Y-%m-%d %H:%M") - - report = f"""# 🔥 小红书热点跟踪报告 - -**话题:** {keyword} -**生成时间:** {now} -**收录帖子:** {len(posts)} 篇 - ---- - -## 📊 概览 - -""" - - # 统计信息 - total_likes = sum(int(p.get("note", {}).get("interactInfo", {}).get("likedCount", 0) or 0) for p in posts) - total_comments = sum(len(get_comments_list(p)) for p in posts) - - report += f"""| 指标 | 数值 | -|------|------| -| 总帖子数 | {len(posts)} | -| 总点赞数 | {total_likes:,} | -| 总评论数 | {total_comments} | - ---- - -## 📝 热帖详情 - -""" - - for i, post in enumerate(posts, 1): - note = post.get("note", {}) - comments = get_comments_list(post) - - title = note.get("title", "无标题") - desc = note.get("desc", "") - user = note.get("user", {}).get("nickname", "匿名") - time_str = format_timestamp(note.get("time")) - interact = note.get("interactInfo", {}) - likes = interact.get("likedCount", "0") - collected = interact.get("collectedCount", "0") - - report += f"""### {i}. {title} - -**作者:** {user} -**时间:** {time_str} -**互动:** ❤️ {likes} 赞 · ⭐ {collected} 收藏 - -**正文:** - -> {desc[:500]}{"..." if len(desc) > 500 else ""} - -""" - - if comments: - report += f"""**热门评论 ({len(comments)} 条):** - -""" - for j, comment in enumerate(list(comments)[:5], 1): - c_user = comment.get("userInfo", {}).get("nickname", "匿名") - c_content = comment.get("content", "") - c_likes = comment.get("likeCount", 0) - report += f"- **{c_user}** ({c_likes}赞): {c_content[:100]}\n" - - if len(comments) > 5: - report += f"- *... 还有 {len(comments) - 5} 条评论*\n" - - report += "\n---\n\n" - - # 评论区热点总结 - report += """## 💬 评论区热点关键词 - -""" - - # 简单的关键词提取(统计高频词) - all_comments = [] - for post in posts: - for c in get_comments_list(post): - all_comments.append(c.get("content", "")) - - if all_comments: - report += f"共 {len(all_comments)} 条评论,主要讨论方向:\n\n" - # 这里可以做更复杂的 NLP 分析,暂时简化 - report += "- 用户对该话题的关注度较高\n" - report += "- 评论区互动活跃\n" - else: - report += "暂无足够评论数据进行分析\n" - - report += """ ---- - -## 📈 趋势分析 - -基于以上热帖和评论数据,该话题在小红书上呈现以下特点: - -1. **热度指数**: """ + ("🔥🔥🔥 高" if total_likes > 1000 else "🔥🔥 中" if total_likes > 100 else "🔥 低") + f""" -2. **互动活跃度**: """ + ("活跃" if total_comments > 50 else "一般" if total_comments > 10 else "较低") + """ -3. **内容类型**: 以图文笔记为主 - ---- - -*报告由 OpenClaw 小红书热点跟踪工具自动生成* -""" - - return report - - -def export_to_feishu(title: str, content: str) -> str: - """导出到飞书文档""" - import_script = FEISHU_SCRIPTS / "doc-import.sh" - if not import_script.exists(): - print(f"❌ 找不到 feishu-docs skill: {import_script}", file=sys.stderr) - return "" - - print("📤 导出到飞书文档...") - - # 写入临时文件 - tmp_file = Path("/tmp/xhs_report.md") - tmp_file.write_text(content, encoding="utf-8") - - result = subprocess.run( - [str(import_script), title, "--file", str(tmp_file)], - capture_output=True, text=True, timeout=60 - ) - - if result.returncode != 0: - print(f"⚠️ 飞书导出失败: {result.stderr}", file=sys.stderr) - return "" - - # 解析返回的文档链接 - output = result.stdout - print(output) - return output - - -def main(): - parser = argparse.ArgumentParser(description="小红书热点跟踪工具") - parser.add_argument("keyword", help="要跟踪的话题/关键词") - parser.add_argument("--limit", "-n", type=int, default=10, help="获取帖子数量 (默认 10)") - parser.add_argument("--feishu", "-f", action="store_true", help="导出到飞书文档") - parser.add_argument("--output", "-o", help="输出 Markdown 文件路径") - parser.add_argument("--no-comments", action="store_true", help="不获取评论") - - args = parser.parse_args() - - # 1. 搜索帖子 - feeds = search_feeds(args.keyword) - if not feeds: - print("❌ 未找到相关帖子") - sys.exit(1) - - print(f"✅ 找到 {len(feeds)} 条帖子") - - # 2. 获取详情 - posts = [] - for i, feed in enumerate(feeds[:args.limit]): - feed_id = feed.get("id") - xsec_token = feed.get("xsecToken") - title = feed.get("noteCard", {}).get("displayTitle", "") - - print(f"📖 [{i+1}/{min(len(feeds), args.limit)}] 获取: {title[:30]}...") - - detail = get_feed_detail(feed_id, xsec_token, not args.no_comments) - if detail: - posts.append(detail) - - if not posts: - print("❌ 未能获取帖子详情") - sys.exit(1) - - print(f"✅ 成功获取 {len(posts)} 篇帖子详情") - - # 3. 生成报告 - print("📝 生成报告...") - report = generate_report(args.keyword, posts) - - # 4. 输出 - if args.output: - output_path = Path(args.output) - output_path.write_text(report, encoding="utf-8") - print(f"✅ 报告已保存: {output_path}") - - if args.feishu: - doc_title = f"小红书热点跟踪: {args.keyword} ({datetime.now().strftime('%m-%d')})" - export_to_feishu(doc_title, report) - - if not args.output and not args.feishu: - # 默认输出到 stdout - print("\n" + "="*60 + "\n") - print(report) - - return report - - -if __name__ == "__main__": - main() diff --git a/.agents/skills/xiaohongshu/scripts/track-topic.sh b/.agents/skills/xiaohongshu/scripts/track-topic.sh deleted file mode 100755 index 1aef334..0000000 --- a/.agents/skills/xiaohongshu/scripts/track-topic.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# 小红书热点跟踪工具 - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -python3 "$SCRIPT_DIR/track-topic.py" "$@" diff --git a/.agents/skills/xiaohongshu/scripts/user-profile.sh b/.agents/skills/xiaohongshu/scripts/user-profile.sh deleted file mode 100755 index 14d0f07..0000000 --- a/.agents/skills/xiaohongshu/scripts/user-profile.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# 获取小红书用户主页 - -USER_ID="$1" -XSEC_TOKEN="$2" - -if [ -z "$USER_ID" ] || [ -z "$XSEC_TOKEN" ]; then - echo "用法: $0 " - echo "" - echo "user_id 和 xsec_token 可从搜索或推荐结果中获取" - exit 1 -fi - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ARGS=$(jq -n --arg uid "$USER_ID" --arg tok "$XSEC_TOKEN" \ - '{"user_id":$uid,"xsec_token":$tok}') -"$SCRIPT_DIR/mcp-call.sh" user_profile "$ARGS" diff --git a/.agents/skills/xiaohongshu/tools/xhs-downloader/README.md b/.agents/skills/xiaohongshu/tools/xhs-downloader/README.md deleted file mode 100644 index e403e68..0000000 --- a/.agents/skills/xiaohongshu/tools/xhs-downloader/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# XHS-Downloader 辅助工具 - -配合 [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader) 使用的工具脚本,用于下载小红书收藏/点赞笔记并导出为 OpenClaw 记忆库格式。 - -## 依赖 - -需要先安装 XHS-Downloader: - -```bash -git clone https://github.com/JoeanAmier/XHS-Downloader.git -cd XHS-Downloader -pip install -r requirements.txt -``` - -## 使用流程 - -### 1. 获取收藏/点赞链接(使用油猴脚本) - -手动复制链接效率低,推荐使用 XHS-Downloader 提供的油猴脚本批量提取: - -**安装脚本:** - -1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展 -2. 安装用户脚本:[XHS-Downloader.js](https://raw.githubusercontent.com/JoeanAmier/XHS-Downloader/refs/heads/master/static/XHS-Downloader.js) - -**提取链接:** - -1. 打开 [小红书网页版](https://www.xiaohongshu.com) 并登录 -2. 进入个人主页 → **收藏** 或 **点赞** 页面 -3. 点击 Tampermonkey 图标,选择: - - `提取收藏作品链接` - - `提取点赞作品链接` -4. 脚本会自动滚动页面加载全部内容 -5. 提取完成后链接自动复制到剪贴板 - -**保存链接:** - -将剪贴板内容粘贴到 `links.md` 文件: - -``` -https://www.xiaohongshu.com/explore/xxx?xsec_token=... -https://www.xiaohongshu.com/explore/yyy?xsec_token=... -``` - -> **注意**:自动滚动功能默认关闭,需在脚本设置中手动开启。开启后可能触发风控,建议适度使用。 - -### 2. 批量下载 - -```bash -# 在 XHS-Downloader 目录下运行 -python batch_download.py links.md -``` - -下载的数据会保存到 `Volume/Download/ExploreData.db`。 - -### 3. 导出记忆库 - -**方式 A:导出为单文件** - -```bash -python export_memory.py -# 生成 xhs_memory.md -``` - -**方式 B:导出为多文件(推荐用于 OpenClaw)** - -```bash -python export_to_workspace.py -# 生成到 ~/.openclaw/workspace/xhs-memory/ -``` - -### 4. 配置 OpenClaw 记忆搜索 - -编辑 `~/.openclaw/openclaw.json`,添加: - -```json -{ - "memorySearch": { - "extraPaths": [ - "~/.openclaw/workspace/xhs-memory" - ] - } -} -``` - -或者如果使用单文件导出,将 `xhs_memory.md` 放到 workspace 目录下。 - -## 脚本说明 - -| 脚本 | 功能 | -|------|------| -| `batch_download.py` | 批量下载笔记并记录到数据库 | -| `export_memory.py` | 导出为单个 Markdown 文件 | -| `export_to_workspace.py` | 导出为多个独立文件(按日期+标题命名) | - -## 致谢 - -- [XHS-Downloader](https://github.com/JoeanAmier/XHS-Downloader) - GPL-3.0 License diff --git a/.agents/skills/xiaohongshu/tools/xhs-downloader/batch_download.py b/.agents/skills/xiaohongshu/tools/xhs-downloader/batch_download.py deleted file mode 100644 index b68f513..0000000 --- a/.agents/skills/xiaohongshu/tools/xhs-downloader/batch_download.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -""" -批量下载小红书笔记 - -用法: - python batch_download.py [links_file] - -默认读取当前目录的 links.md 文件 -""" -import asyncio -import sys -from pathlib import Path - -try: - from source import XHS -except ImportError: - print("错误: 请在 XHS-Downloader 项目目录下运行此脚本") - print("或安装依赖: pip install -e /path/to/XHS-Downloader") - sys.exit(1) - - -async def main(): - # 读取链接文件 - links_file = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("links.md") - - if not links_file.exists(): - print(f"错误: 链接文件不存在: {links_file}") - print("用法: python batch_download.py [links_file]") - sys.exit(1) - - links = links_file.read_text().strip() - link_count = len([l for l in links.split() if l.startswith("http")]) - - print(f"开始下载,共 {link_count} 个链接...") - - async with XHS( - work_path="./Volume", - folder_name="Download", - record_data=True, # 记录作品数据到数据库 - download_record=True, # 跳过已下载 - author_archive=True, # 按作者分文件夹 - ) as xhs: - result = await xhs.extract(links, download=True) - print(f"完成!处理了 {len(result)} 个作品") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/.agents/skills/xiaohongshu/tools/xhs-downloader/export_memory.py b/.agents/skills/xiaohongshu/tools/xhs-downloader/export_memory.py deleted file mode 100644 index 1021f47..0000000 --- a/.agents/skills/xiaohongshu/tools/xhs-downloader/export_memory.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python -""" -从 XHS-Downloader 数据库导出笔记到单个 Markdown 文件 - -用法: - python export_memory.py [db_path] [output_file] - -默认: - db_path: Volume/Download/ExploreData.db - output_file: xhs_memory.md -""" -import sqlite3 -import sys -from pathlib import Path -from datetime import datetime - - -def export_memory(db_path: Path = None, output_file: Path = None): - db_path = db_path or Path("Volume/Download/ExploreData.db") - output_file = output_file or Path("xhs_memory.md") - - if not db_path.exists(): - print(f"错误: 数据库不存在: {db_path}") - return False - - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - - # 查询所有作品 - cursor.execute(""" - SELECT 作品标题, 发布时间, 作品链接, 作品描述, 作者昵称, 作品标签 - FROM explore_data - ORDER BY 发布时间 DESC - """) - - rows = cursor.fetchall() - conn.close() - - if not rows: - print("数据库为空") - return False - - # 生成 Markdown - output = f"# 小红书收藏/点赞笔记 Memory\n\n" - output += f"> 导出时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n" - output += f"> 共 {len(rows)} 条笔记\n\n---\n\n" - - for i, (title, time, link, desc, author, tags) in enumerate(rows, 1): - output += f"## {i}. {title or '无标题'}\n\n" - output += f"- **作者**: {author or '未知'}\n" - output += f"- **时间**: {time or '未知'}\n" - output += f"- **链接**: {link or '无'}\n" - if tags: - output += f"- **标签**: {tags}\n" - output += f"\n### 内容\n\n{desc or '无内容'}\n\n---\n\n" - - # 保存文件 - output_file.write_text(output, encoding="utf-8") - print(f"导出完成: {output_file.absolute()}") - print(f"共 {len(rows)} 条笔记") - return True - - -if __name__ == "__main__": - db_path = Path(sys.argv[1]) if len(sys.argv) > 1 else None - output_file = Path(sys.argv[2]) if len(sys.argv) > 2 else None - export_memory(db_path, output_file) diff --git a/.agents/skills/xiaohongshu/tools/xhs-downloader/export_to_workspace.py b/.agents/skills/xiaohongshu/tools/xhs-downloader/export_to_workspace.py deleted file mode 100644 index 68f9607..0000000 --- a/.agents/skills/xiaohongshu/tools/xhs-downloader/export_to_workspace.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -""" -将小红书笔记按单独文件导出到 OpenClaw workspace - -用法: - python export_to_workspace.py [db_path] [output_dir] - -默认: - db_path: Volume/Download/ExploreData.db - output_dir: ~/.openclaw/workspace/xhs-memory - -导出格式类似 gpt-history,每条笔记一个文件,文件名格式: YYYY-MM-标题.md -""" -import sqlite3 -import re -import sys -from pathlib import Path - - -def sanitize_filename(name: str, max_len: int = 50) -> str: - """清理文件名,移除非法字符""" - name = re.sub(r'[<>:"/\\|?*\n\r\t]', '', name) - name = re.sub(r'\s+', '-', name.strip()) - name = re.sub(r'-+', '-', name) - name = name.strip('-') - if len(name) > max_len: - name = name[:max_len].rstrip('-') - return name or "无标题" - - -def export_to_workspace(db_path: Path = None, output_dir: Path = None): - db_path = db_path or Path("Volume/Download/ExploreData.db") - output_dir = output_dir or Path.home() / ".openclaw/workspace/xhs-memory" - output_dir.mkdir(parents=True, exist_ok=True) - - if not db_path.exists(): - print(f"错误: 数据库不存在: {db_path}") - return False - - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - - cursor.execute(""" - SELECT 作品标题, 发布时间, 作品链接, 作品描述, 作者昵称, 作品标签 - FROM explore_data - ORDER BY 发布时间 DESC - """) - - rows = cursor.fetchall() - conn.close() - - if not rows: - print("数据库为空") - return False - - count = 0 - for title, time, link, desc, author, tags in rows: - # 解析时间: 2026-01-25_18:17:43 -> 2026-01 - if time: - date_prefix = time[:7] # YYYY-MM - full_date = time.replace('_', ' ') - else: - date_prefix = "unknown" - full_date = "未知" - - # 生成文件名 - safe_title = sanitize_filename(title or "无标题") - filename = f"{date_prefix}-{safe_title}.md" - filepath = output_dir / filename - - # 避免重复文件名 - counter = 1 - while filepath.exists(): - filename = f"{date_prefix}-{safe_title}-{counter}.md" - filepath = output_dir / filename - counter += 1 - - # 生成内容 - content = f"# {title or '无标题'}\n\n" - content += f"**来源**: 小红书收藏/点赞\n\n" - content += f"**日期**: {full_date}\n\n" - content += f"**作者**: {author or '未知'}\n\n" - content += f"**链接**: {link or '无'}\n\n" - if tags: - content += f"**标签**: {tags}\n\n" - content += "---\n\n" - content += "## 内容\n\n" - content += f"{desc or '无内容'}\n" - - filepath.write_text(content, encoding="utf-8") - count += 1 - - print(f"导出完成: {output_dir}") - print(f"共生成 {count} 个文件") - return True - - -if __name__ == "__main__": - db_path = Path(sys.argv[1]) if len(sys.argv) > 1 else None - output_dir = Path(sys.argv[2]) if len(sys.argv) > 2 else None - export_to_workspace(db_path, output_dir) diff --git a/.claude/skills/post-to-xhs/SKILL.md b/.claude/skills/post-to-xhs/SKILL.md new file mode 100644 index 0000000..bd0e69b --- /dev/null +++ b/.claude/skills/post-to-xhs/SKILL.md @@ -0,0 +1,86 @@ +--- +name: post-to-xhs +argument-hint: "[标题或内容描述]" +description: | + 发布内容到小红书,支持图文笔记和视频笔记。自动判断发布类型,校验标题和素材,用户确认后发布。 + 当用户想在小红书发布内容时使用——包括发笔记、发图文、发视频、上传图片、写一篇小红书、把内容发到红书上、种草笔记、好物分享等,即使用户只说"帮我发一下"但上下文明确是小红书也应触发。 +--- + +## 输入判断 + +根据用户提供的素材判断发布类型: +- 提供了视频文件 → 视频笔记 +- 提供了图片 → 图文笔记 +- 仅提供文本 → 提示用户至少提供图片或视频 + +## 约束 + +- 标题最多 20 个中文字或英文单词(小红书平台限制,超长会被截断) +- 图文笔记至少 1 张图片(小红书不允许纯文本笔记) +- 视频笔记仅支持本地视频文件绝对路径(MCP 服务需要读取本地文件) +- 图片和视频不能混用,只能二选一(小红书平台限制) +- 正文中不要包含 # 标签(标签通过 `tags` 参数单独传递,MCP 服务会自动处理格式) +- 发布前展示完整内容让用户确认(发布后无法撤回) + +## 执行流程 + +### 1. 收集发布信息 + +确保以下内容齐全: +- `title`(必填)— 标题 +- `content`(必填)— 正文 +- 图片列表或视频路径(必填其一) +- `tags`(可选)— 话题标签 +- `schedule_at`(可选)— 定时发布,ISO8601 格式 +- `is_original`(可选,仅图文)— 声明原创 +- `visibility`(可选)— 公开可见 | 仅自己可见 | 仅互关好友可见 + +信息不完整时,向用户询问缺少的部分。 + +### 2. 内容校验 + +- 检查标题长度(≤20 中文字) +- 检查图片/视频文件路径是否为绝对路径 +- 如用户提供 URL 内容,先用 WebFetch 提取文本和图片 + +### 3. 确认发布 + +向用户展示完整的发布内容预览: +- 标题、正文、标签 +- 图片列表或视频路径 +- 定时时间、可见范围(如有) + +等待用户确认后才执行发布。 + +### 4. 发布 + +**图文笔记** — 调用 `publish_content`: +- `title`(string,必填) +- `content`(string,必填) +- `images`(string[],必填)— 图片路径或 URL +- `tags`(string[],可选) +- `schedule_at`(string,可选) +- `is_original`(bool,可选) +- `visibility`(string,可选) + +**视频笔记** — 调用 `publish_with_video`: +- `title`(string,必填) +- `content`(string,必填) +- `video`(string,必填)— 本地视频绝对路径 +- `tags`(string[],可选) +- `schedule_at`(string,可选) +- `visibility`(string,可选) + +### 5. 报告结果 + +发布成功后,告知用户笔记 ID 和发布状态。 + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| 未登录 | 引导使用 xhs-login | +| 标题超长 | 提示用户缩短标题 | +| 图片路径无效 | 提示检查路径是否正确 | +| 视频使用了相对路径 | 提示改为绝对路径 | +| 发布失败 | 展示错误信息,建议检查内容或重试 | diff --git a/.claude/skills/setup-xhs-mcp/SKILL.md b/.claude/skills/setup-xhs-mcp/SKILL.md new file mode 100644 index 0000000..92ab64f --- /dev/null +++ b/.claude/skills/setup-xhs-mcp/SKILL.md @@ -0,0 +1,143 @@ +--- +name: setup-xhs-mcp +description: | + 安装部署 xiaohongshu-mcp 服务并配置 MCP 连接,引导用户完成从零到可用的全流程。 + 当用户第一次使用小红书功能、提到安装/部署/配置小红书、环境搭建、MCP 服务连接失败、或 check_login_status 等 MCP 工具不可用时使用。 +--- + +项目仓库:https://github.com/xpzouying/xiaohongshu-mcp + +## 执行流程 + +### 1. 检测服务状态 + +检查 xiaohongshu-mcp 是否已在运行(注意:MCP 端点只接受 POST,GET 会返回 405,不能用 `-f` 判断): + +```bash +curl -so /dev/null http://localhost:18060/mcp && echo "running" || echo "not running" +``` + +- 已运行 → 记录地址 `http://localhost:18060/mcp`,跳到步骤 3 +- 未运行 → 询问用户:服务是否部署在其他地址/端口? + - 用户提供地址 → 验证可达后跳到步骤 3 + - 未部署 → 进入步骤 2 + +### 2. 部署服务 + +确认操作系统(macOS / Linux / Windows)和是否已安装 Docker。 + +#### 方式一:Docker Compose(推荐) + +Docker 镜像内置 Chrome 和中文字体,无需额外配置。 + +```bash +# 下载 docker-compose.yml +wget https://raw.githubusercontent.com/xpzouying/xiaohongshu-mcp/main/docker/docker-compose.yml + +# 启动服务 +docker compose up -d + +# 查看日志 +docker compose logs -f +``` + +镜像源: +- Docker Hub(默认):`xpzouying/xiaohongshu-mcp` +- 阿里云(国内推荐):`crpi-hocnvtkomt7w9v8t.cn-beijing.personal.cr.aliyuncs.com/xpzouying/xiaohongshu-mcp` + +切换方法:编辑 docker-compose.yml,注释默认 image 行,取消注释阿里云 image 行。 + +数据持久化: +- `./data` — cookies 登录状态 +- `./images` — 发布图片时的挂载目录 + +#### 方式二:下载二进制 + +从 GitHub Releases 下载:https://github.com/xpzouying/xiaohongshu-mcp/releases/latest + +```bash +curl -s https://api.github.com/repos/xpzouying/xiaohongshu-mcp/releases/latest | grep browser_download_url +``` + +注意:二进制方式需要本机已安装 Chrome 或 Chromium。 + +#### 方式三:源码编译 + +不推荐,仅适合 Go 开发者。参考项目仓库 README。 + +部署完成后用 curl 确认服务已启动,然后进入步骤 3。 + +### 3. 检测 MCP 连接配置 + +检查当前客户端是否已配置 xiaohongshu MCP 连接。 + +**Claude Code**:读取 `~/.claude/settings.json` 和项目级 `.claude/settings.json`,查找 `mcpServers` 中是否有 `xiaohongshu` 配置。 + +- 已配置且地址正确 → 跳到步骤 5 +- 已配置但地址不匹配 → 修正地址 +- 未配置 → 进入步骤 4 + +### 4. 配置 MCP 连接 + +询问用户: + +**连接地址**:如果步骤 1 已确认可达的地址,用该地址作为默认值,否则默认 `http://localhost:18060/mcp`。 + +**使用的客户端**: + +**Claude Code**: + +```bash +claude mcp add xiaohongshu --transport http <地址> +``` + +或写入配置文件: +- 全局:`~/.claude/settings.json` +- 项目级:`.claude/settings.json` + +```json +{ + "mcpServers": { + "xiaohongshu": { + "url": "http://localhost:18060/mcp" + } + } +} +``` + +**Cursor**(`.cursor/mcp.json`): + +```json +{ + "mcpServers": { + "xiaohongshu": { + "url": "http://localhost:18060/mcp" + } + } +} +``` + +**其他客户端**:告知用户 MCP 服务地址,让用户按客户端文档自行配置。 + +### 5. 验证与提示 + +1. **提示用户重启当前会话** — MCP 配置变更后需重启客户端才能加载新的 MCP 工具 +2. 重启后调用 `check_login_status` 验证连接正常 +3. 验证成功 → 引导用户使用 `/xhs-login` 完成扫码登录 + +## 环境变量(可选) + +- `XHS_PROXY` — HTTP/HTTPS/SOCKS5 代理地址 +- `ROD_BROWSER_BIN` — 自定义 Chromium 路径 +- `HEADLESS` — 无头模式开关 + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| Docker 未安装 | 建议安装 Docker 或改用二进制方式 | +| 国内拉取镜像慢 | 切换到阿里云镜像源 | +| 端口 18060 被占用 | 检查已有进程,或更换端口 | +| Chrome 未安装(二进制方式) | 引导安装 Chrome 或改用 Docker 方式 | +| 配置写入后工具仍不可用 | 提示重启客户端会话 | +| 已有配置但地址错误 | 修正地址并重启 | diff --git a/.claude/skills/xhs-content-creator/SKILL.md b/.claude/skills/xhs-content-creator/SKILL.md deleted file mode 100644 index bdd78c6..0000000 --- a/.claude/skills/xhs-content-creator/SKILL.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -name: xhs-content-creator -description: | - 小红书爆款内容创作器。基于知识库中沉淀的爆款逻辑、用户身份信息和场馆资料,自动生成高质量小红书帖子。 - 完整流程:读取 wiki 知识库 → 可选搜索竞品 → 生成内容 → 审核优化 → 沉淀到知识库。 - - 触发场景(即使用户没有明确说"小红书",只要意图是创作社交媒体内容也应触发): - - "帮我写一篇小红书" - - "生成小红书内容" - - "写篇帖子/笔记" - - "创作一篇关于XX的内容" - - "帮我写个引流帖" - - "出一篇关于XX的文案" - - 用户描述了想表达的主题/卖点,期望产出可发布的内容 - - 不触发: - - 纯搜索/拉取小红书数据(用 xiaohongshu skill) - - 分析已有笔记质量(用 xiaohongshu-note-analyzer skill) - - 知识库的 ingest/query/lint 操作 ---- - -# 小红书爆款内容创作器 - -用户只需说出想表达的主题,本 skill 自动完成:知识库调研 → 内容生成 → 质量审核 → 知识库沉淀。 - -## 执行流程 - -按以下 5 个阶段顺序执行。每个阶段完成后简要告知用户进度。 - ---- - -### 阶段 1:读取知识库上下文 - -这一步的目的是让你充分理解用户的身份、过往内容风格、已沉淀的爆款规律,避免生成泛泛而谈的内容。 - -1. 读取项目根目录的 `CLAUDE.md`,了解知识库结构和页面规范 -2. 读取 `wiki/index.md`,扫描所有已有的 source、topic、entity、idea 页面 -3. 根据用户本次创作主题,读取相关的 wiki 页面: - - `wiki/topics/` 下与主题相关的爆款逻辑分析 - - `wiki/sources/` 下的历史素材摘要 - - `wiki/entities/` 下的用户身份、场馆、品牌信息 - - `wiki/ideas/` 下是否有相关的已有构思 - - `wiki/meta/` 下的方法论和风格指南 - -从这些页面中提取并记住以下关键信息(后续阶段会用到): - -- **用户身份**:职业、资质认证、从业经验 -- **场馆/品牌信息**:名称、地址、特色、定位 -- **爆款规律**:标题公式、正文结构模式、标签策略、互动触发技巧 -- **历史创作**:过往的选题和风格,避免重复 - -如果 wiki 中缺少用户身份或场馆信息(比如 entities 目录为空),直接询问用户补充关键信息,并建议后续创建 entity 页沉淀。 - ---- - -### 阶段 2:确认创作方向 - -和用户对齐内容策略,避免写完才发现方向不对。 - -根据知识库中的爆款分析(如果有),向用户展示适合本次主题的内容类型选项: - -| 类型 | 特征 | 适合场景 | -|---|---|---| -| 经验复盘型 | 赞藏评均衡,评论互动强 | 引流获客、建立信任 | -| 模板/清单型 | 高赞高藏,天花板高 | 涨粉、扩大曝光 | -| 方法论干货型 | 高收藏,同行传播 | 打造行业 IP | -| 避坑/对比型 | 痛点驱动,讨论多 | 引发互动、吸引精准客户 | - -让用户选择或确认。如果用户已经明确说了类型(比如"写篇复盘帖"),直接跳过选择。 - -同时确认: -- 这篇内容的核心卖点/想表达的重点 -- 目标读者是谁(潜在客户 vs 同行) - ---- - -### 阶段 3:生成内容 - -这是核心输出阶段。基于阶段 1 的知识库上下文和阶段 2 的方向确认,生成完整帖子。 - -#### 标题生成 - -从 wiki 中提取的爆款标题公式中选择最适合本次内容类型的公式,生成 2-3 个备选标题。 - -标题要求: -- 20 字以内 -- 必须包含核心关键词 -- 必须有情绪触发点或价值点 -- 包含地域词(如果是同城引流内容) - -#### 正文生成 - -遵循以下结构原则(来自爆款分析的共性规律): - -1. **开头即钩子**:前 2 句制造"跟我有关"的感觉,用故事或痛点切入,不用"大家好我是XX" -2. **结构可扫读**:用 emoji 编号(❶❷❸)+ 短段落,不写大段文字 -3. **有具体案例**:不讲道理讲经历,不说术语说感受 -4. **真实感 > 专业感**:用第一人称,带入个人经历和真实数据 -5. **结尾留互动空间**:提问式引导评论,但不用"一键三连"这类硬引导 - -正文字数:300-600 字(小红书最佳区间)。 - -自动融入用户身份和场馆信息,但要自然 — 品牌名只在结尾出现一次,认证资质作为背景信息融入叙述,不要堆砌。 - -#### 标签生成 - -15 个左右标签,覆盖四个维度: -- 核心词标签(行业 + 细分) -- 地域词标签(城市 + 区域 + 地标) -- 场景词标签(痛点场景、使用场景) -- 泛赛道标签(跨到更大的流量池,如女性创业、实体门店) - -#### 输出格式 - -``` -## 备选标题 - -A: [标题A] -B: [标题B] -C: [标题C] - -推荐:[推荐哪个,为什么] - -## 正文 - -[完整正文,可直接复制发布] - -## 标签 - -[所有标签,以 # 分隔] -``` - ---- - -### 阶段 4:内容审核与优化 - -生成初稿后,调用 xiaohongshu-note-analyzer skill 进行 6 维度审核: - -``` -使用 Skill tool 调用 xiaohongshu-note-analyzer,传入生成的标题和正文 -``` - -审核维度: -1. 关键词分析 — 核心词布局、标签优化 -2. 标题/首段吸引力 — 爆款公式匹配度 -3. 敏感内容风险 — 违规词、限流风险 -4. 商业化程度 — 自然度评分 -5. 互动触发潜力 — 讨论点、收藏价值 -6. 内容结构 — 排版节奏 - -根据审核结果,自动修改有问题的部分: -- 🔴 高危敏感词:直接替换 -- 🟠 中危问题:调整表述 -- 标题吸引力 < 7/10:重写标题 -- 自然度 < 7/10:降低商业感 -- 互动触发缺失:补充结尾互动引导 - -将审核报告和最终优化版一并展示给用户。 - ---- - -### 阶段 5:沉淀到知识库 - -用户确认内容满意后(或用户说"就这样"、"可以了"、"保存"),将内容存入知识库。 - -1. **创建 idea 页**:保存到 `wiki/ideas/` 目录 - -文件名:`xhs-{主题关键词}.md` - -```yaml ---- -type: idea -created: YYYY-MM-DD -updated: YYYY-MM-DD -tags: [相关标签] -sources: [引用的 wiki 页面路径] -status: ready ---- -``` - -页面内容包含: -- 最终标题 -- 完整正文 -- 标签列表 -- 审核评分摘要 -- 创作思路备注(用了哪个标题公式、参考了哪些爆款规律) - -2. **更新 `wiki/index.md`**:在 Ideas 区块添加条目 -3. **追加 `wiki/log.md`**:`## [YYYY-MM-DD] create | 小红书内容:{标题}` - ---- - -## 竞品搜索(可选增强) - -如果用户希望参考竞品(比如说"看看别人怎么写的"、"搜一下类似的"),或者 wiki 中缺少该主题的爆款分析: - -1. 使用 Skill tool 调用 xiaohongshu skill,搜索相关关键词 -2. 拉取 Top 3-5 的帖子详情 -3. 快速分析竞品的标题套路、正文结构、互动数据 -4. 将分析结果临时参考用于生成,并建议用户是否要 ingest 到知识库 - -不要每次都自动搜索 — 只在用户要求或知识库中明显缺少相关主题分析时才触发。 - ---- - -## 注意事项 - -- 始终优先使用 wiki 中已沉淀的爆款规律,它们是基于真实数据分析得出的 -- 内容要有真实感和个人色彩,不要写成通用模板 -- 认证资质(如斯多特认证)用英文原名更有辨识度(如 STOTT PILATES) -- 地址信息放在结尾的 📍 区块,不要散落在正文中 -- 如果用户只是随口说了个想法还不想深入,先帮 ta 理清思路再动手写 diff --git a/.claude/skills/xhs-content-plan/SKILL.md b/.claude/skills/xhs-content-plan/SKILL.md new file mode 100644 index 0000000..8881d7d --- /dev/null +++ b/.claude/skills/xhs-content-plan/SKILL.md @@ -0,0 +1,41 @@ +--- +name: xhs-content-plan +description: | + 小红书内容策划助手:搜索分析热门内容和竞品,帮助规划内容方向、选题、标签策略。 + 当用户想做小红书运营规划时使用——内容策划、选题灵感、竞品分析、爆款分析、热门话题研究、怎么做小红书、涨粉策略等。 +--- + +## 执行流程 + +### 1. 明确策划需求 + +向用户了解: +- 目标领域/赛道(如:美妆、旅行、美食) +- 策划目的:选题灵感 / 竞品分析 / 热门趋势 + +### 2. 搜索分析 + +根据需求调用 `search_feeds` 搜索相关内容: +- 使用不同关键词多次搜索覆盖领域 +- 利用 `sort_by` 筛选:最多点赞(爆款)、最新(趋势) + +对高互动笔记,调用 `get_feed_detail` 获取详情,分析: +- 标题写法和关键词 +- 内容结构和篇幅 +- 话题标签使用 +- 评论区用户关注点 + +如需分析特定博主,调用 `user_profile` 查看其内容风格和数据表现。 + +### 3. 输出策划建议 + +整理分析结果,为用户提供: +- 热门选题方向 +- 标题参考模板 +- 推荐话题标签 +- 内容结构建议 + +## 约束 + +- 这是只读分析 skill,不执行任何发布或互动操作 +- 搜索操作需要已登录状态 diff --git a/.claude/skills/xhs-explore/SKILL.md b/.claude/skills/xhs-explore/SKILL.md new file mode 100644 index 0000000..8c41075 --- /dev/null +++ b/.claude/skills/xhs-explore/SKILL.md @@ -0,0 +1,44 @@ +--- +name: xhs-explore +description: | + 浏览小红书推荐流、查看笔记详情和评论。 + 当用户想看推荐内容、刷首页、查看某条笔记的详情/评论、或已有 feed_id 想获取完整内容时使用。 +--- + +## 输入判断 + +- 用户想浏览推荐 → 步骤 1 +- 用户提供了 feed_id → 步骤 2 + +## 执行流程 + +### 1. 获取推荐流 + +调用 `list_feeds`(无参数),返回首页推荐笔记列表。 + +展示每条笔记的标题、作者、互动数据,附带 `feed_id` 和 `xsec_token`。 + +### 2. 查看笔记详情 + +调用 `get_feed_detail`: +- `feed_id`(string,必填) +- `xsec_token`(string,必填) +- `load_all_comments`(bool,可选,默认 false,仅返回前 10 条评论) +- `limit`(int,可选,load_all_comments=true 时生效,默认 20) +- `click_more_replies`(bool,可选,是否展开二级回复) +- `reply_limit`(int,可选,跳过回复数超过此值的评论,默认 10) +- `scroll_speed`(string,可选:slow | normal | fast) + +展示:笔记内容、图片、作者信息、互动数据、评论列表。 + +提示用户可以: +- 点赞/收藏(使用 xhs-interact) +- 发表评论(使用 xhs-interact) +- 查看作者主页(使用 xhs-profile) + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| 未登录 | 引导使用 xhs-login | +| 笔记已删除或不可见 | 告知用户该笔记无法访问 | diff --git a/.claude/skills/xhs-interact/SKILL.md b/.claude/skills/xhs-interact/SKILL.md new file mode 100644 index 0000000..7273dbc --- /dev/null +++ b/.claude/skills/xhs-interact/SKILL.md @@ -0,0 +1,70 @@ +--- +name: xhs-interact +description: | + 对小红书笔记进行互动:点赞/取消点赞、收藏/取消收藏、发表评论、回复评论。 + 当用户想对小红书笔记进行互动时使用——赞一下、收藏一下、留个评论、回复某条评论、取消点赞、取消收藏等。 +--- + +## 输入判断 + +根据用户意图路由: +- 点赞/取消点赞 → 点赞流程 +- 收藏/取消收藏 → 收藏流程 +- 发表评论 → 评论流程 +- 回复评论 → 回复流程 + +## 约束 + +- 评论和回复执行前展示内容让用户确认(评论以用户身份公开发表,无法撤回) +- 点赞和收藏可直接执行(操作可逆,MCP 服务有幂等处理) +- 所有操作都需要 `feed_id` + `xsec_token`(来自搜索或详情结果,编造会导致报错) + +## 执行流程 + +### 点赞 + +调用 `like_feed`: +- `feed_id`(string,必填) +- `xsec_token`(string,必填) +- `unlike`(bool,可选)— true 取消点赞,默认 false 点赞 + +已点赞时再点赞会自动跳过,反之同理。 + +### 收藏 + +调用 `favorite_feed`: +- `feed_id`(string,必填) +- `xsec_token`(string,必填) +- `unfavorite`(bool,可选)— true 取消收藏,默认 false 收藏 + +已收藏时再收藏会自动跳过,反之同理。 + +### 发表评论 + +调用 `post_comment_to_feed`: +- `feed_id`(string,必填) +- `xsec_token`(string,必填) +- `content`(string,必填)— 评论内容 + +发送前展示评论内容让用户确认。 + +### 回复评论 + +调用 `reply_comment_in_feed`: +- `feed_id`(string,必填) +- `xsec_token`(string,必填) +- `comment_id`(string,可选)— 目标评论 ID +- `user_id`(string,可选)— 目标评论作者 ID +- `content`(string,必填)— 回复内容 + +`comment_id` 和 `user_id` 至少提供一个。 + +发送前展示回复内容让用户确认。 + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| 未登录 | 引导使用 xhs-login | +| 缺少 feed_id/xsec_token | 提示先搜索或浏览获取笔记信息 | +| 笔记不可评论 | 告知用户该笔记已关闭评论 | diff --git a/.claude/skills/xhs-login/SKILL.md b/.claude/skills/xhs-login/SKILL.md new file mode 100644 index 0000000..d94c13f --- /dev/null +++ b/.claude/skills/xhs-login/SKILL.md @@ -0,0 +1,55 @@ +--- +name: xhs-login +description: | + 管理小红书登录状态:检查是否已登录、二维码扫码登录、重置登录切换账号。 + 当用户提到登录、扫码、账号、切换账号、退出登录、登录状态检查,或其他 skill 报告"未登录"需要先登录时使用。 +--- + +## 执行流程 + +### 1. 检查登录状态 + +调用 `check_login_status`(无参数),返回是否已登录及用户名。 + +- 已登录 → 告知用户当前登录账号 +- 未登录 → 进入步骤 2 + +### 2. 扫码登录 + +调用 `get_login_qrcode`(无参数)。MCP 工具返回两部分内容: +- 文本:超时提示(含截止时间) +- 图片:PNG 格式二维码(MCP image content type,Base64 编码) + +**展示二维码**:MCP 返回的图片会通过客户端渲染给用户。如果客户端无法直接展示图片(如纯文本终端),则将 Base64 数据保存为临时 PNG 文件,告知用户文件路径让其手动打开: +```bash +# fallback: 保存二维码到临时文件 +echo "" | base64 -d > /tmp/xhs-qrcode.png +open /tmp/xhs-qrcode.png # macOS +xdg-open /tmp/xhs-qrcode.png # Linux +``` + +提示用户: +- 打开小红书 App 扫描二维码 +- 二维码有效期有限,过期需重新获取 + +扫码完成后,调用 `check_login_status` 确认登录成功。 + +### 3. 重新登录 / 切换账号 + +当用户要求重新登录或切换账号时: + +1. 调用 `delete_cookies`(⚠️ 需用户确认)— 清除当前登录状态 +2. 调用 `get_login_qrcode` — 获取新二维码 +3. 引导用户扫码 + +## 约束 + +- `delete_cookies` 会清除登录状态,执行前必须确认 +- 登录需要用户手动用手机 App 扫码,无法自动完成 + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| MCP 工具不可用 | 引导用户使用 `/setup-xhs-mcp` 完成部署和连接配置 | +| 二维码超时 | 重新调用 `get_login_qrcode` | diff --git a/.claude/skills/xhs-profile/SKILL.md b/.claude/skills/xhs-profile/SKILL.md new file mode 100644 index 0000000..4bf480d --- /dev/null +++ b/.claude/skills/xhs-profile/SKILL.md @@ -0,0 +1,29 @@ +--- +name: xhs-profile +description: | + 查看小红书用户主页:基本信息、粉丝/关注/获赞数据、发布的笔记列表。 + 当用户想查看某个博主、作者、用户的主页信息和作品时使用。 +--- + +## 执行流程 + +### 1. 获取用户信息 + +调用 `user_profile`: +- `user_id`(string,必填)— 用户 ID(来自笔记详情或搜索结果) +- `xsec_token`(string,必填) + +### 2. 展示结果 + +- 基本信息:昵称、头像、简介、性别、地区 +- 数据:粉丝数、关注数、获赞与收藏数 +- 最近发布的笔记列表(含 feed_id 和 xsec_token) + +提示用户可以查看某条笔记详情或进行互动。 + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| 未登录 | 引导使用 xhs-login | +| 用户不存在 | 告知用户该主页无法访问 | diff --git a/.claude/skills/xhs-search/SKILL.md b/.claude/skills/xhs-search/SKILL.md new file mode 100644 index 0000000..147246f --- /dev/null +++ b/.claude/skills/xhs-search/SKILL.md @@ -0,0 +1,44 @@ +--- +name: xhs-search +argument-hint: "[搜索关键词]" +description: | + 搜索小红书笔记,支持关键词搜索和多维度筛选(排序、内容类型、时间范围、位置等)。 + 当用户想在小红书上搜索、查找内容时使用——包括搜笔记、找攻略、看看小红书上有没有某某内容、搜一下、查一查等场景。 +--- + +## 执行流程 + +### 1. 确认搜索条件 + +从用户输入中提取: +- `keyword`(必填)— 搜索关键词 +- `filters`(可选)— 筛选条件 + +### 2. 调用搜索 + +调用 `search_feeds`: +- `keyword`(string,必填) +- `filters`(object,可选): + - `sort_by`:综合 | 最新 | 最多点赞 | 最多评论 | 最多收藏 + - `note_type`:不限 | 视频 | 图文 + - `publish_time`:不限 | 一天内 | 一周内 | 半年内 + - `search_scope`:不限 | 已看过 | 未看过 | 已关注 + - `location`:不限 | 同城 | 附近 + +### 3. 展示结果 + +将搜索结果整理为列表展示,每条包含: +- 标题、作者 +- 点赞数、评论数、收藏数 +- `feed_id` 和 `xsec_token`(后续操作需要) + +提示用户可以: +- 查看某条笔记详情(使用 xhs-explore) +- 对笔记进行互动(使用 xhs-interact) + +## 失败处理 + +| 场景 | 处理 | +|---|---| +| 未登录 | 引导使用 xhs-login 登录 | +| 无搜索结果 | 建议调整关键词或筛选条件 | diff --git a/.claude/skills/xiaohongshu b/.claude/skills/xiaohongshu deleted file mode 120000 index 6c9a062..0000000 --- a/.claude/skills/xiaohongshu +++ /dev/null @@ -1 +0,0 @@ -../../.agents/skills/xiaohongshu \ No newline at end of file diff --git a/.claude/skills/xiaohongshu-note-analyzer b/.claude/skills/xiaohongshu-note-analyzer deleted file mode 120000 index 963126f..0000000 --- a/.claude/skills/xiaohongshu-note-analyzer +++ /dev/null @@ -1 +0,0 @@ -../../.agents/skills/xiaohongshu-note-analyzer \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json index 046165d..7104d2b 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -17,6 +17,6 @@ "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 1.992301859915002, + "scale": 2.506918337983666, "close": false } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 96f13c7..2ca3cdc 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -178,21 +178,32 @@ }, "active": "07a6f5425ad166a7", "lastOpenFiles": [ - "wiki/log.md", + "wiki/meta/index.md", + "wiki/sources/xhs-三公里社群渗透方法论.md", + "wiki/entities/focus-core.md", + "wiki/ideas/品牌介绍帖-focus-core.md", + "wiki/raw/普拉提引流调研报告.md", + "wiki/topics/普拉提一人一馆-内容矩阵策划.md", "wiki/topics/普拉提场馆引流-爆款逻辑.md", + "wiki/entities/and-her-pilates.md", + "wiki/sources/xhs-普拉提IP打造-案例拆解法.md", + "wiki/sources/xhs-普拉提私教-竞品爆款分析.md", + "wiki/entities/放羊的杨.md", + "wiki/raw/xhs-产后恢复引流帖-v2.md", + "wiki/raw", + "wiki/sources/xhs-普拉提引流-top5爆款.md", + "wiki/entities/贝贝聊IP.md", + "wiki/meta/log.md", + "wiki/meta", + "raw", + "wiki/log.md", "wiki/entities/cathy-普拉提.md", "wiki/ideas/案例拆解内容模型.md", - "wiki/sources/xhs-三公里社群渗透方法论.md", - "wiki/entities/贝贝聊IP.md", - "wiki/sources/xhs-普拉提IP打造-案例拆解法.md", - "wiki/entities/focus-core.md", - "wiki/sources/xhs-普拉提引流-top5爆款.md", "CLAUDE.md", "wiki/index.md", "assets", "wiki/topics", "wiki/sources", - "wiki/meta", "wiki/ideas", "wiki/entities", "wiki" diff --git a/skills/xiaohongshu b/skills/xiaohongshu deleted file mode 120000 index e43b9cb..0000000 --- a/skills/xiaohongshu +++ /dev/null @@ -1 +0,0 @@ -../.agents/skills/xiaohongshu \ No newline at end of file diff --git a/skills/xiaohongshu-note-analyzer b/skills/xiaohongshu-note-analyzer deleted file mode 120000 index 0de1097..0000000 --- a/skills/xiaohongshu-note-analyzer +++ /dev/null @@ -1 +0,0 @@ -../.agents/skills/xiaohongshu-note-analyzer \ No newline at end of file diff --git a/wiki/entities/and-her-pilates.md b/wiki/entities/and-her-pilates.md new file mode 100644 index 0000000..bf7f2a5 --- /dev/null +++ b/wiki/entities/and-her-pilates.md @@ -0,0 +1,51 @@ +--- +type: entity +created: 2026-04-19 +updated: 2026-04-19 +tags: [普拉提, 品牌, 武汉, 一人一馆, 竞品] +sources: [wiki/sources/xhs-普拉提私教-竞品爆款分析] +--- + +# AND HER PILATES + +## 基本信息 + +- **类型**:普拉提私教工作室 +- **城市**:武汉 +- **模式**:1v1 预约制,每个时段只接待一位客户 +- **器械**:曼丽丘(普拉提界高端器械品牌) +- **认证**:斯多特认证教练(官网可查) + +## 品牌定位 + +> 为想从运动中探寻自由的女性所打造的空间 + +- 强调「不定义女性力量」,情感价值驱动 +- 不只卖课,卖「运动乌托邦」体验 +- 附加服务:更衣淋浴、咖啡茶饮、主题拍照角、会员墙 + +## 课程与定价 + +- 只做 1v1 私教 +- 无储值卡、无大课包 +- 课包设置:12节(建立运动模式)、36节(强化肌肉效果) +- 推荐频率:每周 2-3 次 +- **无销售、无套路** — 体验后理性购买 + +## 小红书数据 + +- 爆款帖:「关于课程与价格,服务与体验,一篇讲清楚!」 +- 数据:**1163赞 / 1011藏 / 74评** +- 图文 11 张,完整介绍品牌理念→器械→课程→价格→服务 + +## 值得学习的点 + +1. **透明度极高**:价格、频率、效果预期全部公开,降低决策门槛 +2. **情感包装**:不说"私教课",说"专属运动乌托邦" +3. **服务细节展示**:咖啡茶饮、绿植音乐、拍照角 — 体验感 > 功能性 +4. **评论区就是客资池**:74条评论大多是咨询预约 + +## 相关页面 + +- [[wiki/sources/xhs-普拉提私教-竞品爆款分析]] +- [[wiki/ideas/品牌介绍帖-focus-core]] diff --git a/wiki/entities/放羊的杨.md b/wiki/entities/放羊的杨.md new file mode 100644 index 0000000..b51fe9c --- /dev/null +++ b/wiki/entities/放羊的杨.md @@ -0,0 +1,53 @@ +--- +type: entity +created: 2026-04-19 +updated: 2026-04-19 +tags: [普拉提, 博主, 一人一馆, 竞品, 人设运营] +sources: [wiki/sources/xhs-普拉提私教-竞品爆款分析] +--- + +# 放羊的杨- + +## 基本信息 + +- **小红书 ID**:XYY18383223241 +- **粉丝**:11,904 +- **获赞与收藏**:244,737 +- **关注**:17 +- **IP 属地**:陕西 +- **简介**:游走50+国的地球观光客 / 普拉提爱好者从业者@遊|普拉提 / 运动|旅行|运动穿搭 + +## 账号定位 + +典型的「一人一馆」赛道标杆博主,以 Vlog 日常为主要内容形式。 + +## 内容矩阵 + +| 类型 | 代表作 | 赞 | 评 | +|------|--------|---|---| +| 创业Vlog | 没有30+创业 也没有月入10万 | 331 | 59 | +| 日常记录 | 一人一馆 记录生活可以提高行动力 | 62 | 20 | +| 聊天/talk | 一人一馆日常看腻了 又是一期talk局 | 134 | 10 | +| 经验分享 | 聊聊我一人一馆的第三年 | 119 | 17 | +| 工作节奏 | 一天上5节课和8节课的区别 | 74 | 12 | +| 下班日常 | 羊师傅下钟啦 | 77 | 12 | +| 旅行/穿搭 | 最不后悔的事:在24岁前环游40国 | 513 | — | +| 干货分享 | 普拉提必读书籍推荐 | 2711 | — | + +## 运营特点 + +1. **人设 > 专业**:旅行经历 + 创业故事让她不只是"普拉提老师" +2. **高频 Vlog**:几乎每篇都是视频,展示真实日常 +3. **评论互动强**:日常类内容评论数普遍 10-60 条 +4. **粉丝粘性高**:24.4万获赞/1.19万粉,每粉赞比 20.6 +5. **跨赛道流量**:旅行穿搭类内容拉新,普拉提内容留存 + +## 对 Focus Core 的启示 + +- 一人一馆 Vlog 是可持续的内容方向,不需要高制作成本 +- 个人故事/经历是差异化壁垒,别人无法复制 +- 建议 Focus Core 也建立「专业之外」的人设维度 + +## 相关页面 + +- [[wiki/sources/xhs-普拉提私教-竞品爆款分析]] diff --git a/wiki/ideas/品牌介绍帖-focus-core.md b/wiki/ideas/品牌介绍帖-focus-core.md new file mode 100644 index 0000000..7956bd2 --- /dev/null +++ b/wiki/ideas/品牌介绍帖-focus-core.md @@ -0,0 +1,147 @@ +--- +type: idea +created: 2026-04-19 +updated: 2026-04-19 +tags: [普拉提, 品牌介绍, 获客, 小红书, focus-core] +sources: [wiki/sources/xhs-普拉提私教-竞品爆款分析, wiki/entities/and-her-pilates] +status: ready +--- + +# 品牌介绍帖 · Focus Core + +## 创作背景 + +参考 AND HER PILATES 的爆款帖(1163赞/1011藏/74评),这是普拉提工作室最直接的获客工具。评论区全是「怎么预约」「想了解价格」,本质是一篇长效引流的「店面门面」帖。 + +## 核心 Hook + +> 一个人的馆,只为一个人服务。 + +切入点:用「一人一馆」的稀缺感和「只做私教」的专注度,与大馆团课形成差异。 + +## 目标受众 + +- 深圳宝安区及周边女性 +- 在大馆上过团课但效果不明显、想试私教的人 +- 有明确体态问题(骨盆前倾、圆肩驼背、产后修复) +- 在乎体验感、隐私性,不喜欢被推销 + +## 标题方案 + +主推:**关于我的一人一馆,一篇讲清楚** +备选: +- 深圳宝安|一人一馆,只做一对一的普拉提工作室 +- 一人一馆是什么体验?关于课程和服务,全部告诉你 +- 我的普拉提工作室,没有销售只有专注 + +## 正文结构(图文帖,建议 8-10 张图) + +### 图 1:封面 +- 馆内全景或器械特写,文字叠加标题 +- 视觉要求:干净、有质感、光线好 + +### 图 2:品牌理念 +> Focus Core — 专注核心 +> 一人一馆,一个时段只服务一位你 +> 没有前台、没有销售、没有推销 +> 只有教练和你,专注在每一次呼吸和运动里 + +### 图 3:关于我/教练介绍 +> 你好,我是 Focus Core 的馆主 +> STOTT PILATES 斯多特认证高级教练 +> 从业 X 年,累计服务 X+ 位学员 +> 我选择一人一馆,是因为…(真实原因/故事) + +### 图 4:器械与空间 +> 全套斯多特器械 +> 凯迪拉克床 / 核心床 / 稳踏椅 / 万能椅 +> 每一台器械都是为私教课量身配置 +> (配器械实拍图) + +### 图 5:我能帮你解决什么 +> ✅ 骨盆前倾 / 圆肩驼背 / 富贵包 +> ✅ 产后骨盆修复 / 腹直肌分离 +> ✅ 久坐腰痛 / 肩颈僵硬 +> ✅ 核心激活 / 运动表现提升 +> 私教的好处:根据你的身体状况定制每一节课 + +### 图 6:关于课程 +> 只做 1 对 1 私教 +> 每节课 60 分钟,包含评估+训练+拉伸 +> 12 节课建立运动模式,体态明显改善 +> 36 节课深度强化,效果稳定持久 +> 建议频率:每周 2-3 次 + +### 图 7:关于价格 +> 没有储值卡,没有大课包 +> 没有销售套路 +> 按需购买,12节/36节课包 +> 体验课 XX 元/节,欢迎先来感受 +> (具体价格根据实际填写) + +### 图 8:关于体验 +> 📍 深圳宝安坪洲地铁站步行3分钟 +> 一人一馆,独享空间,完全私密 +> 提供更衣室和基础洗护 +> 课后可以坐一坐,喝杯水,不急着走 +> (配空间细节图) + +### 图 9(可选):学员变化 +> 学员 X 节课对比(征得同意后展示) +> 或学员的文字反馈截图 + +### 图 10(可选):预约方式 +> 想体验可以直接私信我 💬 +> 或留言你想改善的问题,我帮你看看 + +## 正文文案 + +``` +Focus Core | 专注核心 + +一个人的馆,只为一个人服务。 + +我是 Focus Core 的馆主,STOTT PILATES 斯多特认证教练。选择做一人一馆,是因为我相信好的私教课应该是——安静、专注、完全属于你的。 + +这里没有前台,没有销售,没有推销。 +只有教练和你,专注在每一次呼吸和运动里。 + +▫️ 我能帮你 +骨盆前倾 / 圆肩驼背 / 富贵包 / 产后修复 / 久坐腰痛 +根据你的身体状况,定制每一节课的内容。 + +▫️ 关于课程 +只做 1v1 私教,每节课 60 分钟 +12节课建立运动模式,体态会有明显变化 +36节课深度强化,让改变稳定持久 +建议每周 2-3 次 + +▫️ 关于价格 +没有储值卡,没有大课包,没有套路 +体验后根据自己情况理性购买即可 + +▫️ 关于这里 +📍 深圳宝安,坪洲地铁站步行3分钟 +一个时段只接待一位,完全私密 +提供更衣室和基础洗护 + +想来体验,可以直接私信我 💬 +或者留言你想改善的问题,我来帮你看看。 +``` + +## 话题标签 + +`#普拉提` `#普拉提私教` `#一人一馆` `#深圳普拉提` `#宝安普拉提` `#坪洲普拉提` `#体态矫正` `#普拉提工作室` `#深圳` `#私教课` + +## 发布建议 + +1. **图片质量是关键**:封面决定点击率,馆内实拍要有光线和质感 +2. **发布后置顶**:这篇帖子会长期吸引搜索流量 +3. **评论区及时回复**:有人咨询预约一定第一时间回 +4. **可定期更新**:有了学员对比图后补充进去 + +## 相关页面 + +- [[wiki/entities/and-her-pilates]] — 参考标杆 +- [[wiki/entities/focus-core]] — 场馆信息 +- [[wiki/topics/普拉提一人一馆-内容矩阵策划]] — 整体内容策略 diff --git a/wiki/meta/index.md b/wiki/meta/index.md index c0cdd44..eab6e4d 100644 --- a/wiki/meta/index.md +++ b/wiki/meta/index.md @@ -1,7 +1,7 @@ --- type: meta created: 2026-04-15 -updated: 2026-04-16 +updated: 2026-04-19 --- # Wiki Index @@ -14,11 +14,13 @@ updated: 2026-04-16 - [[wiki/sources/xhs-普拉提引流-top5爆款]] — 小红书「普拉提引流」Top5 爆款笔记原始采集(472~203赞) - [[wiki/sources/xhs-三公里社群渗透方法论]] — 「如何让你的馆在三公里内所熟知」爆款拆解:社区渗透三步法(197赞/241藏) - [[wiki/sources/xhs-普拉提IP打造-案例拆解法]] — 「普拉提ip难做❓看看她是怎么做的❓」案例拆解型爆款分析(185赞/139藏,收藏率75%) +- [[wiki/sources/xhs-普拉提私教-竞品爆款分析]] — 「普拉提私教」「一人一馆」赛道竞品爆款数据分析(60+笔记,含5种标题公式) ## Topics - [[wiki/topics/普拉提场馆引流-爆款逻辑]] — 5 篇爆款的标题公式、正文结构、标签策略、评论区规律拆解 +- [[wiki/topics/普拉提一人一馆-内容矩阵策划]] — 4:2:1内容矩阵(流量款/信任款/人设款),每周发布节奏,标签策略 ## Entities @@ -26,8 +28,11 @@ updated: 2026-04-16 - [[wiki/entities/focus-core]] — Focus Core 普拉提工作室:身份、地址、特色、目标客户、内容定位 - [[wiki/entities/贝贝聊IP]] — 小红书IP打造/自媒体运营博主,「案例拆解」内容模型代表 - [[wiki/entities/cathy-普拉提]] — 普拉提博主,被贝贝聊IP拆解的起号案例 +- [[wiki/entities/and-her-pilates]] — AND HER PILATES:武汉普拉提工作室,品牌介绍帖标杆(1163赞/1011藏/74评) +- [[wiki/entities/放羊的杨]] — 放羊的杨-:一人一馆赛道标杆博主(1.19万粉/24.4万获赞),Vlog日常+创业故事 ## Ideas - [[wiki/ideas/案例拆解内容模型]] — 基于贝贝聊IP帖子提炼的「第三方博主拆解」创作框架,附6张卡片模板和标题公式 +- [[wiki/ideas/品牌介绍帖-focus-core]] — Focus Core 品牌介绍帖完整策划:标题方案、10张图结构、正文文案、标签 diff --git a/wiki/meta/log.md b/wiki/meta/log.md index 0411ffe..31c092f 100644 --- a/wiki/meta/log.md +++ b/wiki/meta/log.md @@ -1,13 +1,29 @@ --- type: meta created: 2026-04-15 -updated: 2026-04-16 +updated: 2026-04-19 --- # Wiki Log 操作日志,按时间倒序。每条以 `## [日期] 动作 | 标题` 格式记录。 +## [2026-04-19] ingest | 普拉提私教赛道竞品爆款分析+内容矩阵策划 + +搜索「普拉提私教」「普拉提体态矫正前后对比」「一人一馆 普拉提」三组关键词,采集约60条笔记。 +分析5种内容类型的数据表现,提炼6种标题公式,总结标签策略和内容形式偏好。 +详细拆解 AND HER PILATES 品牌介绍爆款帖(1163赞/1011藏/74评)的结构和评论区信号。 +分析「放羊的杨-」一人一馆标杆博主(1.19万粉/24.4万获赞)的内容矩阵。 + +创建: +- source 页:xhs-普拉提私教-竞品爆款分析.md +- entity 页:and-her-pilates.md(武汉,品牌介绍帖标杆) +- entity 页:放羊的杨.md(一人一馆Vlog标杆) +- topic 页:普拉提一人一馆-内容矩阵策划.md(4:2:1模型+每周发布节奏) +- idea 页:品牌介绍帖-focus-core.md(完整帖子策划:标题、10张图结构、正文文案、标签) + +更新 index.md + ## [2026-04-16] lint | 修复7处缺陷 - 创建 wiki/meta/ 目录,将 index.md 和 log.md 移入 - 补全 index.md、log.md 缺失的 created/updated 字段 diff --git a/wiki/raw/xhs-产后恢复引流帖-v2.md b/wiki/raw/xhs-产后恢复引流帖-v2.md new file mode 100644 index 0000000..66a02a4 --- /dev/null +++ b/wiki/raw/xhs-产后恢复引流帖-v2.md @@ -0,0 +1,135 @@ +--- +type: raw +created: 2026-04-18 +tags: [产后恢复, 普拉提, stott, 引流帖, 小红书] +status: optimized +--- + +# 产后恢复引流帖 v2(优化稿) + +> 来源:基于馆主原始草稿,经 wiki 爆款逻辑 + 笔记分析器双重优化 +> 分析日期:2026-04-18 + +--- + +## 分析摘要 + +| 维度 | 评分 | 核心问题 | +| ---------- | ------ | ---------------------------------- | +| 关键词布局 | 8/10 | 核心词覆盖好,缺少泛流量标签 | +| 标题吸引力 | 7.5/10 | 对话体真实感强,但"核心空了"偏专业 | +| 敏感风险 | 🟡低危 | "漏尿"+"统计数据"需注意 | +| 商业自然度 | 7/10 | 评估段落像课程介绍PPT,需故事化 | +| 评论触发 | 5/10 | **最大短板**——内容太完整,无留白 | +| 收藏价值 | 8/10 | 三问题科普+解决路径,信息密度够 | + +### 关键优化动作 + +1. **增加自查互动**——加入腹直肌自测动作,引导评论 +2. **评估段落故事化**——用真实客户片段替代流程列表 +3. **结尾利他钩子**——"私信发你自查清单"替代直接引流 +4. **精简篇幅**——从800字压缩到600字以内 +5. **补充泛流量标签**——#宝妈日常 #女性健康 #产后运动 + +--- + +## 最终优化稿 + +🤱 "教练,我生完一年了,打个喷嚏还是会漏…" + +来找我的产后妈妈,十个有八个说过类似的话 + +她们的故事几乎一样—— +肚子看着回去了,人也能跑了 +但身体就是「空了一块」,撑不住 + +久站腰酸、抱娃手废 +弯腰捡东西腰就闪到 +蹦一下漏一点(妈妈们懂的😭) +肚子松松垮垮,怎么练都收不紧 + +不是不努力——瑜伽、跑步、keep都试了 +但这三个问题还是没好 ↓ + +产后核心的三个「隐形损伤」 + +❶ 腹直肌分离 +孕期腹部被撑开,左右腹直肌从中间分开 +生完不会自动合回去 +普通卷腹、仰卧起坐?反而让分离更严重 + +❷ 盆底肌松弛 +孕期盆底肌承受了巨大压力 +产后咳嗽漏尿、跳绳漏尿,不是矫情 +是盆底肌在求救 + +❸ 腰椎不稳 +骨盆前倾 + 腹部失活 = 核心兜不住脊柱 +久坐久站就腰痛,抱娃更明显 + +这三件事大多数妈妈同时中招 +而且不是「练多了就好」——练错了反而更严重 + +你可以先自测:平躺放松,手指放肚脐上方,微微抬头——指尖能陷进去超过两指宽,大概率有分离。测完来评论区说说你的情况? + +普拉提为什么能解这个? + +因为它从最深层开始—— +先激活盆底肌 → 再唤醒腹横肌 → 最后重建整体稳定 + +不是让你出汗、让你瘦 +是从里面一层一层重新稳起来 + +但关键是——不是所有教练都能带产后 + +为什么我说,不是所有普拉提教练都能带产后? + +市面上3天拿证、7天上岗的培训太多了 +大部分只教动作,不教「为什么做这个动作」 + +我的认证体系是 STOTT PILATES(斯多特) +全球四大普拉提体系之一 +它的特点是以现代解剖学和康复医学为基础 +不只是教你摆姿势,而是要求教练能做身体评估、能设计个性化方案 + +✅ 系统学过解剖学、生物力学 +✅ 腹直肌分离几指、盆底肌什么分级——评估完才决定怎么练 +✅ 证书编号官网可查,造不了假 + +产后恢复涉及盆底、脊柱、腹壁重建 +这件事,值得你找一个受过系统训练的人来带 + +💬 来我这里的妈妈,第一次都不是来训练的 + +上周有个妈妈,生完两年了,练了一年多瑜伽 +来了一评估——腹直肌分离还有2.5指,盆底肌几乎激活不了 + +我们没有上来就练 +而是从呼吸模式开始,重新教她的身体「怎么发力」 + +每个人起点不同,方案就不同 +没有标准课程,只有适合你现在状态的那一个方案 + +这才是1对1的意义 + +📍 深圳宝安 · 坪洲站步行2分钟 +一人一时段 · 私密安静 · 停车方便 +不推销、不办年卡 🤍 + +你是产后多久?现在最困扰的是什么问题?评论区聊聊👇 + +#产后恢复 #盆底肌修复 #腹直肌分离 #产后普拉提 #深圳产后恢复 #STOTT普拉提 #斯多特认证 #宝安普拉提 #普拉提私教 #核心修复 #产后漏尿 #产后体态 #坪洲 #深圳宝妈 #一对一私教 #产后康复 #盆底肌训练 #深圳普拉提 #宝妈日常 #女性健康 #产后运动 + +--- + +## 与原稿对比 + +| 改动点 | 原稿 | 优化稿 | 依据 | +| -------- | ------------------ | ---------------------------------- | --------------------------------- | +| 标题 | "核心还是空的" | "打个喷嚏还是会漏" | 症状更通俗,搜索覆盖更广 | +| 自查互动 | 无 | 加入腹直肌自测+评论引导 | wiki规律:干货完整→评论少,需留白 | +| 评估段落 | 4个箭头流程列表 | 真实客户故事(生完两年+分离2.5指) | 降低PPT感,提升真人分享感 | +| 结尾钩子 | "私信我产后两个字" | "私信发你自查清单"+开放提问 | 利他前置,给私信一个理由 | +| 篇幅 | ~800字 | ~600字 | 小红书最佳完读长度400-600字 | +| 标签 | 18个 | 21个,补充3个泛流量标签 | 拉宽非精准流量入口 | +| 敏感处理 | "十个有八个" | 保留但建议发布时观察 | 无来源统计有审核风险 | diff --git a/wiki/raw/普拉提引流调研报告.md b/wiki/raw/普拉提引流调研报告.md new file mode 100644 index 0000000..6e8b8d2 --- /dev/null +++ b/wiki/raw/普拉提引流调研报告.md @@ -0,0 +1,168 @@ +--- +🎯 普拉提一人一馆 · 小红书获客内容策划报告 +--- + +一、赛道数据概览 + +我分析了「普拉提私教」「普拉提体态矫正」「一人一馆」三个关键词下的热门笔记,核心发现: + +┌──────────────────┬──────────────┬────────────┬────────────────────────┐ +│ 内容类型 │ 典型爆款点赞 │ 收藏量 │ 特点 │ +├──────────────────┼──────────────┼────────────┼────────────────────────┤ +│ 体态改善教学 │ 2000-4400+ │ 2000-4700+ │ 赛道最大流量池 │ +├──────────────────┼──────────────┼────────────┼────────────────────────┤ +│ 工作室品牌介绍 │ 1000+ │ 1000+ │ 精准获客,评论全是咨询 │ +├──────────────────┼──────────────┼────────────┼────────────────────────┤ +│ 学员前后对比 │ 50-500 │ 12-50 │ 引发讨论+信任背书 │ +├──────────────────┼──────────────┼────────────┼────────────────────────┤ +│ 私教课堂实录 │ 200-500 │ 400-490 │ 建立专业感 │ +├──────────────────┼──────────────┼────────────┼────────────────────────┤ +│ 一人一馆日常Vlog │ 60-330 │ 20-140 │ 建立人设+情感连接 │ +└──────────────────┴──────────────┴────────────┴────────────────────────┘ + +--- + +二、竞品博主分析 + +🌟 「放羊的杨-」— 一人一馆标杆 + +- 粉丝:1.19万 | 获赞与收藏:24.4万 +- IP定位:游走50+国的旅行者 + 普拉提从业者 +- 内容矩阵:Vlog日常(一天上5节/8节的区别)、创业故事(第三年回顾)、教学分享、旅行穿搭 +- 启示:人设先行,有温度的生活感比纯教学更圈粉 + +🌟 「欢欢」— 教学类爆款制造机 + +- 爆款:「美背普拉提|纠正头前引+富贵包+驼背」4397赞, 4670收藏 +- 爆款:「4组肩胛进阶训练」218赞, 197收藏 +- 启示:体态问题 + 具体动作 + emoji标记 = 高收藏 + +🌟 「AND HER PILATES」— 品牌获客范本 + +- 爆款:「关于课程与价格,服务与体验,一篇讲清楚!」1163赞, 1011收藏, 74评论 +- 评论区清一色「怎么预约体验课」「想了解价格」→ 精准客资 +- 启示:透明+专业+氛围感 = 最强获客帖 + +--- + +三、内容矩阵规划(每周7天发布计划) + +根据分析,建议你的内容按 4:2:1 比例分配: + +🔴 A类 · 流量款(4篇/周)— 拉新曝光 + +▎ 目标:触达目标人群,获取搜索流量 + +选题方向: + +1. 体态问题解决方案(赛道最大流量池) + - 「3个动作改善骨盆前倾|普拉提私教教学」 + - 「圆肩驼背?一节课的改善思路」 + - 「告别富贵包|颈椎正位训练」 + - 「小腿外翻/X型腿|这样练真的有变化」 + - 「久坐族必练!腰痛缓解3个动作」 + +2. 产后/办公室人群痛点 + - 「产后骨盆修复|真实学员6节课对比」 + - 「上班族肩颈僵硬?普拉提拯救低头族」 + - 「妈妈也要好体态!产后腹直肌修复」 + +🟡 B类 · 信任款(2篇/周)— 转化意向 + +▎ 目标:建立专业信任,激发咨询欲 + +选题方向: + +1. 学员前后对比/故事 + - 「10节课的变化|学员体态对比记录」 + - 「从不敢穿吊带到自信露肩|学员故事」 + - 「坚持12节课后她说了这样一句话…」 + +2. 专业知识科普 + - 「普拉提私教和团课到底差在哪?」 + - 「第一次上普拉提私教需要准备什么?」 + - 「普拉提为什么要坚持至少12节?」 + +3. 工作室/服务介绍 + - 「关于我的课程与价格,一篇讲清楚」(参考AND HER爆款) + - 「一人一馆体验课实录|60分钟都在做什么」 + +🟢 C类 · 人设款(1篇/周)— 建立情感连接 + +▎ 目标:让粉丝记住你这个人,而不只是"一个普拉提号" + +选题方向: + +1. 一人一馆日常Vlog + - 「Vlog|一人一馆的一天」 + - 「一人一馆第X年|聊聊心里话」 + - 「周末上完最后一节课的碎碎念」 + +2. 创业故事/成长 + - 「为什么选择一人一馆?」 + - 「从学员到教练|我的普拉提故事」 + - 「一个人开馆最难的不是没客户,是…」 + +--- + +四、爆款标题公式 + +根据高赞笔记总结的5种标题模型: + +┌────────────────────┬──────────────────────────────────┬────────┐ +│ 公式 │ 示例 │ 适用 │ +├────────────────────┼──────────────────────────────────┼────────┤ +│ 痛点+数量+解决方案 │ 「3个动作改善骨盆前倾」 │ 教学类 │ +├────────────────────┼──────────────────────────────────┼────────┤ +│ 前后对比+数字 │ 「10节课的变化|体态对比」 │ 案例类 │ +├────────────────────┼──────────────────────────────────┼────────┤ +│ 疑问句引好奇 │ 「这钱花的值吗?15节私教效果」 │ 对比类 │ +├────────────────────┼──────────────────────────────────┼────────┤ +│ 场景+emoji │ 「美背🩵普拉提|纠正圆肩驼背」 │ 教学类 │ +├────────────────────┼──────────────────────────────────┼────────┤ +│ 反差/情绪 │ 「谁懂啊‼️这才是腹部炸裂的动作」 │ 流量类 │ +└────────────────────┴──────────────────────────────────┴────────┘ + +--- + +五、推荐话题标签 + +核心标签(每篇必带): + +- #普拉提 #普拉提私教 #一人一馆 + +流量标签(轮换使用): + +- #体态矫正 #圆肩驼背 #骨盆前倾 #富贵包 +- #产后修复 #腹直肌分离 +- #私教课 #普拉提工作室 + +地域标签(关键!本地获客): + +- #你的城市名 #城市名普拉提 #城市名+区域名 + +▎ ⚠️ 重要提醒:地域标签是本地生活获客的核心,一定要带! + +--- + +六、具体行动建议 + +1. 先发 1 篇品牌介绍帖(参考 AND HER 的结构) + - 品牌理念 → 器械/认证 → 课程说明 → 价格透明 → 服务细节 → 预约方式 + - 这篇是"店面门面",长期吸引咨询 + +2. 前两周集中发体态改善教学 + - 先积累基础流量和关注 + - 圆肩、骨盆前倾、富贵包是最高频搜索词 + +3. 每上完课就拍学员对比照(征得同意) + - 前后对比是最强信任素材 + - 建立长期素材库 + +4. 视频 > 图文 + - 搜索结果中视频笔记占比 60%+,且高赞笔记大多是视频 + - 教学动作用视频展示效果远好于图文 + +5. 评论区互动引导私信 + - 在笔记末尾引导「想体验私聊我」 + - 评论区有咨询及时回复 diff --git a/wiki/sources/xhs-普拉提私教-竞品爆款分析.md b/wiki/sources/xhs-普拉提私教-竞品爆款分析.md new file mode 100644 index 0000000..95c6a18 --- /dev/null +++ b/wiki/sources/xhs-普拉提私教-竞品爆款分析.md @@ -0,0 +1,101 @@ +--- +type: source +created: 2026-04-19 +updated: 2026-04-19 +tags: [普拉提, 竞品分析, 爆款数据, 小红书运营, 一人一馆] +sources: [] +--- + +# 小红书「普拉提私教」竞品爆款分析 + +采集时间:2026-04-19 +搜索关键词:「普拉提私教」「普拉提体态矫正前后对比」「一人一馆 普拉提」 +共采集约 60 条笔记,以下为数据提炼。 + +--- + +## 一、赛道数据概览 + +| 内容类型 | 典型爆款点赞 | 收藏量 | 赞藏比 | 特点 | +|---------|------------|--------|--------|------| +| 体态改善教学 | 2000-4400+ | 2000-4700+ | ~1:1 | 赛道最大流量池,搜索流量为主 | +| 工作室品牌介绍 | 1000+ | 1000+ | ~1:0.87 | 精准获客,评论全是咨询 | +| 学员前后对比 | 50-500 | 12-50 | ~1:0.3 | 引发讨论+信任背书 | +| 私教课堂实录 | 200-500 | 400-490 | ~1:1 | 建立专业感,高收藏 | +| 一人一馆日常Vlog | 60-330 | 20-140 | ~1:0.4 | 人设+情感连接,评论互动强 | + +## 二、高赞笔记清单 + +### 体态教学类(流量天花板) + +| 标题 | 博主 | 赞 | 藏 | 评 | 类型 | +|------|------|---|---|---|------| +| 美背普拉提|纠正头前引+富贵包+驼背 | 欢欢 | 4397 | 4670 | 59 | 视频 | +| Reformer 5个动作改善圆肩驼背 | pilateswithannabel | 2487 | 2945 | 14 | 视频 | +| 困扰多年的骨盆前倾终于改善了(口令版) | 只只知知Myra | 2116 | 2225 | 14 | 视频 | +| 普拉提私教 0基础X型腿足外翻调整思路 | may练普拉提 | 2023 | 2146 | 35 | 视频 | +| 开始普拉提的正确姿势和方法|颈椎正位 | Liviana | 1254 | 1495 | 4 | 视频 | + +### 品牌/获客类(精准转化) + +| 标题 | 博主 | 赞 | 藏 | 评 | 类型 | +|------|------|---|---|---|------| +| 关于课程与价格,服务与体验,一篇讲清楚! | AND HER PILATES | 1163 | 1011 | 74 | 图文 | +| 做一家专业的普拉提工作室!在重庆光环 | 欢欢 | 430 | 353 | 36 | 图文 | +| 普拉提场馆IP打造 拓客转化太香了 | 能量学姐 | 203 | 158 | 0 | 图文 | +| 一人一馆|适合i人的普拉提馆 | RUI PILATES | 242 | 186 | 59 | 图文 | + +### 一人一馆日常类(人设建设) + +| 标题 | 博主 | 赞 | 藏 | 评 | 类型 | +|------|------|---|---|---|------| +| 没有30+创业 也没有月入10万 | 放羊的杨- | 331 | 141 | 59 | 视频 | +| 小馆的高客单本质:永远去解决更复杂的问题 | SUMMER头子 | 191 | 132 | 5 | 视频 | +| 聊聊我一人一馆的第三年 | 放羊的杨- | 119 | 29 | 17 | 视频 | +| 一人一馆终究还是迎来了闭店潮! | 教普拉提的小A | 94 | 45 | 26 | 视频 | +| 一人一馆的弊端|每种选择都要有所取舍 | 陈玲敏Alita | 222 | 139 | 26 | 图文 | + +### 课堂实录/教学分享类 + +| 标题 | 博主 | 赞 | 藏 | 评 | 类型 | +|------|------|---|---|---|------| +| 记录一节完整的普拉提私教课程 | 云云 | 496 | 491 | 5 | 视频 | +| 普拉提教练vlog:给脊柱一个机会让它呼吸 | 黑小米 | 397 | 486 | 8 | 视频 | +| 普拉提私教体验课实录|原来体验课是这样的 | ZONE PILATES | 244 | 173 | 7 | 视频 | +| 国际认证教练教你三个动作改善骨盆前倾 | Yori应 | 265 | 282 | 2 | 视频 | +| 普拉提教学 手把手教你简单有效的辅助方法 | 杜鹏 Allen | 143 | 147 | 13 | 视频 | + +## 三、爆款标题公式总结 + +| 公式 | 示例 | 适用场景 | +|------|------|---------| +| 痛点+数量+解决方案 | 「3个动作改善骨盆前倾」 | 教学类 | +| 前后对比+数字 | 「10节课的变化|体态对比」 | 案例类 | +| 疑问句引好奇 | 「这钱花的值吗?15节私教效果」 | 对比类 | +| 场景+emoji | 「美背🩵普拉提|纠正圆肩驼背」 | 教学类 | +| 反差/情绪 | 「谁懂啊‼️这才是腹部炸裂的动作」 | 流量类 | +| 一句话讲清楚 | 「关于课程与价格,一篇讲清楚!」 | 品牌介绍类 | + +## 四、内容形式偏好 + +- 视频笔记占比约 **60%+**,且高赞笔记大多是视频 +- 体态教学类几乎全部是视频(动作展示需要动态) +- 品牌介绍类以图文为主(信息密度高,适合反复查看) +- 一人一馆日常以 Vlog 为主(人设感强) + +## 五、话题标签频率 + +高频标签:`#普拉提` `#普拉提私教` `#体态矫正` `#圆肩驼背` `#骨盆前倾` +中频标签:`#普拉提工作室` `#富贵包` `#产后修复` `#一人一馆` +地域标签:几乎所有获客型笔记都带城市+区域标签 + +## 六、评论区信号(品牌介绍帖) + +AND HER PILATES 的「关于课程与价格」帖评论区典型内容: +- 「请问怎么预约体验课?」 +- 「后台咨询了体验课,麻烦回复一下」 +- 「想了解,感觉环境很喜欢」 +- 「环境很美,价格应该也不便宜吧」 +- 「写的又详细又中肯」 + +→ **品牌介绍帖是最直接的获客工具**,评论区就是客资池。 diff --git a/wiki/topics/普拉提一人一馆-内容矩阵策划.md b/wiki/topics/普拉提一人一馆-内容矩阵策划.md new file mode 100644 index 0000000..0d02df1 --- /dev/null +++ b/wiki/topics/普拉提一人一馆-内容矩阵策划.md @@ -0,0 +1,95 @@ +--- +type: topic +created: 2026-04-19 +updated: 2026-04-19 +tags: [普拉提, 内容策划, 小红书运营, 获客, 一人一馆] +sources: [wiki/sources/xhs-普拉提私教-竞品爆款分析, wiki/sources/xhs-普拉提引流-top5爆款] +--- + +# 普拉提一人一馆 · 小红书内容矩阵策划 + +基于 2026-04-19 竞品爆款分析,为 Focus Core 制定的内容发布策略。 + +--- + +## 一、内容矩阵 4:2:1 模型 + +每周 7 篇,按流量款:信任款:人设款 = 4:2:1 分配。 + +### A类 · 流量款(4篇/周)— 拉新曝光 + +| 选题方向 | 示例标题 | 参考爆款 | +|---------|---------|---------| +| 体态问题解决方案 | 3个动作改善骨盆前倾|普拉提私教教学 | 欢欢 4397赞 | +| 圆肩驼背改善 | 告别圆肩驼背|Reformer 美背训练 | pilateswithannabel 2487赞 | +| 产后/办公室痛点 | 久坐族肩颈僵硬?普拉提拯救低头族 | Liviana 1254赞 | +| 局部问题针对 | X型腿/足外翻?这样练真的有变化 | may练普拉提 2023赞 | + +**关键要素**: +- 视频为主(动作展示需要动态) +- 标题带数字+具体问题 +- 高搜索词:骨盆前倾、圆肩驼背、富贵包、产后修复 + +### B类 · 信任款(2篇/周)— 转化意向 + +| 选题方向 | 示例标题 | 参考 | +|---------|---------|------| +| 学员前后对比 | 10节课的变化|学员体态对比记录 | 前后对比类笔记 | +| 品牌/服务介绍 | 关于我的课程与价格,一篇讲清楚 | AND HER 1163赞 | +| 知识科普 | 普拉提私教和团课到底差在哪? | — | +| 体验课实录 | 一人一馆体验课实录|60分钟都在做什么 | ZONE PILATES 244赞 | + +**关键要素**: +- 图文为主(信息密度高) +- 学员案例需征得同意 +- 品牌介绍帖是长期获客工具 + +### C类 · 人设款(1篇/周)— 情感连接 + +| 选题方向 | 示例标题 | 参考 | +|---------|---------|------| +| 日常Vlog | 一人一馆的一天 | 放羊的杨- 系列 | +| 创业故事 | 为什么选择一人一馆? | 放羊的杨- 331赞 | +| 心里话 | 一个人开馆最难的不是没客户,是… | 一人一馆弊端帖 222赞 | + +**关键要素**: +- 视频 Vlog 为主 +- 展示真实生活状态 +- 建立「专业之外」的人设维度 + +--- + +## 二、话题标签策略 + +### 每篇必带(核心标签) +`#普拉提` `#普拉提私教` `#一人一馆` + +### 轮换使用(流量标签) +- 体态类:`#体态矫正` `#圆肩驼背` `#骨盆前倾` `#富贵包` +- 人群类:`#产后修复` `#腹直肌分离` `#上班族` +- 业态类:`#私教课` `#普拉提工作室` + +### 必带(地域标签 — 本地获客核心) +`#深圳普拉提` `#宝安普拉提` `#坪洲普拉提` `#深圳` `#宝安` + +--- + +## 三、发布节奏建议 + +| 日 | 一 | 二 | 三 | 四 | 五 | 六 | +|---|---|---|---|---|---|---| +| C人设 | A流量 | B信任 | A流量 | A流量 | B信任 | A流量 | + +- 工作日发布教学类(上班族刷小红书高峰) +- 周末发人设类(用户有时间看Vlog) +- 品牌介绍帖择时发布后置顶 + +--- + +## 相关页面 + +- [[wiki/sources/xhs-普拉提私教-竞品爆款分析]] — 竞品数据来源 +- [[wiki/entities/focus-core]] — 场馆信息 +- [[wiki/entities/and-her-pilates]] — 品牌介绍帖标杆 +- [[wiki/entities/放羊的杨]] — 一人一馆日常标杆 +- [[wiki/ideas/品牌介绍帖-focus-core]] — 首篇品牌介绍帖策划