weixincaogao
已认证
通讯
v1.0.0 · 小杨
📥 下载 249 次
📦 28297.4KB
📅 2026-05-25
weixincaogao - 微信公众号全链路工具
整合了以下5个独立工具的全部能力:文章抓取 / 标题生成 / HTML转换 / 封面图生成 / 草稿发布,一个指令搞定全流程。
工作流总览
① 抓取文章 ──→ 搜索3张配图 ──→ 伪原创改写 ──→ 转换HTML ──→ 生成封面 ──→ 发布草稿
(自动执行) (自动执行) (可选) (自动执行) (自动执行) (自动执行)
配图策略(v5新增)
每篇文章自动搜索3张配图:
- 第1张:插入到第1个段落之前
- 第2张:插入到第2个段落之前
- 第3张:插入到第3个段落之前
配图使用 NK Images 图库搜索,根据文章标题关键词自动匹配合适图片。
底部总结幻灯片(v11 新增)
文章末尾不再使用简单的签名图片,而是生成一张底部总结幻灯片:
- AI 提炼总结句:从文章内容中提取一句核心口号/金句
- 生成 HTML 幻灯片:渐变背景 + emoji 图标 + 总结文字
- Playwright 截图:使用 Chromium 浏览器渲染并截图为 PNG(750×400)
样式特点:
- 渐变配色(紫金/粉绿/蓝红三种方案随机)
- 装饰性圆圈和 emoji 图标
- 与文章内幻灯片风格统一
依赖:需要安装 Playwright 和 Chromium(playwright install chromium)
伪原创模式(可选)
新增 --rewrite-mode 参数,支持两种模式:
| 模式 | 参数值 | 说明 |
|---|---|---|
| 原文直接发 | direct(默认) | 保持原文不变 |
| 伪原创 | rewrite | 用口语化语气改写文章,适当增加语气词 |
改写示例:
| 原文 | 改写后 |
|---|---|
| "本文将详细介绍..." | "这个呢,我来给大家详细介绍下..." |
| "需要注意以下几点" | "大家要注意啦,以下几点很重要哦" |
| "综上所述" | "总的来说呢,就是这么回事" |
使用方式
全量一键发布(从链接到草稿箱)
# 原文直接发(默认)
python scripts/weixincaogao.py run \
--url "https://mp.weixin.qq.com/s/xxxxx" \
--config config/weixincaogao.json
# 伪原创改写后发送
python scripts/weixincaogao.py run \
--url "https://mp.weixin.qq.com/s/xxxxx" \
--rewrite-mode rewrite \
--config config/weixincaogao.json
单独使用某个步骤
# ① 只抓取文章
python scripts/weixincaogao.py fetch --url "https://mp.weixin.qq.com/s/xxxxx"
# ② 只生成标题(传入文章内容或文件)
python scripts/weixincaogao.py title --article-text "文章正文..."
# ③ 只转换 HTML
python scripts/weixincaogao.py convert \
--source /path/to/article.md \
--images-file /path/to/images.txt
# ④ 只生成封面
python scripts/weixincaogao.py cover --article-text "文章正文..."
# ⑤ 只发布草稿
python scripts/weixincaogao.py publish \
--title "文章标题" \
--html /path/to/content.html \
--cover /path/to/cover.png \
--config config/weixincaogao.json
注意:运行在本机时,路径使用绝对路径。Windows 路径示例:python "C:\Users\Administrator\.qclaw\skills\weixincaogao\scripts\weixincaogao.py" run --url "..." --config "C:\Users\Administrator\.qclaw\skills\weixincaogao\config\weixincaogao.json"
配置文件格式
在 config/weixincaogao.json 中配置微信公众号凭据:
{
"wechat": {
"appid": "你的AppID",
"secret": "你的AppSecret"
},
"output_dir": "~/Desktop",
"author": "作者名"
}
IP 白名单:调用微信公众号 API 的服务器 IP 必须在公众号后台添加白名单(设置与开发 → 安全中心 → IP白名单)。
输出结构
每个工作日生成一个文件夹:
~/Desktop/YYYY-MM-DD公众号发文/
├── YYYY-MM-DD.md # 原始抓取的 Markdown
├── 内容.html # 完整 HTML 文档(含 CSS 样式模板)
├── 封面图.png # AI 生成的封面图
└── 素材/
├── image_001.jpg # 下载的文章图片
└── ...
各步骤详细说明
① 抓取文章(fetch)
- 支持单篇 URL 和批量 URL 文件(每行一个)
- 自动下载所有文章图片到
素材/ - 自动清洗图片占位符:将微信文章的
<img>标签完整替换为干净的[图片 N]占位符(避免data-w、style、title等属性污染正文) - 自动生成 Markdown 文件(含元数据:标题、作者、发布时间、原文链接)
② 生成标题(title)
- 全自动模式(在全链路中调用):传入文章文本,AI 自动生成 10 个候选 → 评分 → 选 1 个最佳
- 对话模式:在 AI 对话中完成,SKILL.md 内置完整流程
- 输出格式:10 个候选标题 + 各维度评分 + 1 个最佳推荐
③ 转换 HTML(convert)
- 使用
scripts/assets/wechat-template-reference.html作为唯一模板 - 占位符格式支持:
[图片]【图片】{{IMAGE}}[IMAGE]<图片>[图片 N] - 按出现顺序自动替换图片路径,图片均匀穿插在正文中(非堆积在末尾)
- 首段前自动留白,正文标题自动去重
- 粗体
文本输出为加粗 span(防止微信样式覆盖)
注意:--image参数接受多个图片路径,也可使用--images-file传入包含路径列表的 txt 文件。
④ 生成封面(cover)
- v11 新方式:使用 HTML + Playwright 截图生成封面幻灯片
- 生成渐变背景的 HTML 幻灯片(900×383)
- 使用 Playwright + Chromium 截图
- 风格:渐变背景 + 图标 + 标题 + 副标题
- 失败时回退到 PIL 生成
- 旧方式(回退):使用 PIL 生成纯色背景 + 文字标题
- 尺寸:900x383(微信公众号头条封面标准比例 21:9)
- 支持
--dry-run预览生成的标题,不实际生成 - 支持
--title手动指定封面主标题
⑤ 发布草稿(publish)
- 全自动:上传封面图 → 上传正文图片(自动压缩到 1MB 以下)→ 创建草稿
- 支持完整 HTML 文档:传入含
<html><body>的文档时,自动提取 body 内容发布 - 自动刷新 access_token(启动时验证,过期自动刷新)
- 输出草稿
media_id,保存到published-log.json
发布成功判断:API 返回media_id即为成功,可在微信公众号后台草稿箱查看。
技术要点(避免常见错误)
- 微信公众号 API 要求:
draft/add接口请求体必须为{"articles": [article]}(单篇文章也需包装为数组),脚本已内置处理。 - 正文图片必须小于 1MB:超出自动压缩,无需手动处理。
- 封面图必须小于 10MB:超出自动压缩,无需手动处理。
- access_token 有效期 2 小时:脚本每次运行自动重新获取,无需手动管理。
- Windows 路径注意:运行时使用绝对路径,避免相对路径解析错误。
- 模板文件路径:
scripts/assets/wechat-template-reference.html必须在scripts/目录下存在(首次使用会自动初始化)。
已知问题修复记录
| 日期 | 问题 | 修复内容 | |||
|---|---|---|---|---|---|
| 2026-04-02 | ✓ 字符导致 GBK 编码崩溃 | 替换为 [OK] ASCII 文本 | |||
| 2026-04-02 | 缺 import requests | 添加全局 import | |||
| 2026-04-02 | 抓取时 <img> 属性污染正文 | 完整替换整个 <img> 标签为占位符 | |||
| 2026-04-02 | 图片集中在文章末尾 | 占位符匹配逻辑修正,图片均匀穿插 | |||
| 2026-04-02 | draft/add API 缺少数组包装 | 修正为 {"articles": [article]} | |||
| 2026-04-02 | 传入完整 HTML 时正文内容错误 | 自动检测并提取 <body> 内容发布 | |||
| 2026-04-02 | scripts/assets/ 目录不存在 | 初始化时自动复制模板文件 | |||
| 2026-04-03 | 文章头部元数据(作者/发布时间/原文链接)出现在正文中 | _strip_metadata 函数自动清除分隔线前所有元数据 | |||
| 2026-04-03 | ### 三级标题未被识别,当作普通文字输出 | 正则扩展支持 #/##/### 三级标题,对应 h1/h2/h3 | |||
| 2026-04-03 | 无序列表(- 或 *)未被识别 | 添加 bullet_list 类型,支持 - item Markdown 列表格式 | |||
| 2026-04-03 | ### 标题 前导空格导致标题解析失败 | 正则容错前导空格(^\s*#{1,3}\s) | |||
| 2026-04-03 | HTML 使用 <style> 标签被微信过滤 | 重写渲染函数,全部使用内联样式 | |||
| 2026-04-03 | 样式不美观、不规范 | 按规范重写:标题系统、段落缩进、引用块、列表样式 | |||
| 2026-04-03 | HTML 转义逻辑错误导致标签被转义为文字 | 改用先占位后转义策略 | |||
| 2026-04-03 | URL 未转为可点击链接 | 自动检测 URL 并转为链接样式 | |||
| 2026-04-03 | 多行代码块 ` ` ` 未支持 | 新增 code_block 类型,深色背景样式 | |||
| 2026-04-03 | 分割线未支持 | --- 或 * 转为 div 分割线 | |||
| 2026-04-03 | Markdown 表格未支持 | 解析 ` | col1 | col2 | ` 为 HTML 表格 |
| 2026-04-03 | 字间距偏小 | 调整 letter-spacing 为 0.1em | |||
| 2026-04-03 | h2 上边距偏小 | 调整为 margin:4em auto 2em | |||
| 2026-04-05 | 封面图都是卡通/动漫风格 | 新增 _generate_text_cover 函数,使用 PIL 生成纯色背景+文字封面,替代 NK Images 搜索/AI生图 | |||
| 2026-04-05 | 正文图片有时失效 | 重写 _process_content_images 函数:统一路径分隔符、增强相对/绝对路径解析、添加备选路径查找、详细日志输出;_upload_content_image 增加重试机制和详细错误码处理 | |||
| 2026-04-05 | 缺少伪原创功能 | 新增 --rewrite-mode 参数和 _rewrite_article 函数,支持原文直接发/口语化改写两种模式 | |||
| 2026-04-05 | 文章配图使用原文图片 | 新增配图搜索功能:_search_and_download_article_images 使用NK Images搜索3张配图,分别插入到第1、2、3段落前 | |||
| 2026-04-05 | 缺少签名图片 | 新增 _generate_signature_image 函数,在文章末尾插入签名图片("by openclaw张小龙") | |||
| 2026-04-08 | 封面图和签名图样式单一 | v11 更新:封面和底部总结改为 HTML + Playwright 截图生成,风格统一为渐变幻灯片 |
微信公众号 HTML 编码规范
核心原则
- 内联样式优先:微信会过滤
<style>标签,所有样式必须用style属性内联 - 安全标签:使用 h1-h6, p, div, ul, ol, li, blockquote, table, img, strong, em, code, span
- 移动端优化:容器
max-width:750px
禁止使用
| 禁止项 | 原因 |
|---|---|
<style> 标签 | 被微信完全删除 |
class 属性 | 可能被清除 |
font-family | 微信强制系统字体 |
opacity | 不支持透明度 |
display:table | 显示异常 |
overflow-x:auto | 横向滚动失效 |
dashed 虚线边框 | 不支持,改用 solid |
<hr> 标签 | 样式失效,用 div 模拟 |
<pre> 标签 | 格式丢失,用 div + pre-wrap |
颜色规范
| 用途 | 颜色值 |
|---|---|
| 主色调(标题/链接) | #5b9ad1 |
| 正文文字 | #333 |
| 引用背景 | #f7f8fa |
| 分割线 | #e2e8f0 |
标题样式
<!-- 一级标题:居中 + 底线 -->
<h1 style="text-align:center;font-size:20px;font-weight:bold;margin:2em auto 1em;border-bottom:2px solid #5b9ad1;">标题</h1>
<!-- 二级标题:蓝底白字居中 -->
<h2 style="text-align:center;font-size:19px;font-weight:bold;color:#fff;background:#5b9ad1;margin:4em auto 2em;padding:0.4em 1em;border-radius:4px;">标题</h2>
<!-- 三级标题:左边框 -->
<h3 style="font-size:18px;font-weight:bold;margin:2em 8px 0.75em 0;padding-left:10px;border-left:3px solid #5b9ad1;">标题</h3>
段落样式
<p style="margin:1.5em 8px;letter-spacing:0.1em;text-indent:2em;font-size:16px;line-height:1.75;color:#333;">正文内容</p>
引用块样式
<blockquote style="border-left:4px solid #5b9ad1;padding:12px 15px;background:#f7f8fa;margin:1.5em 8px;line-height:1.7;color:#4a5568;">引用内容</blockquote>
代码块样式
行内代码:
<code style="background:#f3f4f4;padding:2px 4px;border-radius:3px;color:#c92c2c;">代码片段</code>
多行代码块:
<div style="background:#0d1117;color:#c9d1d9;padding:1em;border-radius:8px;margin:1em 8px;font-size:14px;white-space:pre-wrap;">代码内容</div>
链接样式
<a href="URL" style="color:#5b9ad1;text-decoration:none;border-bottom:1px solid #5b9ad1;">显示文字</a>
Markdown 语法支持
| 语法 | 说明 | |||
|---|---|---|---|---|
# / ## / ### | 一级/二级/三级标题 | |||
粗体 | 蓝色粗体 | |||
斜体 | 灰色斜体 | |||
` 代码 ` | 行内代码 | |||
`代码块` | 多行代码块 | |||
~~删除线~~ | 删除线 | |||
==高亮== | 蓝底高亮 | |||
++下划线++ | 下划线 | |||
https://... | 自动转链接 | |||
--- / * | 分割线 | |||
| ` | col1 | col2 | ` | 表格 |
- item | 无序列表 | |||
1. item | 有序列表 |
错误处理
| 错误码 | 原因 | 处理方式 |
|---|---|---|
| 40001 | access_token 无效 | 检查 AppID/Secret 配置,确认 IP 已加白名单 |
| 40164 | IP 不在白名单 | 在公众号后台添加服务器 IP 到白名单 |
| 44003 | empty news data | 检查 HTML 内容是否为空,确认发布格式正确 |
| 40007 | 封面图上传失败 | 检查图片是否损坏,文件是否小于 10MB |
| 40009 | 封面图太大 | 自动压缩后再上传 |
| 抓取失败 | 网络问题/链接失效 | 检查链接,保存到失败日志 |
依赖
pip install requests beautifulsoup4 html2text pillow cssutils lxml playwright
playwright install chromium
v11 新增依赖
| 依赖 | 用途 |
|---|---|
| playwright | 截图 HTML 幻灯片为 PNG |
| chromium | Playwright 调用的浏览器(playwright install chromium 安装) |
注意:Playwright 需要下载 Chromium,首次运行可能需要翻墙或配置镜像源。
注意事项
- API 凭据保密:不要将
config/weixincaogao.json提交到公开仓库 - 输出路径:所有文件统一输出到
~/Desktop/YYYY-MM-DD公众号发文/,避免桌面散落文件 - NK Images 每日免费额度 30 张:大量发布时注意控制封面生成次数
- Playwright 依赖:v11 版本需要 Chromium 浏览器,如果截图失败会回退到 PIL 生成
💡 安装方法
下载 ZIP 解压到 skills/ 目录即可使用