--- name: wechat-article-maker description: 智能创作并发布微信公众号文章。支持内容理解、链接分析、Markdown转换、图片清洗、样式处理和一键发布。当用户提到"创作公众号文章"、"发布文章链接"、"生成微信文章"、"推送到微信公众号"、"发布文章到微信公众号"时使用。 --- # 微信公众号文章创作与发布 ## 语言 **匹配用户语言**:使用用户所用的语言进行回应。用户用中文则用中文回应,用英文则用英文回应。 ## 目录结构 ``` wechat-article-maker/ ├── scripts/ # TypeScript 源文件 │ ├── wechat-api.ts # API 发布逻辑 │ ├── wechat-article.ts # 浏览器发布逻辑 │ ├── wechat-browser.ts # 图文发布逻辑 │ ├── image-utils.ts # 图片处理工具(sharp 集成) │ ├── generate-cover.ts # 封面生成逻辑 │ ├── md-to-wechat.ts # Markdown 转换逻辑 │ ├── ensure-deps.ts # 依赖自动安装 │ └── md/ # Markdown 渲染引擎 │ ├── render.ts │ ├── themes/ # 主题样式 │ └── extensions/ # 扩展插件 ├── references/ # 参考文档 ├── SKILL.md # 技能文档 └── README.md # 项目说明 ``` **Agent 执行**:确定此 SKILL.md 目录为 `SKILL_DIR`,所有命令通过 `npx -y bun` 运行: ### 运行方式 ```bash # 设置技能目录 SKILL_DIR="${SKILL_DIR}" # 所有脚本通过 npx -y bun 运行(跨平台统一) npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" article.md --inline-css npx -y bun "${SKILL_DIR}/scripts/md-to-wechat.ts" article.md --theme grace npx -y bun "${SKILL_DIR}/scripts/generate-cover.ts" --title "标题" --output cover.jpg ``` **依赖自动安装**:脚本首次运行时会自动检测并安装所需依赖,无需手动操作。 ## 依赖安装 **自动安装**:所有依赖会在脚本首次运行时自动安装,无需手动操作。 **运行时要求**: - ✅ Bun(推荐,通过 `npx -y bun` 使用) **依赖说明**(自动安装): - `front-matter` - Frontmatter 解析 - `highlight.js` - 代码高亮 - `marked` - Markdown 渲染引擎 - `reading-time` - 阅读时间计算 - `juice` - CSS 内联转换 - `@napi-rs/canvas` - 高性能图片生成(可选,用于封面) - `sharp` - 图片处理库(内置,用于图片清理和封面生成) **依赖说明**: - `sharp` 会在首次运行时通过 `scripts/ensure-deps.ts` 自动安装 - 如果可选依赖未安装,`generate-cover` 会自动生成 SVG 格式的封面图(微信也支持) ## 功能概述 本技能提供完整的微信公众号文章工作流: 1. **内容创作模式**:输入文本内容,智能理解、生成文章 2. **链接发布模式**:输入文章链接,下载、处理并发布 3. **Markdown 转换**:内置 Markdown 到 HTML 转换,支持多主题 4. **图片处理**:自动下载、清洗元数据、符合微信规范 5. **样式转换**:自动将 CSS 转为内联样式 6. **一键发布**:支持 API(快速)和浏览器(可视化)两种方式 ## 偏好设置(EXTEND.md) 使用 Bash 检查 EXTEND.md 存在性(优先级顺序): ```bash # 检查项目级别 test -f .awesome-skills/wechat-article-maker/EXTEND.md && echo "project" # 检查用户级别(跨平台:$HOME 在 macOS/Linux/WSL 上都可用) test -f "$HOME/.awesome-skills/wechat-article-maker/EXTEND.md" && echo "user" ``` ┌────────────────────────────────────────────────────────────┬───────────────────┐ │ 路径 │ 位置 │ ├────────────────────────────────────────────────────────────┼───────────────────┤ │ .awesome-skills/wechat-article-maker/EXTEND.md │ 项目目录 │ ├────────────────────────────────────────────────────────────┼───────────────────┤ │ $HOME/.awesome-skills/wechat-article-maker/EXTEND.md │ 用户主目录 │ └────────────────────────────────────────────────────────────┴───────────────────┘ ┌───────────┬───────────────────────────────────────────────────────────────────────────┐ │ 结果 │ 操作 │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ 找到 │ 读取、解析、应用设置 │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ 未找到 │ 使用默认值 │ └───────────┴───────────────────────────────────────────────────────────────────────────┘ **EXTEND.md 支持**:默认主题 | 默认发布方法(api/browser)| 默认作者 | Chrome 配置文件路径 ## 工作流程选择 根据用户输入自动选择工作流程: | 输入类型 | 识别方式 | 工作流程 | |---------|---------|---------| | 纯文本内容 | 不包含链接 | 内容创作流程 | | 文本 + 参考链接 | 包含链接,但主体是文本描述 | 内容创作流程(含链接分析)| | 单个文章链接 | 仅包含 URL,或明确说"发布这篇文章" | 链接发布流程 | | Markdown 文件路径 | 以 `.md` 结尾的文件路径 | Markdown 转换发布流程 | | HTML 文件路径 | 以 `.html` 结尾的文件路径 | 直接发布流程 | --- ## 流程 1: 内容创作与发布 当用户输入文本内容(可选包含参考链接)时使用此流程。 ### 创作进度清单 复制此清单并在完成时勾选: ``` 内容创作进度: - [ ] 步骤 0: 加载偏好设置 - [ ] 步骤 1: 内容分析与链接提取 - [ ] 步骤 2: 链接内容获取与理解 - [ ] 步骤 3: 询问创作偏好 - [ ] 步骤 4: 生成 Markdown 文章 - [ ] 步骤 5: 用户确认与优化 - [ ] 步骤 6: 转换为 HTML - [ ] 步骤 7: 准备封面图 - [ ] 步骤 8: 发布到微信 - [ ] 步骤 9: 完成报告 ``` ### 步骤 0: 加载偏好设置 检查并加载 EXTEND.md 设置(见上方偏好设置部分)。 ### 步骤 1: 内容分析与链接提取 分析用户输入: 1. **提取所有链接**: ```bash # 提取 HTTP/HTTPS 链接 echo "$user_input" | grep -oE 'https?://[^\s]+' > /tmp/links.txt ``` 2. **判断内容类型**: - 如果仅有单个链接且无其他文本 → 转到**流程 2: 链接发布流程** - 如果有文本内容(可选链接)→ 继续内容创作流程 ### 步骤 2: 链接内容获取与理解 **如果内容中包含参考链接**: 1. **获取每个链接的内容**: ```typescript // 使用 WebFetch 获取并分析 for (const url of links) { const content = await WebFetch(url, ` 请提取并总结以下信息: 1. 文章标题 2. 作者(如有) 3. 核心观点(3-5个要点) 4. 关键数据或案例 5. 可引用的金句 以结构化格式返回,便于后续引用。 `); } ``` 2. **整理参考资料**: - 为每个链接创建摘要卡片 - 标注关键引用点 - 记录可用图片或数据 ### 步骤 3: 询问创作偏好 使用 AskUserQuestion 询问用户偏好: ``` 文章创作配置 问题1:文章风格 header: "风格" 选项: - 专业分析 - 深度解读,适合技术或行业分析(推荐) - 轻松科普 - 通俗易懂,适合大众读者 - 教程指南 - 步骤清晰,适合实操性内容 - 观点评论 - 表达看法,适合热点评论 问题2:文章长度 header: "长度" 选项: - 短文(800-1200字)- 快速阅读 - 中等(1500-2500字)- 平衡深度与可读性(推荐) - 长文(3000字+)- 深度长文 问题3:参考资料处理(如有链接) header: "引用方式" 选项: - 深度引用和分析 - 详细解读原文观点(推荐) - 简要提及和链接 - 点到为止 - 仅作背景参考 - 不明确引用 ``` ### 步骤 4: 生成 Markdown 文章 基于用户输入、参考资料和偏好生成文章: 1. **标题生成要求**: 文章标题必须包含以下 5 个特点中的至少 3 个: | 特点 | 说明 | 示例 | |------|------|------| | **痛点明确** | 直击目标读者的具体困扰 | 《还在手动改代码?这个工具让你开发效率提升 300%》 | | **数字吸引** | 用具体数字增加可信度 | 《我花了 3 个月,整理了 1000 个 Python 技巧》 | | **结果导向** | 承诺可量化的收益或改变 | 《学会这招,你的代码审查通过率提升 90%》 | | **情绪调动** | 激发好奇心、紧迫感或共鸣 | 《千万别再这样写代码了!后果很严重》 | | **悬念设置** | 制造悬念引发点击欲望 | 《99% 的程序员都不知道的调试技巧》 | **标题公式参考**: - 痛点 + 数字 + 结果:《花了 100 小时排错?这 3 个技巧让你秒定位 Bug》 - 数字 + 悬念:《7 个隐秘的 VS Code 功能,第 5 个太绝了》 - 情绪 + 痛点:《别再犯这个低级错误!新手程序员最常踩的 5 个坑》 2. **排版规范**: **段落结构**: - 每段控制在 3-5 行,避免大段文字 - 重要数据单独成段并加粗 - 关键结论前置,细节后置 **配图位置**: - 标题下方放置封面图 - 每个步骤/章节后放置效果示意图 - 结尾放置总结图或行动号召图 **代码块**: - 代码块前后留白(空行分隔) - 必须使用语法高亮标注语言类型 - 关键行添加注释说明 **金句设计**: - 核心观点单独成段 - 使用加粗或引用格式突出 - 控制在 20 字以内,便于记忆和传播 3. **文章结构**: ```markdown --- title: 文章标题(遵循 5 大标题原则) author: 作者名(从 EXTEND.md 或默认值) summary: 文章摘要(120字以内,突出核心价值) featureImage: 封面图路径(可选) date: YYYY-MM-DD --- # 文章标题(痛点明确 + 数字吸引 + 结果导向)  引言段落,2-3行即可, 直接点明读者能获得什么价值。 ## 第一部分:核心问题 (3-5行,聚焦痛点) **关键数据单独成段加粗** 配合说明文字,3-4行即可。  ## 第二部分:解决方案 分段讲解,每段 3-5 行。 ```python # 代码块前后留白 # 标注语言类型实现语法高亮 def solution(): return "success" ``` > **金句:核心观点单独成段,增强记忆点**  ## 第三部分:实战案例 具体步骤 + 效果图, 让读者有代入感。 ## 总结 简洁有力的结论,2-3 行。  --- **参考资料**: - [文章标题](链接) ``` 2. **保存文件**: ```bash # 生成 slug(文件名) title="文章标题" slug=$(echo "$title" | \ iconv -t ascii//TRANSLIT 2>/dev/null | \ tr '[:upper:]' '[:lower:]' | \ tr ' ' '-' | \ tr -cd '[:alnum:]-' | \ cut -c1-50) # 创建目录并保存 output_dir="wechat-articles/$(date +%Y-%m-%d)" mkdir -p "$output_dir" echo "$article_content" > "$output_dir/$slug.md" ``` 3. **展示给用户**: ``` ✓ 文章已生成 📄 标题:$title 📏 长度:约 $word_count 字 📁 保存位置:$output_dir/$slug.md [文章预览内容...] 请选择下一步操作... ``` ### 步骤 5: 用户确认与优化 使用 AskUserQuestion 询问: ``` 文章已生成,请选择操作 header: "下一步" 选项: - 直接发布 - 转换为 HTML 并发布到微信(推荐) - 修改内容 - 说明需要调整的部分 - 重新生成 - 使用不同风格或角度 - 仅保存文件 - 不发布,稍后手动处理 ``` **如果用户选择修改**: 1. 收集修改意见 2. 更新文章内容 3. 重新保存并展示 4. 再次询问下一步 **如果用户选择重新生成**: - 返回步骤 3,重新询问偏好 - 使用不同的创作角度 ### 步骤 6: 转换为 HTML 使用内置的 Markdown 渲染引擎转换: 1. **询问主题**(如未在 EXTEND.md 中指定): | 主题 | 描述 | |------|------| | `default` | 经典主题 - 传统排版,标题居中带底边,二级标题白字彩底 | | `grace` | 优雅主题 - 文字阴影,圆角卡片,精致引用块(推荐)| | `simple` | 简洁主题 - 现代极简风,不对称圆角,清爽留白 | 2. **执行转换**: ```bash npx -y bun "${SKILL_DIR}/scripts/md-to-wechat.ts" \ "$output_dir/$slug.md" \ --theme grace \ --output "$output_dir" ``` 3. **解析输出 JSON**: ```json { "title": "文章标题", "author": "作者", "summary": "摘要", "htmlPath": "路径/to/article.html", "contentImages": [ { "placeholder": "WECHATIMGPH_1", "localPath": "/path/to/image1.jpg", "originalPath": "原始路径" } ] } ``` ### 步骤 7: 准备封面图 **封面图强制规则**(优先级顺序): 1. **显式指定**:检查 Frontmatter 字段(`featureImage`, `coverImage`, `cover`, `image`)。 2. **自动首图回退**:若未显式指定封面,且文章中包含图片,**必须**自动提取并使用文章中的第一张图片作为封面。 3. **自动生成**:**只有**在文章中完全没有图片时,才触发封面图生成逻辑。 **如果没有指定且文章内无图片**,询问用户: ``` 封面图设置(文章中未发现图片) header: "封面来源" 选项: - 自动生成 - 基于文章标题生成渐变背景封面(推荐) - 提供路径 - 指定本地文件或 URL - 暂不设置 - 稍后手动添加 ``` **如果选择自动生成**: 1. **优先尝试多模态大模型生成**(如果 Agent 支持): - 如果当前 Agent 环境具备文生图能力(Text-to-Image),请根据文章标题和摘要生成一张高质量的封面图。 - 要求:2:1 比例(如 1024x512),风格现代、简洁,适合作为公众号封面。 - 保存为:`$output_dir/$slug-cover.jpg` - **注意**:如果 Agent 无法生成图片(例如无工具支持),则直接使用下方降级方案。 2. **降级方案(使用脚本生成)**: 如果无法使用大模型生成图片,则运行以下命令生成渐变背景文字封面: ```bash # 使用 Node.js 脚本生成(无系统依赖) npx -y bun "${SKILL_DIR}/scripts/generate-cover.ts" \ --title "$title" \ --output "$output_dir/$slug-cover.jpg" \ --gradient-start "#667eea" \ --gradient-end "#764ba2" ``` **封面要求**: - 格式:JPEG, PNG, GIF 或 WebP - 推荐尺寸:900x500px(2:1 比例) - 文件大小:< 2MB ### 步骤 8: 发布到微信 询问发布方式: ``` 发布方式选择 header: "发布方法" 选项: - API 方式 - 快速发布,需要 API 凭证(推荐) - 浏览器方式 - 可视化操作,需要 Chrome - 仅输出 HTML - 保存文件,稍后手动发布 ``` #### 选项 A: API 方式发布 1. **检查 API 凭证**: ```bash # 检查项目级别 test -f .awesome-skills/.env && grep -q "WECHAT_APP_ID" .awesome-skills/.env && echo "project" # 检查用户级别 test -f "$HOME/.awesome-skills/.env" && grep -q "WECHAT_APP_ID" "$HOME/.awesome-skills/.env" && echo "user" ``` 2. **如果凭证缺失**,引导设置: ``` 微信 API 凭证未找到 获取凭证步骤: 1. 访问 https://mp.weixin.qq.com 2. 进入:开发 → 基本配置 3. 复制 AppID 和 AppSecret 保存位置? A) 项目级别:.awesome-skills/.env(仅此项目) B) 用户级别:~/.awesome-skills/.env(所有项目) ``` 创建 `.env` 文件: ```bash WECHAT_APP_ID=<用户输入> WECHAT_APP_SECRET=<用户输入> ``` 3. **执行发布**: ```bash npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \ "$output_dir/$slug.html" \ --title "$title" \ --summary "$summary" \ --cover "$cover_image" \ --inline-css ``` **重要**:`--inline-css` 参数将 CSS 转为内联样式,微信公众号不支持 `