Kay Xhs

ClawSkills 作者 papayalove v1.0.3

小红书全自动内容创作工作流 - 从爆款研究到草稿发布的完整 pipeline。 使用场景:(1) 研究小红书爆款笔记风格和趋势,(2) 生成 AI 图片/漫画/封面,(3) 自动发布到小红书草稿箱。 **依赖**: 需要安装 kay-image skill 并配置 KIE_API_KEY

源码 ↗

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install clawskills:papayalove~kay-xhs
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/clawskills%3Apapayalove~kay-xhs/file -o kay-xhs.md
Git 仓库获取源码
git clone https://github.com/openclaw/skills/commit/be320f9e640a1f3df6b923b6465e5312b9ba84a8
# Kay XHS - 小红书全自动创作工作流

一站式小红书内容创作解决方案,从爆款研究到草稿发布。

## ⚠️ 必需依赖

### 1. 安装 kay-image Skill(AI 生图必备)

**必须先安装,否则无法生成图片!**

```bash
# 安装 kay-image skill
clawhub install kay-image

# 配置 API Key
cp skills/kay-image/.env.example skills/kay-image/.env

# 编辑 .env 文件,填入从 https://kie.ai/ 获取的 API Key
nano skills/kay-image/.env
```

**获取 KIE API Key:**
1. 访问 https://kie.ai/
2. 注册并登录账号
3. 进入控制台 → API 管理
4. 创建 API Key 并复制

**验证安装:**
```bash
# 测试生图功能
kay-image -p "测试图片,一只可爱的猫咪" -o test.png --ar 1:1
```

### 2. 浏览器准备(自动发布用)

确保 OpenClaw 浏览器已配置,用于小红书网页操作。

---

**确认以上步骤完成后,再开始创作工作流!**

## 核心能力

1. **爆款研究** - 分析热门笔记风格、构图、文案套路
2. **AI 生图** - 生成封面、漫画、配图(支持 KIE 和 Gemini 双引擎)
3. **自动发布** - 保存到小红书草稿箱

## 完整工作流

### Phase 1: 账号准备

**工具:** `browser` (openclaw profile)

```
1. 打开浏览器访问 https://creator.xiaohongshu.com
2. 检查登录状态(如未登录需短信验证)
3. 确认当前账号名称
```

**关键检查点:**
- 账号是否登录
- 账号名称是否正确
- 网络连接正常

---

### Phase 2: 爆款研究

**工具:** `browser`

提取高点赞笔记的:
-图片
-标题
-作者
-文案
-标签

#### 方法 1: Performance API(⭐ 批量方法)

**原理**: 点击首图预览模式后,从浏览器 Performance API 获取所有已加载的网络资源,不受 DOM 移除影响。

**适用场景**: 需要采集完整图片列表,尤其是 10+ 张图片的笔记

**前提条件**: 
- ✅ **必须打开预览 modal**(点击笔记封面图)
- ✅ 等待 2-3 秒让所有资源加载完成
- ❌ 不需要切换图片(懒加载会移除旧 URL,但 Performance API 保留记录)

**代码**:
```javascript
// 打开预览 modal 后,等待 2-3 秒,然后执行
function extractImagesFromPerformance() {
  const entries = performance.getEntriesByType('resource')
    .filter(e => 
      e.name.includes('xhscdn.com') && 
      (e.name.includes('spectrum') || e.name.includes('notes_pre_post')) &&
      !e.name.includes('imageView2') // 排除缩略图
    );
  
  const urls = [...new Set(entries.map(e => e.name))];
  
  return {
    total: urls.length,
    urls: urls.map((url, i) => ({ index: i+1, url }))
  };
}

// 执行
extractImagesFromPerformance();
```

**优势**:
- ✅ 不需要切换图片,打开预览等待即可
- ✅ 获取所有历史加载记录,包括已移除的 DOM 元素
- ✅ 速度最快,单篇笔记 < 3 秒
- ✅ 可获取 20-30+ 张图片 URL(包含各种尺寸版本)

**劣势**:
- ⚠️ 可能包含重复 URL(不同尺寸版本)
- ⚠️ 需要打开预览 modal 后等待 2-3 秒让资源加载

**实际案例**:
- 笔记 8 (10 张图): 获取 27 个 URL → 筛选出 10 张正文图
- 采集时间:~3 秒
- 完整度:100%

---

#### 方法 2: DOM 全量提取(⭐ 批量方法)

**原理**: 打开预览模式后,提取页面所有 `<img>` 标签,包括头像、评论图等,然后过滤出正文图片。

**适用场景**: Performance API 无效时,或需要快速获取少量图片

**前提条件**: 
- ✅ **必须打开预览 modal**(点击笔记封面图)
- ✅ 等待页面完全加载
- ⚠️ 懒加载图片可能未出现在 DOM 中(需要切换或等预加载)

