Files
tech/.claude/commands/arno-dl-wx.md
T
arno b06247a816 功能(命令): 新增公众号文章批量下载与文章分析命令
- 新增 arno-dl-wx:批量下载微信公众号文章,串行调度子智能体逐篇归档并自动生成分析报告
- 新增 arno-anl-article:对单篇文章进行批判性阅读,输出结构化分析报告
2026-06-29 13:51:04 +08:00

276 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: arno-dl-wx
description: 批量下载微信公众号文章全文,以发布日期为前缀保存为 Markdown 文件到 `资料/文章/` 目录,逐篇自动调用 `arno-anl-article` 生成批判性分析报告,最后验证内容完整性。在工作管理项目中,可用于收集行业动态、技术文章、政策法规等公众号文章作为参考材料。触发词:下载公众号文章、批量获取微信公众号、微信文章下载、公众号全文保存、wx批量下载、行业文章下载、公众号归档。
argument-hint: <链接列表>
---
## 用户输入
```text
$ARGUMENTS
```
用户输入为一批微信公众号文章链接(每行一个或多个),以及可选的目标保存目录。若未指定目标目录,默认保存到 `资料/文章/` 目录。
链接格式:`https://mp.weixin.qq.com/s/<文章ID>`
## 概述
批量获取微信公众号文章全文内容,以主智能体-子智能体协作模式,依次逐个下载每篇文章,保存为 `yyyy-MM-dd_文章标题.md` 格式的 Markdown 文件(以文章发布日期为前缀),最后验证全部内容的完整性和章节连贯性。
## 标准输出模板
每篇保存的文章 MUST 遵循以下统一格式:
```markdown
# <文章标题>
> **来源**<公众号名称>
> **作者**<作者名>
> **发布日期**<yyyy-MM-dd>
> **原文链接**<URL>
---
<文章正文内容,保留原始 Markdown 格式>
```
### 模板字段说明
| 字段 | 提取来源 | 缺省值 |
|------|----------|--------|
| `文章标题` | 文章正文最大号文字或首行加粗文字 | 无(必填) |
| `公众号名称` | web-reader 返回的 `og:site_name` 或文章顶部公众号名称 | `微信公众平台` |
| `作者名` | web-reader 返回的 `author` / `og:article:author` 元数据,或文章开头署名 | `未知` |
| `发布日期` | 页面 `create_time` 时间戳转换,或文章顶部日期标注 | 当前日期 |
| `原文链接` | 用户提供的链接 | 无(必填) |
| `文章正文` | web-reader 返回的正文内容,保留原始段落、标题、加粗、列表等格式 | — |
### 模板规则
1. 元数据块使用 `>` 块引用格式,字段间用两个空格 ` ` 换行(Markdown 软换行)
2. 元数据与正文之间用 `---` 分隔线隔开
3. 正文保留原始 Markdown 格式不变
4. 正文中如有图片链接(`![Image]` 格式),保留不删除
## 适用场景
- 批量下载系列连载文章(如书籍章节、课程讲义)
- 保存微信公众号专栏的全部文章
- 归档公众号内容以供离线阅读或二次处理
- **家庭管理场景**:收集家庭教育方法、健康养生知识、理财技巧、家庭关系建设等公众号文章,作为家庭参考资料的积累
## 架构模式
采用 **主智能体 → 子智能体串行调度** 模式:
```
主智能体(协调者)
├─ 子智能体 #1 → 获取文章 1 → 保存 → 关闭
│ └─ 主智能体 → 调用 arno-anl-article 分析文章 1
├─ 子智能体 #2 → 获取文章 2 → 保存 → 关闭
│ └─ 主智能体 → 调用 arno-anl-article 分析文章 2
├─ ...
└─ 子智能体 #N → 获取文章 N → 保存 → 关闭
└─ 主智能体 → 调用 arno-anl-article 分析文章 N
└─ 主智能体验证全部文章完整性
```
### 为什么串行而非并行
1. 微信公众号有反爬机制,并发请求容易触发限流
2. 子智能体之间无共享状态依赖,但需要确保编号连续不混乱
3. 串行执行方便追踪进度、定位问题
## 执行流程
### 第一步:初始化
1. 解析用户提供的链接列表,确认总链接数 N
2. 确认目标目录存在,不存在则创建
3. 告知用户共 N 篇文章待下载
```bash
mkdir -p "<目标目录>"
```
### 第二步:串行调度子智能体
对每个链接依次执行:
**启动子智能体**,传入以下任务指令:
```text
你的任务是获取以下微信公众号文章的完整内容并保存。
**链接**: `<文章URL>`
**序号**: <当前序号>/<总文章数N>
**目标目录**: `<目标目录>`
**执行步骤**:
1. 使用 mcp__web-reader__webReader 工具获取该链接的完整文章内容。
- 微信公众号文章 WebFetch 通常无法访问,直接使用 web-reader。
- 如果内容被截断,尝试调整参数或分段获取。
2. 从获取的内容中提取文章元数据:
- **标题**:文章中最大号的文字或第一行加粗文字
- **发布日期**:优先从页面 HTML 中的 `create_time` Unix 时间戳转换(`date -d @<timestamp> '+%Y-%m-%d'`),其次从文章顶部日期标注提取;如都无法获取,使用当前日期
- **公众号名称**:从 `og:site_name` 元数据或文章顶部公众号名称提取,缺省为 `微信公众平台`
- **作者名**:从 `author` / `og:article:author` 元数据或文章开头署名提取,缺省为 `未知`
3. 将完整文章内容按照**标准输出模板**保存为 Markdown 文件:
- 文件名格式:`yyyy-MM-dd_文章标题.md`(日期为该文章发布日期)
- 文件名中空格和特殊字符(包括中文标点如 `,。!?;:""''、【】《》—…、` 及英文标点 `/ \ : * ? " < > |`)全部替换为 `_`
- 多个连续 `_` 合并为一个,末尾 `_` 去除
- 保存路径:`<目标目录>/yyyy-MM-dd_文章标题.md`
- **严格遵循标准输出模板**:
```
# <文章标题>
> **来源**<公众号名称>
> **作者**<作者名>
> **发布日期**<yyyy-MM-dd>
> **原文链接**<文章URL>
---
<文章正文内容>
```
- 元数据块使用 `>` 块引用,字段间用两个空格换行
- 元数据与正文之间用 `---` 分隔线隔开
- 正文保留原始格式(段落、标题层级、加粗、列表等),图片链接保留不删除
4. 检查保存的文件内容字数,与原文内容字数进行比对。
- 使用 `wc -c` 或字符计数工具
- 差异应在 1% 以内(允许 Markdown 格式化标记带来的微小差异)
- 如果差异过大,说明内容可能被截断,需重新获取
5. 完成后向主智能体报告:
- 文章标题、作者、公众号、发布日期
- 保存的文件名
- 原文字数 vs 保存字数
- 是否完整获取
```
**关键约束**
- **每次只启动 1 个子智能体**,等待其完成后才启动下一个
- 子智能体使用 `general-purpose` 类型
- 子智能体完成后自动关闭,不保留上下文
### 第三步:逐篇分析
每篇文章下载完成后(子智能体报告后),**立即**调用 `arno-anl-article` 技能对该文章进行批判性分析:
```bash
# 使用 Skill 工具调用
Skill: arno-anl-article
Args: <目标目录>/<刚下载的文章文件名>.md
```
**分析产物**
- 分析报告保存为 `<文章文件名(不含.md>_分析.md`,与原文在同一目录
- 分析报告是独立文件,**不修改、不覆盖**原文
**关键约束**
- **分析必须在下一篇下载之前完成**,保持串行节奏
- 分析报告字数应与原文篇幅匹配(长文深度分析,短文简要分析)
- 分析报告文件名中的特殊字符与原文使用相同的 `_` 替换规则
### 第四步:验证全部文章
所有 N 篇文章下载并分析完成后,执行完整性检查:
1. **文件清单检查**:确认目录下有 N 个文件,数量正确无缺漏
```bash
ls -1 "<目标目录>"/*.md
```
2. **文件大小检查**:确认每个文件非空,大小合理(微信公众号文章通常 3,000~15,000 字符)
```bash
wc -c "<目标目录>"/*.md
```
3. **首尾内容检查**:读取每篇文章的开头和结尾,验证:
- 文章有明确的标题
- 文章有自然的结尾(不是被截断的半句话)
- 如果文章是系列连载,检查相邻文章的章节衔接是否连贯
```bash
for f in "<目标目录>"/*.md; do
echo "=== $(basename "$f") ==="
head -2 "$f"
echo "..."
tail -3 "$f"
echo ""
done
```
4. **连贯性检查**(可选,适用于系列连载):
- 前一章的结尾是否自然引出下一章
- 章节编号是否连续(第1章 → 第2章 → …)
- 是否有内容重复或遗漏
### 第五步:修复遗漏(如有)
如果验证发现以下问题:
| 问题类型 | 处理方式 |
|----------|----------|
| 文件缺失(某文件不存在) | 重新分配子智能体下载该链接 |
| 内容截断(字数明显偏少) | 重新分配子智能体下载该链接 |
| 内容异常(乱码、空内容) | 尝试不同工具重新获取 |
| 日期错误(文件名日期与实际不符) | 调整文件名中的日期 |
**原则**:不手动修复内容,只重新下载。
### 第六步:输出汇总
```markdown
## 下载完成
- 目标目录: <目录路径>
- 文章总数: N 篇
- 总大小: XXXX 字节
- 完整率: N/N (100%)
| 序号 | 发布日期 | 文章标题 | 字符数 | 下载 | 分析 |
|------|----------|----------|--------|------|------|
| 1 | 2026-06-29 | XXX | X,XXX | ✅ | ✅ |
| 2 | 2026-06-29 | XXX | X,XXX | ✅ | ✅ |
| ... | ... | ... | ... | ... | ... |
```
## 关键指令
1. **串行调度**:每次只运行 1 个子智能体,等待完成后再启动下一个
2. **使用 web-reader**:微信公众号文章 WebFetch 通常无法访问,直接使用 `mcp__web-reader__webReader`
3. **日期命名**:文件名以文章发布日期 `yyyy-MM-dd` 为前缀,后接下划线 + 文章标题
4. **文件名安全**:空格和特殊字符(中英文标点如 `,。!?;:""''、【】《》—…、``/ \ : * ? " < > |`)全部替换为 `_`,多个连续 `_` 合并为一个
5. **标准模板**:每篇文章 MUST 严格遵循标准输出模板,含来源、作者、发布日期、原文链接四个元数据字段
6. **字数比对**:每个子智能体必须比对原文字数与保存字数,发现差异 >1% 需重试
7. **不修改原文**:保存时只添加模板元数据头部(标题、元数据块、分隔线),不改动正文内容
8. **逐篇分析**:每篇下载完成后立即调用 `arno-anl-article` 生成独立分析报告,分析完成后才启动下一篇下载
9. **验证优先**:全部下载和分析完成后必须执行第四步验证,不可跳过
10. **遇错重下**:发现问题不手动修复,重新分配子智能体下载
## 已知陷阱
- **WebFetch 不可用**`WebFetch` 工具对 `mp.weixin.qq.com` 域名通常返回错误或被屏蔽内容,**必须使用 `mcp__web-reader__webReader`** 替代
- **内容截断**:极长文章(>15,000 字符)可能被 web-reader 截断,如遇此情况可尝试调整 `return_format``content_size` 参数
- **反爬限流**:短时间内大量请求可能触发微信反爬,串行执行天然规避此问题;若单篇文章也失败,等待 5-10 秒后重试
- **标题特殊字符**:文章标题可能含 `/`(如"无代码/低代码")及各种中英文标点,文件名中必须替换为 `_`
- **URL 有效期**:微信公众号文章链接通常长期有效,但部分文章可能被删除或转为仅关注可见
- **图片丢失**web-reader 返回的 Markdown 可能不含文章中的图片,如需保留图片需另行处理
## 与项目现有工具的配合
本技能聚焦于微信公众号文章的获取和归档。获取完成后,可配合以下项目技能进一步处理:
| 后续操作 | 使用技能 |
|----------|----------|
| 文章批判性分析 | `arno-anl-article`(下载后自动调用) |