feat: 增加运营技巧
This commit is contained in:
@@ -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`
|
|
||||||
@@ -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. **不提链接**: 想了解的自然会搜
|
|
||||||
|
|
||||||
## 优化后版本
|
|
||||||
|
|
||||||
**标题**: 换季维稳精华|敏感肌亲测不踩雷
|
|
||||||
|
|
||||||
**正文**:
|
|
||||||
```
|
|
||||||
换季皮肤又开始闹脾气了😢
|
|
||||||
泛红、起皮、还有点刺痛...
|
|
||||||
|
|
||||||
朋友推荐我试了这款精华,用了两周来反馈!
|
|
||||||
|
|
||||||
💧质地:精华液偏水状,流动性很好
|
|
||||||
👃气味:几乎没什么味道,敏感肌友好
|
|
||||||
✨使用感:上脸很温和,没有刺激感
|
|
||||||
|
|
||||||
我连续用了两周,泛红情况确实好了很多
|
|
||||||
唯一觉得不太好的是按压头有点难控制用量
|
|
||||||
|
|
||||||
敏感肌姐妹可以考虑~你们换季用什么维稳?👇
|
|
||||||
|
|
||||||
#敏感肌护肤 #换季护肤 #维稳精华 #敏感肌精华推荐
|
|
||||||
```
|
|
||||||
```
|
|
||||||
@@ -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
|
|
||||||
```
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
# 小红书敏感词库 (Sensitive Words Reference)
|
|
||||||
|
|
||||||
## 🔴 高危词汇 (删帖/封号风险)
|
|
||||||
|
|
||||||
### 医疗违规
|
|
||||||
- 治愈、根治、药到病除
|
|
||||||
- 处方药名称
|
|
||||||
- 癌症、肿瘤等重大疾病+治疗方案
|
|
||||||
- 医美手术具体操作描述
|
|
||||||
|
|
||||||
### 金融违规
|
|
||||||
- 稳赚、保本、高收益
|
|
||||||
- 具体投资回报率承诺
|
|
||||||
- 代投、跟单、带单
|
|
||||||
- 虚拟货币交易引导
|
|
||||||
|
|
||||||
### 政治敏感
|
|
||||||
- 国家领导人姓名+评价
|
|
||||||
- 敏感政治事件
|
|
||||||
- 境外政治内容
|
|
||||||
|
|
||||||
### 违法内容
|
|
||||||
- 赌博、博彩相关
|
|
||||||
- 毒品、违禁品
|
|
||||||
- 枪支、管制刀具
|
|
||||||
- 色情、低俗内容
|
|
||||||
|
|
||||||
### 引流违规
|
|
||||||
- 直接微信号/QQ号
|
|
||||||
- "私我"、"滴滴"、"DD"
|
|
||||||
- 明显外链、二维码
|
|
||||||
- "主页有联系方式"
|
|
||||||
|
|
||||||
## 🟠 中危词汇 (限流风险)
|
|
||||||
|
|
||||||
### 绝对化用语
|
|
||||||
- 最好、最佳、第一、首选
|
|
||||||
- 100%、绝对、肯定
|
|
||||||
- 全网最低、史上最强
|
|
||||||
- 国家级、世界级
|
|
||||||
|
|
||||||
### 医疗擦边
|
|
||||||
- 祛痘、美白、抗衰(需谨慎表述)
|
|
||||||
- 减肥、瘦身(避免效果承诺)
|
|
||||||
- 功效承诺类描述
|
|
||||||
- "亲测有效"+"医疗效果"
|
|
||||||
|
|
||||||
### 商业敏感
|
|
||||||
- 价格对比贬低竞品
|
|
||||||
- "比XX便宜"
|
|
||||||
- 购买链接暗示
|
|
||||||
- 过度促销用语
|
|
||||||
|
|
||||||
### 版权风险
|
|
||||||
- 未授权品牌logo
|
|
||||||
- 影视剧截图过多
|
|
||||||
- 音乐版权内容
|
|
||||||
- 他人原创内容搬运
|
|
||||||
|
|
||||||
## 🟡 低危词汇 (可能延迟审核)
|
|
||||||
|
|
||||||
### 可能触发审核
|
|
||||||
- 赚钱、副业、兼职
|
|
||||||
- 借贷、贷款、信用卡
|
|
||||||
- 整容、医美、手术
|
|
||||||
- 政策、法规相关
|
|
||||||
|
|
||||||
### 行业特殊词
|
|
||||||
- 保健品功效描述
|
|
||||||
- 母婴产品安全声明
|
|
||||||
- 食品功效暗示
|
|
||||||
- 化妆品成分功效
|
|
||||||
|
|
||||||
## ✅ 安全表述替换
|
|
||||||
|
|
||||||
| 危险表述 | 安全替换 |
|
|
||||||
|----------|----------|
|
|
||||||
| 最好的 | 我用过很不错的 |
|
|
||||||
| 100%有效 | 我个人体验很好 |
|
|
||||||
| 治愈了我的XX | 改善了我的XX情况 |
|
|
||||||
| 加我微信 | 可以交流(不留号) |
|
|
||||||
| 绝对好用 | 亲测感觉很棒 |
|
|
||||||
| 全网最低价 | 我买的时候很划算 |
|
|
||||||
| 药到病除 | 对我的情况有帮助 |
|
|
||||||
| 专家推荐 | 我看到有人推荐 |
|
|
||||||
| 官方认证 | 我在官方渠道买的 |
|
|
||||||
|
|
||||||
## 行业特殊规则
|
|
||||||
|
|
||||||
### 美妆护肤
|
|
||||||
- ❌ 避免:药妆、医学护肤、治疗效果
|
|
||||||
- ✅ 使用:护肤体验、个人感受、肤感描述
|
|
||||||
|
|
||||||
### 母婴育儿
|
|
||||||
- ❌ 避免:治疗婴儿疾病、代替医嘱
|
|
||||||
- ✅ 使用:个人育儿经验、仅供参考
|
|
||||||
|
|
||||||
### 健身减肥
|
|
||||||
- ❌ 避免:X天瘦X斤、快速减肥
|
|
||||||
- ✅ 使用:健身记录、饮食分享、个人体验
|
|
||||||
|
|
||||||
### 金融理财
|
|
||||||
- ❌ 避免:投资建议、收益承诺
|
|
||||||
- ✅ 使用:个人理财记录、学习笔记
|
|
||||||
|
|
||||||
## 检测方法
|
|
||||||
|
|
||||||
分析笔记时,按以下优先级检查:
|
|
||||||
|
|
||||||
1. **全文扫描** — 检查是否包含高危词库中的词汇
|
|
||||||
2. **上下文分析** — 判断中危词汇的使用语境
|
|
||||||
3. **意图识别** — 判断是否有引流、违规推广意图
|
|
||||||
4. **替换建议** — 提供安全表述替换方案
|
|
||||||
@@ -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周恢复的👇"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 首段钩子技巧
|
|
||||||
- 抛出问题:"你们有没有这种情况?"
|
|
||||||
- 制造悬念:"但是有个关键点..."
|
|
||||||
- 预告价值:"下面分享我的方法"
|
|
||||||
- 引发共鸣:"和我一样的姐妹看过来"
|
|
||||||
@@ -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.
|
|
||||||
@@ -1,315 +0,0 @@
|
|||||||
# XHS AI Toolkit
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<b>Make AI understand your Xiaohongshu (RedNote)</b>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="README_CN.md">简体中文</a> | English
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img alt="License" src="https://img.shields.io/badge/license-MIT-blue.svg">
|
|
||||||
<img alt="Platform" src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS-lightgrey.svg">
|
|
||||||
<img alt="Python" src="https://img.shields.io/badge/python-3.10+-green.svg">
|
|
||||||
<img alt="MCP" src="https://img.shields.io/badge/MCP-compatible-purple.svg">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
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 <id> <token> # Get post details
|
|
||||||
./comment.sh <id> <token> "Great post!" # Comment
|
|
||||||
./user-profile.sh <user_id> <xsec_token> # 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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<b>If this project helps you, please give it a ⭐!</b>
|
|
||||||
</p>
|
|
||||||
@@ -1,373 +0,0 @@
|
|||||||
# XHS AI Toolkit
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<b>让 AI 读懂你的小红书</b>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
简体中文 | <a href="README.md">English</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img alt="License" src="https://img.shields.io/badge/license-MIT-blue.svg">
|
|
||||||
<img alt="Platform" src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS-lightgrey.svg">
|
|
||||||
<img alt="Python" src="https://img.shields.io/badge/python-3.10+-green.svg">
|
|
||||||
<img alt="MCP" src="https://img.shields.io/badge/MCP-compatible-purple.svg">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
小红书 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 <id> <token> # 获取帖子详情
|
|
||||||
./comment.sh <id> <token> "写得真好!" # 发表评论
|
|
||||||
./user-profile.sh <user_id> <xsec_token> # 获取用户主页
|
|
||||||
```
|
|
||||||
|
|
||||||
### 热点跟踪
|
|
||||||
|
|
||||||
自动搜索热帖并生成分析报告:
|
|
||||||
|
|
||||||
```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 项目未声明开源许可证,请遵守其作者的使用条款。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<b>觉得有用?给个 ⭐ 支持一下!</b>
|
|
||||||
</p>
|
|
||||||
@@ -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 <feed_id> <xsec_token>` | 帖子详情+评论 | 从搜索结果获取 |
|
|
||||||
| `comment.sh <feed_id> <xsec_token> <内容>` | 发表评论 | 从搜索结果获取 |
|
|
||||||
| `user-profile.sh <user_id> <xsec_token>` | 用户主页+笔记 | 从搜索结果获取 |
|
|
||||||
| `track-topic.sh <话题> [选项]` | 热点分析报告 | `--limit N` `--output file` `--feishu` |
|
|
||||||
| `export-long-image.sh` | 帖子导出长图 | `--posts-file json -o output.jpg` |
|
|
||||||
| `mcp-call.sh <tool> [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`,脚本自动管理)
|
|
||||||
@@ -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 <note_id> <xsec_token> <评论内容>"
|
|
||||||
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"
|
|
||||||
@@ -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}]
|
|
||||||
@@ -1,260 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
小红书帖子长图导出工具
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 export-long-image.py --posts '<json>' --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()
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 小红书帖子导出长图
|
|
||||||
#
|
|
||||||
# 用法:
|
|
||||||
# ./export-long-image.sh --posts-file posts.json -o output.jpg
|
|
||||||
# ./export-long-image.sh --posts '<json>' -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" "$@"
|
|
||||||
@@ -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
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 启动小红书登录工具
|
|
||||||
|
|
||||||
XHS_LOGIN="$HOME/.local/bin/xiaohongshu-login"
|
|
||||||
|
|
||||||
echo "启动小红书登录工具..."
|
|
||||||
echo "注意:需要桌面环境或 X11 转发"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
"$XHS_LOGIN"
|
|
||||||
@@ -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 <tool_name> [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 .
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 获取小红书帖子详情
|
|
||||||
|
|
||||||
NOTE_ID="$1"
|
|
||||||
XSEC_TOKEN="$2"
|
|
||||||
|
|
||||||
if [ -z "$NOTE_ID" ] || [ -z "$XSEC_TOKEN" ]; then
|
|
||||||
echo "用法: $0 <note_id> <xsec_token>"
|
|
||||||
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"
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 获取小红书首页推荐列表
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
"$SCRIPT_DIR/mcp-call.sh" list_feeds
|
|
||||||
@@ -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"
|
|
||||||
@@ -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
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 检查小红书登录状态
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
"$SCRIPT_DIR/mcp-call.sh" check_login_status
|
|
||||||
@@ -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
|
|
||||||
@@ -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()
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 小红书热点跟踪工具
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
python3 "$SCRIPT_DIR/track-topic.py" "$@"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 获取小红书用户主页
|
|
||||||
|
|
||||||
USER_ID="$1"
|
|
||||||
XSEC_TOKEN="$2"
|
|
||||||
|
|
||||||
if [ -z "$USER_ID" ] || [ -z "$XSEC_TOKEN" ]; then
|
|
||||||
echo "用法: $0 <user_id> <xsec_token>"
|
|
||||||
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"
|
|
||||||
@@ -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
|
|
||||||
@@ -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())
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
86
.claude/skills/post-to-xhs/SKILL.md
Normal file
86
.claude/skills/post-to-xhs/SKILL.md
Normal file
@@ -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 |
|
||||||
|
| 标题超长 | 提示用户缩短标题 |
|
||||||
|
| 图片路径无效 | 提示检查路径是否正确 |
|
||||||
|
| 视频使用了相对路径 | 提示改为绝对路径 |
|
||||||
|
| 发布失败 | 展示错误信息,建议检查内容或重试 |
|
||||||
143
.claude/skills/setup-xhs-mcp/SKILL.md
Normal file
143
.claude/skills/setup-xhs-mcp/SKILL.md
Normal file
@@ -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 方式 |
|
||||||
|
| 配置写入后工具仍不可用 | 提示重启客户端会话 |
|
||||||
|
| 已有配置但地址错误 | 修正地址并重启 |
|
||||||
@@ -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 理清思路再动手写
|
|
||||||
41
.claude/skills/xhs-content-plan/SKILL.md
Normal file
41
.claude/skills/xhs-content-plan/SKILL.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
name: xhs-content-plan
|
||||||
|
description: |
|
||||||
|
小红书内容策划助手:搜索分析热门内容和竞品,帮助规划内容方向、选题、标签策略。
|
||||||
|
当用户想做小红书运营规划时使用——内容策划、选题灵感、竞品分析、爆款分析、热门话题研究、怎么做小红书、涨粉策略等。
|
||||||
|
---
|
||||||
|
|
||||||
|
## 执行流程
|
||||||
|
|
||||||
|
### 1. 明确策划需求
|
||||||
|
|
||||||
|
向用户了解:
|
||||||
|
- 目标领域/赛道(如:美妆、旅行、美食)
|
||||||
|
- 策划目的:选题灵感 / 竞品分析 / 热门趋势
|
||||||
|
|
||||||
|
### 2. 搜索分析
|
||||||
|
|
||||||
|
根据需求调用 `search_feeds` 搜索相关内容:
|
||||||
|
- 使用不同关键词多次搜索覆盖领域
|
||||||
|
- 利用 `sort_by` 筛选:最多点赞(爆款)、最新(趋势)
|
||||||
|
|
||||||
|
对高互动笔记,调用 `get_feed_detail` 获取详情,分析:
|
||||||
|
- 标题写法和关键词
|
||||||
|
- 内容结构和篇幅
|
||||||
|
- 话题标签使用
|
||||||
|
- 评论区用户关注点
|
||||||
|
|
||||||
|
如需分析特定博主,调用 `user_profile` 查看其内容风格和数据表现。
|
||||||
|
|
||||||
|
### 3. 输出策划建议
|
||||||
|
|
||||||
|
整理分析结果,为用户提供:
|
||||||
|
- 热门选题方向
|
||||||
|
- 标题参考模板
|
||||||
|
- 推荐话题标签
|
||||||
|
- 内容结构建议
|
||||||
|
|
||||||
|
## 约束
|
||||||
|
|
||||||
|
- 这是只读分析 skill,不执行任何发布或互动操作
|
||||||
|
- 搜索操作需要已登录状态
|
||||||
44
.claude/skills/xhs-explore/SKILL.md
Normal file
44
.claude/skills/xhs-explore/SKILL.md
Normal file
@@ -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 |
|
||||||
|
| 笔记已删除或不可见 | 告知用户该笔记无法访问 |
|
||||||
70
.claude/skills/xhs-interact/SKILL.md
Normal file
70
.claude/skills/xhs-interact/SKILL.md
Normal file
@@ -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 | 提示先搜索或浏览获取笔记信息 |
|
||||||
|
| 笔记不可评论 | 告知用户该笔记已关闭评论 |
|
||||||
55
.claude/skills/xhs-login/SKILL.md
Normal file
55
.claude/skills/xhs-login/SKILL.md
Normal file
@@ -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_data>" | 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` |
|
||||||
29
.claude/skills/xhs-profile/SKILL.md
Normal file
29
.claude/skills/xhs-profile/SKILL.md
Normal file
@@ -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 |
|
||||||
|
| 用户不存在 | 告知用户该主页无法访问 |
|
||||||
44
.claude/skills/xhs-search/SKILL.md
Normal file
44
.claude/skills/xhs-search/SKILL.md
Normal file
@@ -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 登录 |
|
||||||
|
| 无搜索结果 | 建议调整关键词或筛选条件 |
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../.agents/skills/xiaohongshu
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../.agents/skills/xiaohongshu-note-analyzer
|
|
||||||
2
.obsidian/graph.json
vendored
2
.obsidian/graph.json
vendored
@@ -17,6 +17,6 @@
|
|||||||
"repelStrength": 10,
|
"repelStrength": 10,
|
||||||
"linkStrength": 1,
|
"linkStrength": 1,
|
||||||
"linkDistance": 250,
|
"linkDistance": 250,
|
||||||
"scale": 1.992301859915002,
|
"scale": 2.506918337983666,
|
||||||
"close": false
|
"close": false
|
||||||
}
|
}
|
||||||
25
.obsidian/workspace.json
vendored
25
.obsidian/workspace.json
vendored
@@ -178,21 +178,32 @@
|
|||||||
},
|
},
|
||||||
"active": "07a6f5425ad166a7",
|
"active": "07a6f5425ad166a7",
|
||||||
"lastOpenFiles": [
|
"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/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/entities/cathy-普拉提.md",
|
||||||
"wiki/ideas/案例拆解内容模型.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",
|
"CLAUDE.md",
|
||||||
"wiki/index.md",
|
"wiki/index.md",
|
||||||
"assets",
|
"assets",
|
||||||
"wiki/topics",
|
"wiki/topics",
|
||||||
"wiki/sources",
|
"wiki/sources",
|
||||||
"wiki/meta",
|
|
||||||
"wiki/ideas",
|
"wiki/ideas",
|
||||||
"wiki/entities",
|
"wiki/entities",
|
||||||
"wiki"
|
"wiki"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../.agents/skills/xiaohongshu
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../.agents/skills/xiaohongshu-note-analyzer
|
|
||||||
51
wiki/entities/and-her-pilates.md
Normal file
51
wiki/entities/and-her-pilates.md
Normal file
@@ -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]]
|
||||||
53
wiki/entities/放羊的杨.md
Normal file
53
wiki/entities/放羊的杨.md
Normal file
@@ -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-普拉提私教-竞品爆款分析]]
|
||||||
147
wiki/ideas/品牌介绍帖-focus-core.md
Normal file
147
wiki/ideas/品牌介绍帖-focus-core.md
Normal file
@@ -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/普拉提一人一馆-内容矩阵策划]] — 整体内容策略
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
type: meta
|
type: meta
|
||||||
created: 2026-04-15
|
created: 2026-04-15
|
||||||
updated: 2026-04-16
|
updated: 2026-04-19
|
||||||
---
|
---
|
||||||
|
|
||||||
# Wiki Index
|
# Wiki Index
|
||||||
@@ -14,11 +14,13 @@ updated: 2026-04-16
|
|||||||
- [[wiki/sources/xhs-普拉提引流-top5爆款]] — 小红书「普拉提引流」Top5 爆款笔记原始采集(472~203赞)
|
- [[wiki/sources/xhs-普拉提引流-top5爆款]] — 小红书「普拉提引流」Top5 爆款笔记原始采集(472~203赞)
|
||||||
- [[wiki/sources/xhs-三公里社群渗透方法论]] — 「如何让你的馆在三公里内所熟知」爆款拆解:社区渗透三步法(197赞/241藏)
|
- [[wiki/sources/xhs-三公里社群渗透方法论]] — 「如何让你的馆在三公里内所熟知」爆款拆解:社区渗透三步法(197赞/241藏)
|
||||||
- [[wiki/sources/xhs-普拉提IP打造-案例拆解法]] — 「普拉提ip难做❓看看她是怎么做的❓」案例拆解型爆款分析(185赞/139藏,收藏率75%)
|
- [[wiki/sources/xhs-普拉提IP打造-案例拆解法]] — 「普拉提ip难做❓看看她是怎么做的❓」案例拆解型爆款分析(185赞/139藏,收藏率75%)
|
||||||
|
- [[wiki/sources/xhs-普拉提私教-竞品爆款分析]] — 「普拉提私教」「一人一馆」赛道竞品爆款数据分析(60+笔记,含5种标题公式)
|
||||||
|
|
||||||
## Topics
|
## Topics
|
||||||
<!-- 主题/选题方向 -->
|
<!-- 主题/选题方向 -->
|
||||||
|
|
||||||
- [[wiki/topics/普拉提场馆引流-爆款逻辑]] — 5 篇爆款的标题公式、正文结构、标签策略、评论区规律拆解
|
- [[wiki/topics/普拉提场馆引流-爆款逻辑]] — 5 篇爆款的标题公式、正文结构、标签策略、评论区规律拆解
|
||||||
|
- [[wiki/topics/普拉提一人一馆-内容矩阵策划]] — 4:2:1内容矩阵(流量款/信任款/人设款),每周发布节奏,标签策略
|
||||||
|
|
||||||
## Entities
|
## Entities
|
||||||
<!-- 人物、品牌、产品、账号等实体 -->
|
<!-- 人物、品牌、产品、账号等实体 -->
|
||||||
@@ -26,8 +28,11 @@ updated: 2026-04-16
|
|||||||
- [[wiki/entities/focus-core]] — Focus Core 普拉提工作室:身份、地址、特色、目标客户、内容定位
|
- [[wiki/entities/focus-core]] — Focus Core 普拉提工作室:身份、地址、特色、目标客户、内容定位
|
||||||
- [[wiki/entities/贝贝聊IP]] — 小红书IP打造/自媒体运营博主,「案例拆解」内容模型代表
|
- [[wiki/entities/贝贝聊IP]] — 小红书IP打造/自媒体运营博主,「案例拆解」内容模型代表
|
||||||
- [[wiki/entities/cathy-普拉提]] — 普拉提博主,被贝贝聊IP拆解的起号案例
|
- [[wiki/entities/cathy-普拉提]] — 普拉提博主,被贝贝聊IP拆解的起号案例
|
||||||
|
- [[wiki/entities/and-her-pilates]] — AND HER PILATES:武汉普拉提工作室,品牌介绍帖标杆(1163赞/1011藏/74评)
|
||||||
|
- [[wiki/entities/放羊的杨]] — 放羊的杨-:一人一馆赛道标杆博主(1.19万粉/24.4万获赞),Vlog日常+创业故事
|
||||||
|
|
||||||
## Ideas
|
## Ideas
|
||||||
<!-- 创作灵感、选题构思、内容框架 -->
|
<!-- 创作灵感、选题构思、内容框架 -->
|
||||||
|
|
||||||
- [[wiki/ideas/案例拆解内容模型]] — 基于贝贝聊IP帖子提炼的「第三方博主拆解」创作框架,附6张卡片模板和标题公式
|
- [[wiki/ideas/案例拆解内容模型]] — 基于贝贝聊IP帖子提炼的「第三方博主拆解」创作框架,附6张卡片模板和标题公式
|
||||||
|
- [[wiki/ideas/品牌介绍帖-focus-core]] — Focus Core 品牌介绍帖完整策划:标题方案、10张图结构、正文文案、标签
|
||||||
|
|||||||
@@ -1,13 +1,29 @@
|
|||||||
---
|
---
|
||||||
type: meta
|
type: meta
|
||||||
created: 2026-04-15
|
created: 2026-04-15
|
||||||
updated: 2026-04-16
|
updated: 2026-04-19
|
||||||
---
|
---
|
||||||
|
|
||||||
# Wiki Log
|
# 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处缺陷
|
## [2026-04-16] lint | 修复7处缺陷
|
||||||
- 创建 wiki/meta/ 目录,将 index.md 和 log.md 移入
|
- 创建 wiki/meta/ 目录,将 index.md 和 log.md 移入
|
||||||
- 补全 index.md、log.md 缺失的 created/updated 字段
|
- 补全 index.md、log.md 缺失的 created/updated 字段
|
||||||
|
|||||||
135
wiki/raw/xhs-产后恢复引流帖-v2.md
Normal file
135
wiki/raw/xhs-产后恢复引流帖-v2.md
Normal file
@@ -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个泛流量标签 | 拉宽非精准流量入口 |
|
||||||
|
| 敏感处理 | "十个有八个" | 保留但建议发布时观察 | 无来源统计有审核风险 |
|
||||||
168
wiki/raw/普拉提引流调研报告.md
Normal file
168
wiki/raw/普拉提引流调研报告.md
Normal file
@@ -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. 评论区互动引导私信
|
||||||
|
- 在笔记末尾引导「想体验私聊我」
|
||||||
|
- 评论区有咨询及时回复
|
||||||
101
wiki/sources/xhs-普拉提私教-竞品爆款分析.md
Normal file
101
wiki/sources/xhs-普拉提私教-竞品爆款分析.md
Normal file
@@ -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 的「关于课程与价格」帖评论区典型内容:
|
||||||
|
- 「请问怎么预约体验课?」
|
||||||
|
- 「后台咨询了体验课,麻烦回复一下」
|
||||||
|
- 「想了解,感觉环境很喜欢」
|
||||||
|
- 「环境很美,价格应该也不便宜吧」
|
||||||
|
- 「写的又详细又中肯」
|
||||||
|
|
||||||
|
→ **品牌介绍帖是最直接的获客工具**,评论区就是客资池。
|
||||||
95
wiki/topics/普拉提一人一馆-内容矩阵策划.md
Normal file
95
wiki/topics/普拉提一人一馆-内容矩阵策划.md
Normal file
@@ -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]] — 首篇品牌介绍帖策划
|
||||||
Reference in New Issue
Block a user