**代码**:
```javascript
// 打开预览 modal 后执行
function extractImagesFromDOM() {
  const allImgs = document.querySelectorAll('img');
  const urls = [];
  
  allImgs.forEach(img => {
    if (img.src && img.src.includes('xhscdn.com') && img.src.length > 50) {
      const cleanUrl = img.src.split('?')[0]; // 移除查询参数
      if (!urls.includes(cleanUrl)) {
        urls.push(cleanUrl);
      }
    }
  });
  
  // 过滤出正文图片(排除头像、图标等)
  const contentImages = urls.filter(url => 
    url.includes('spectrum') || url.includes('notes_pre_post')
  );
  
  return {
    total: contentImages.length,
    urls: contentImages.map((url, i) => ({ index: i+1, url }))
  };
}

// 执行
extractImagesFromDOM();
```

**优势**:
- ✅ 简单直接,不需要切换图片
- ✅ 可获取 50+ 个图片资源(包含头像、评论图等)
- ✅ 过滤后得到完整正文图片列表

**劣势**:
- ⚠️ 可能包含非正文图片(需要过滤)
- ⚠️ 懒加载图片可能未出现在 DOM 中(小红书会预加载部分图片)

**实际案例**:
- 笔记 9 (5 张图): 获取 52 个 URL → 筛选出 5 张正文图
- 采集时间:~2 秒
- 完整度:100%

---

#### 方法 3: 循环点击切换(保底方法)

**原理**: 手动切换每张图片,强制触发懒加载,确保所有图片 URL 加载到 DOM。

**适用场景**: 批量方法失效时,或需要确保 100% 完整度

**完整操作步骤**:
```
1. 访问搜索页:https://www.xiaohongshu.com/search_result?keyword=关键词&type=51
2. 等待笔记列表加载完成
3. 点击目标笔记的【首图/封面图】(不是标题文字)
   - 这会打开预览 modal,显示笔记完整内容
   - 无需进入详情页,避免反爬虫限制
4. 【关键步骤】循环切换所有图片:
   - 读取图片计数(如 1/13 = 共 13 张)
   - 点击"下一张"按钮 (右侧箭头) 12 次
   - 每次切换后等待 1-2 秒让图片加载
   - 确保所有图片都加载到 DOM 中
5. 提取数据:
   - 使用 JavaScript 提取所有图片 URL
   - 记录文案、标签、点赞/收藏/评论数
   - 采集前 5 条评论
6. 点击 X 或外部区域关闭 preview modal
7. 返回搜索列表,继续下一篇笔记
```

**⚠️ 错误示范(会失败)**:
```javascript
// ❌ 错误:打开 modal 后直接提取,只能拿到 1-3 张
click(firstImage);
extractImages(); // 只返回 3 张!
```

**✅ 正确示范(完整采集)**:
```javascript
// ✅ 正确:循环切换后再提取
click(firstImage); // 打开 modal
for (let i = 0; i < totalImages - 1; i++) {
  click(nextButton); // 点击"下一张"
  await sleep(1500); // 等待加载
}
// 现在所有图片 URL 都加载到 DOM 了
extractImages(); // 返回完整 13 张!
```

**提取图片 URL 的完整代码**:
```javascript
// 在 preview modal 中执行
const extractNoteData = () => {
  // 1. 提取所有图片 URL
  const images = document.querySelectorAll('.swiper-slide img, .note-detail img');
  const imageUrls = Array.from(images).map((img, index) => ({
    index: index + 1,
    url: img.src || img.getAttribute('src')
  })).filter(item => item.url);
  
  // 2. 提取基础信息
  const title = document.querySelector('[class*="title"]')?.textContent?.trim();
  const author = document.querySelector('[class*="author"]')?.textContent?.trim();
  const likes = document.querySelector('[class*="like"]')?.textContent?.trim();
  
  // 3. 提取评论
  const comments = [];
  const commentElements = document.querySelectorAll('[class*="comment"]');
  commentElements.forEach((el, index) => {
    if (index >= 5) return;
    const userEl = el.querySelector('a');
    const contentEl = el.querySelector('p, [class*="content"]');
    if (userEl && contentEl) {
      comments.push({
        user: userEl.textContent?.trim(),
        content: contentEl.textContent?.trim()
      });
    }
  });
  
  return {
    totalImages: imageUrls.length,
    images: imageUrls,
    title,
    author,
    likes,
    comments
  };
};

// 执行提取
extractNoteData();
```

