文章素材收集 v2.1
MediaClaw 素材收集编排 Skill — OpenClaw Browser + Playwright 双模式
v1.0 → v2.1 修复历程
| 版本 | 修复内容 | |------|---------| | v1.0 | 问题版:Playwright 优先 → 截图搜索页 | | v2.0 | 修复:OpenClaw Browser 强制优先 → 截图实际文章页 | | v2.1 | 当前版:强化质量门槛、平台登录要求、修复 Reddit/X 截无效图问题 |
定位
上层编排 Skill,通过 Brave Search 发现 → 智能选择浏览器截图 完成结构化素材采集。
智能选择原则:公开页面用 Playwright(更快更稳),需要登录的页面用 OpenClaw Browser。
默认配置
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| 公开页面浏览器 | Playwright headless | Reddit、DEV、GitHub、Medium |
| 需登录页面浏览器 | OpenClaw Browser (openclaw profile) | X/Twitter、知乎(部分) |
| 截图质量门槛 | ≥50KB | (v2.1 从 20KB 提高到 50KB) |
| 信息源 | DEV, GitHub, Reddit, X, Medium, 知乎 | 可扩展 |
| 保存位置 | MediaClaw/output/articles/{date}/{topic}/素材/ | 调用方可覆盖 |
| 搜索工具 | Brave Search API | node ~/.openclaw/skills/brave-search/search.js |
平台登录要求(v2.1 新增)
| 平台 | 需要登录 | 推荐浏览器 | 素材价值 | |------|---------|-----------|---------| | DEV Community | ❌ 否 | Playwright | ⭐⭐⭐⭐⭐ 推荐替代 X/Reddit | | GitHub | ❌ 否 | Playwright | ⭐⭐⭐⭐⭐ 代码/项目测评必备 | | Reddit | ❌ 否 | Playwright | ⭐⭐⭐⭐ 社区观点,需实际帖子 URL | | Medium | ❌ 否 | Playwright | ⭐⭐⭐⭐ 技术博客 | | X/Twitter | ✅ 是 | OpenClaw Browser(需登录) | ⭐⭐⭐ 大V观点,未登录则跳过 | | 知乎 | ✅ 部分 | OpenClaw Browser | ⭐⭐⭐ 中文内容,未登录则跳过 | | Google | ❌ 否 | Playwright | ⭐ 热度参考,不截图搜索结果 |
Workflow(v2.1)
Phase 1: 确认收集参数
必须明确以下3项才能开始采集:
1. 主题/关键词 → 用来搜索的query(可以是中英文多个)
2. 文章关联 → 对应哪篇文章(日期+slug),决定保存路径
3. 信息源 → 从哪些平台收集(建议:DEV + GitHub + Reddit + Medium,跳过 X/知乎除非已登录)
输出确认:
素材收集确认(v2.1):
- 主题:{query}
- 关联文章:{date}/{slug}
- 保存位置:{output_dir}/素材/
- 信息源:{platforms}
- 浏览器策略:公开页面 → Playwright / 需登录 → OpenClaw Browser
Phase 2: 搜索发现(获取实际内容页 URL)
用 Brave Search API 发现实际内容页 URL(不是搜索结果页):
node ~/.openclaw/skills/brave-search/search.js "Claude Code vs Codex comparison 2026" -n 10 --content
关键原则:从搜索结果中提取实际文章/帖子 URL,按以下优先级:
| 优先级 | 平台类型 | URL 特征 | 说明 |
|--------|---------|---------|------|
| ⭐⭐⭐⭐⭐ | DEV Community 文章 | dev.to/{user}/{slug} | 公开内容,质量高,优先采集 |
| ⭐⭐⭐⭐⭐ | GitHub 项目页面 | github.com/{user}/{repo} | 工具/项目测评必备 |
| ⭐⭐⭐⭐ | Reddit 帖子 | reddit.com/r/{sub}/comments/{id}/ | 从搜索结果提取实际帖子 URL |
| ⭐⭐⭐⭐ | 技术博客(NxCode等) | 独立域名文章页 | 有数据、有观点、可截图 |
| ⭐⭐⭐ | Medium / 知乎 / CSDN | 文章页 URL | 中文内容,需文章页 URL |
| ⭐⭐ | X 大V 推文 | x.com/{user}/status/{id} | 需登录,未登录则跳过 |
| ⭐ | Google 搜索结果页 | google.com/search?q= | 仅作热度证明,不截文章 |
🚨 v2.1 特别注意:
- Reddit:URL 必须是
/comments/{id}/格式,不是/search/?q=格式 - X:必须从搜索结果提取实际推文 URL,未登录则跳过
- Google:严禁截图搜索结果页,只记录搜索结果数量
Phase 3: 智能采集(按平台选择浏览器)
公开页面 → Playwright(推荐)
import asyncio
from playwright.async_api import async_playwright
async def collect_material(url: str, output_path: str, wait_s: int = 8) -> dict:
"""采集公开页面素材"""
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page(
viewport={"width": 1400, "height": 900},
user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
)
try:
await page.goto(url, timeout=25000, wait_until="networkidle")
await asyncio.sleep(wait_s)
await page.screenshot(path=output_path, full_page=True)
size = os.path.getsize(output_path)
return {"status": "ok", "size": size, "path": output_path}
except Exception as e:
return {"status": "error", "error": str(e)}
finally:
await browser.close()
需要登录 → OpenClaw Browser
# 检查登录状态
browser(action="status", profile="openclaw")
# 如果 running=true → 已登录,继续
# 如果 running=false → 未登录 → 跳过该平台
# 打开页面
browser(action="open", profile="openclaw", targetUrl="https://...")
# 等待加载(X/知乎需要更长等待)
browser(action="act", targetId="xxx", request={"kind": "wait", "timeMs": 12000})
# 截图
browser(action="screenshot", profile="openclaw", targetId="xxx", type="png")
Phase 4: 质量验证(强制门控)
每个截图必须通过以下检查:
# 1. 文件大小 ≥ 50KB
size=$(stat -c%s "$path")
if [ $size -lt 51200 ]; then
echo "FAIL: 文件太小 (${size}B < 50KB),重试"
# 重试:增加等待时间 +5s
fi
# 2. 非空白图片
python3 -c "
from PIL import Image; import numpy as np
img = np.array(Image.open('$path'))
if img.mean() > 250:
print('FAIL: blank image')
else:
print('OK')
"
# 3. 内容相关性(目测检查截图是否包含目标关键词)
重试策略:
- 第一次失败 → 等待时间 +5s,重试
- 第二次失败 → 换浏览器方式(OpenClaw ↔ Playwright)
- 第三次失败 → 标记为"截图失败"并记录原因
Phase 5: 保存与索引
目录结构:
{OUTPUT_DIR}/素材/
├── README.md ← 素材索引(必须)
├── dev-community/ ← DEV 文章截图
│ └── *.png
├── github/ ← GitHub 项目截图
│ └── *.png
├── reddit/ ← Reddit 帖子截图
│ └── *.png
├── medium/ ← Medium 文章截图
│ └── *.png
├── x/ ← X 推文截图(仅登录成功时)
│ └── *.png
└── failed/ ← 截图失败的记录
└── README.md
素材索引 README.md(必须):
# 素材索引 — {topic}
## 采集时间: {YYYY-MM-DD HH:MM}
## 采集工具: Playwright (公开页) + OpenClaw Browser (需登录页)
| 平台 | 标题 | URL | 文件 | 大小 | 状态 |
|------|------|-----|------|------|------|
| DEV | Claude Code vs Codex | https://dev.to/... | dev-xxx.png | 240KB | ✅ |
| Reddit | 500+ developers | https://reddit.com/r/... | reddit-xxx.png | 85KB | ✅ |
| X | @user analysis | - | - | - | ❌ 未登录跳过 |
| Google | - | - | - | - | ℹ️ 仅记录数量 |
统计: 有效截图 {n} 张 / 总计划 {n} 张
跳过: {platforms}(原因:{reasons})
快速调用模板
调用 article-material-collect v2.1:
topic: "Claude vs Codex 对比"
query_zh: "Claude Code Codex 对比 评测 2026"
query_en: "Claude Code vs Codex comparison 2026"
article: "2026-04-16/claude-vs-codex"
sources: [dev-community, github, reddit, medium] ← 推荐:跳过 X/知乎除非已登录
output_dir: ~/clawd/projects/MediaClaw/output/articles/2026-04-16/claude-vs-codex/素材/
质量标准(v2.1)
- [ ] 素材文件夹包含 README.md 索引
- [ ] 每张截图 ≥ 50KB(非空白)✅ 强化
- [ ] 截图的是实际文章内容,不是搜索结果页 ✅ 强化
- [ ] Reddit 截图是帖子页,不是 /search/ 页面 ✅ 新增
- [ ] X 截图有登录态才执行,无登录则跳过并记录 ✅ 新增
- [ ] Google 搜索结果不截图,只记录数量 ✅ 新增
- [ ] DEV Community 作为优先信息源 ✅ 新增
- [ ] 文件命名有意义(非 screenshot-1.png)
- [ ] 素材可直接用于文章嵌入(清晰、相关、裁剪得当)
铁律(v2.1)
- 智能选择浏览器 — 公开页面用 Playwright(更快),需登录用 OpenClaw Browser
- 截取实际内容页 — 禁止截图 Reddit/X/Google 搜索结果页
- 质量门控 — 每个截图必须 ≥ 50KB + 非空白
- 跳过而非失败 — X/知乎等平台未登录时,跳过并记录原因(不算失败)
- DEV 优先 — DEV Community 是最可靠的公开技术内容源,优先采集
- 必须索引 — 每次采集必须生成 README.md
- 先确认再采集 — Phase 1 参数确认后才执行 Phase 2-5
- 不暴露隐私 — 截图前检查无个人信息泄露
已知问题与应对
| 问题 | 原因 | 应对 |
|------|------|------|
| Reddit 截图是搜索页 | v1.0 行为,未更新 URL | v2.1:必须用 /comments/ URL |
| Reddit headless 超时 | Reddit 检测 headless 浏览器 | v2.1:改用 domcontentloaded + 真实 UA + 10s 等待 |
| X 截图 22KB(空白) | openclaw profile 未登录 X | v2.1:跳过或用 OpenClaw Browser(需登录态) |
| Nitter 备选不可靠 | Nitter 实例不稳定 | v2.1:仅作备选,主要靠 openclaw browser 登录态 |
| Google 截图没用 | 搜索结果页无实质内容 | v2.1:明确禁止,改为记录数量 |
| 知乎需要登录 | 大部分内容需登录 | v2.1:跳过并记录 |
实测结果(2026-04-16): | 平台 | 方法 | 结果 | 大小 | |------|------|------|------| | Reddit | Playwright (domcontentloaded) | ✅ 通过 | 860KB | | DEV Community | Playwright (domcontentloaded) | ✅ 极佳 | 1706KB | | Nitter | Playwright | ❌ 几乎空白 | 6KB | | X/Twitter | OpenClaw Browser (未登录) | ❌ 空白 | <50KB |
结论:Reddit → Playwright(真实UA);X → OpenClaw Browser(登录态)或跳过;Nitter 不可靠。
上层调用
content-ops-toolkit 在素材阶段调用本 skill。本 skill 内部调用:
brave-search→ 搜索发现web-content-capture→ 底层截图(v2.1 修复版)
更新日志
- v2.1.0 (2026-04-16): 修复 Daniel 反馈的素材无效问题
- 提高质量门槛:20KB → 50KB
- 添加完整平台登录要求文档
- 修复 Reddit URL(必须 /comments/ 而非 /search/)
- 添加 X 未登录跳过机制
- 明确禁止截图 Google 搜索结果
- 新增 DEV Community 作为优先信息源
- 添加跳过机制(平台未登录不算失败)
- 细化质量验证和重试策略
- v2.0.0 (2026-04-15): OpenClaw Browser 强制优先,动态等待
- v1.0.0 (2026-04-14): 初始版本