**循环切换图片的完整代码**:
```javascript
// 在 preview modal 中循环切换所有图片
const cycleThroughImages = async (totalImages) => {
  const nextButton = document.querySelector('.swiper-button-next, [class*="next"], [aria-label="下一张"]');
  
  for (let i = 1; i < totalImages; i++) {
    if (nextButton) {
      nextButton.click();
      await new Promise(resolve => setTimeout(resolve, 1500)); // 等待 1.5 秒
    }
  }
  
  console.log(`✅ 已切换 ${totalImages} 张图片,现在可以提取完整 URL 列表`);
};

// 使用示例:
// cycleThroughImages(13).then(() => extractNoteData());
```

**实际采集案例**:
- 笔记:"我想拉屎" (2.5 万赞)
- 成功提取:13 张图片 URL
- 数据完整度:100%
- 图片 URL 格式:`https://sns-webpic-qc.xhscdn.com/.../notes_pre_post/...`

**性能参考**:
- 打开搜索页:~2-3 秒
- 点击首图打开 modal: ~1-2 秒
- 浏览全部图片 (13 张): ~10-15 秒
- 提取数据:~1 秒
- 单篇笔记总时间:~15-20 秒

**批量采集策略**:
```
对于 10 篇笔记的批量采集:
1. 搜索关键词,获取结果列表
2. 筛选点赞 1000+ 的笔记
3. 逐一点击首图进入 preview modal
4. 浏览所有图片并提取 URL
5. 关闭 modal,继续下一篇
6. 预计总时间:3-5 分钟
```

**注意事项**:
- ✅ 点击的是【图片】不是【标题文字】
- ✅ **必须循环切换所有图片**才能提取完整 URL 列表(懒加载!)
- ✅ Preview modal 中可以看到图片计数 (如 1/13)
- ✅ 建议间隔 2-3 秒再点击下一篇,模拟正常用户行为
- ⚠️ 不要直接访问笔记详情页(会 404)


**研究维度:**
| 维度 | 分析内容 |
|------|---------|
| 视觉风格 | 色彩、构图、人物/场景类型 |
| 文案结构 | 标题公式、正文套路、互动引导 |
| 话题标签 | 高频标签、组合策略 |
| 发布时间 | 最佳发布时段 |

---

### Phase 3: 内容策划

基于爆款研究,确定:

1. **内容类型**
   - 图文笔记
   - AI 漫画(四格/条漫)
   - 教程分享
   - 情感故事

2. **风格定位**
   - 治愈系
   - 搞笑/吐槽
   - 知识科普
   - 生活美学

3. **图片规划**
   - 数量(1-4 张)
   - 尺寸(3:4 竖版优先)
   - 风格统一性

---

### Phase 4: AI 生图

**工具:** `kay-image` (KIE API)

#### 生图引擎

| 引擎 | 工具 | 配置要求 | 适用场景 |
|------|------|----------|----------|
| **KIE** | `kay-image` | `KIE_API_KEY` | 高质量 4K 输出,角色一致性 |

**配置检查:**
```bash
# 确保已设置 KIE_API_KEY
export KIE_API_KEY="your-api-key"

# 测试生图
kay-image -p "一只可爱的橘猫在草地上玩耍" -o test.png --ar 1:1
```

#### 4.1 封面生成
```bash
kay-image \
  --prompt "描述..." \
  --output cover.jpg \
  --ar 3:4 \
  --resolution 2K
```

#### 4.2 四格漫画生成(关键!)
**必须一次生成,不要分格生成!**

```bash
kay-image \
  --prompt "四格漫画,2x2 网格布局:
第一格(左上):...,画面下方文字'...'
第二格(右上):...,画面下方文字'...'
第三格(左下):...,画面下方文字'...'
第四格(右下):...,画面下方文字'...'
确保角色形象一致,色调从冷到暖渐变" \
  --output comic_4panel.jpg \
  --ar 3:4 \
  --resolution 2K
```

#### 4.3 图生图(风格迁移)

```bash
kay-image \
  --prompt "转换成...风格" \
  --input /path/to/reference.jpg \
  --output result.jpg
```

#### 4.4 批量生图模式(推荐 ⭐)

**场景**: 需要生成多张图片(如 4 张 2 格漫画)

**优势**:
- ✅ **批量提交**: 一次性提交所有任务
- ✅ **统一轮询**: 每 20 秒检查所有任务状态
- ✅ **并行下载**: 所有完成后同时下载
- ✅ **效率提升**: 4 张图从 8 分钟 → 3 分钟

**使用方法**:

```bash
# 1. 创建批量任务配置文件
cat > comic-tasks.json << 'EOF'
[
  {
    "prompt": "唯美治愈系手绘,2格漫画第一格:女孩独自思考...",
    "output": "comic-01.png",
    "ar": "3:4",
    "resolution": "2K"
  },
  {
    "prompt": "唯美治愈系手绘,2格漫画第二格:女孩自我怀疑...",
    "output": "comic-02.png",
    "ar": "3:4",
    "resolution": "2K"
  }