S

weixincaogao

weixincaogao

已认证
通讯 v1.0.0 · 小杨
下载 ZIP
📥 下载 249 次 📦 28297.4KB 📅 2026-05-25

weixincaogao - 微信公众号全链路工具

整合了以下5个独立工具的全部能力:文章抓取 / 标题生成 / HTML转换 / 封面图生成 / 草稿发布,一个指令搞定全流程。

工作流总览

① 抓取文章 ──→ 搜索3张配图 ──→ 伪原创改写 ──→ 转换HTML ──→ 生成封面 ──→ 发布草稿
(自动执行)  (自动执行)   (可选)        (自动执行)  (自动执行)  (自动执行)

配图策略(v5新增)

每篇文章自动搜索3张配图:

  • 第1张:插入到第1个段落之前
  • 第2张:插入到第2个段落之前
  • 第3张:插入到第3个段落之前

配图使用 NK Images 图库搜索,根据文章标题关键词自动匹配合适图片。

底部总结幻灯片(v11 新增)

文章末尾不再使用简单的签名图片,而是生成一张底部总结幻灯片

  1. AI 提炼总结句:从文章内容中提取一句核心口号/金句
  2. 生成 HTML 幻灯片:渐变背景 + emoji 图标 + 总结文字
  3. 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-wstyletitle 等属性污染正文)
  • 自动生成 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 即为成功,可在微信公众号后台草稿箱查看。

技术要点(避免常见错误)

  1. 微信公众号 API 要求draft/add 接口请求体必须为 {"articles": [article]}(单篇文章也需包装为数组),脚本已内置处理。
  2. 正文图片必须小于 1MB:超出自动压缩,无需手动处理。
  3. 封面图必须小于 10MB:超出自动压缩,无需手动处理。
  4. access_token 有效期 2 小时:脚本每次运行自动重新获取,无需手动管理。
  5. Windows 路径注意:运行时使用绝对路径,避免相对路径解析错误。
  6. 模板文件路径scripts/assets/wechat-template-reference.html 必须在 scripts/ 目录下存在(首次使用会自动初始化)。

已知问题修复记录

日期问题修复内容
2026-04-02 字符导致 GBK 编码崩溃替换为 [OK] ASCII 文本
2026-04-02import requests添加全局 import
2026-04-02抓取时 <img> 属性污染正文完整替换整个 <img> 标签为占位符
2026-04-02图片集中在文章末尾占位符匹配逻辑修正,图片均匀穿插
2026-04-02draft/add API 缺少数组包装修正为 {"articles": [article]}
2026-04-02传入完整 HTML 时正文内容错误自动检测并提取 <body> 内容发布
2026-04-02scripts/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-03HTML 使用 <style> 标签被微信过滤重写渲染函数,全部使用内联样式
2026-04-03样式不美观、不规范按规范重写:标题系统、段落缩进、引用块、列表样式
2026-04-03HTML 转义逻辑错误导致标签被转义为文字改用先占位后转义策略
2026-04-03URL 未转为可点击链接自动检测 URL 并转为链接样式
2026-04-03多行代码块 ` ` ` 未支持新增 code_block 类型,深色背景样式
2026-04-03分割线未支持---* 转为 div 分割线
2026-04-03Markdown 表格未支持解析 `col1col2` 为 HTML 表格
2026-04-03字间距偏小调整 letter-spacing 为 0.1em
2026-04-03h2 上边距偏小调整为 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 编码规范

核心原则

  1. 内联样式优先:微信会过滤 <style> 标签,所有样式必须用 style 属性内联
  2. 安全标签:使用 h1-h6, p, div, ul, ol, li, blockquote, table, img, strong, em, code, span
  3. 移动端优化:容器 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://...自动转链接
--- / *分割线
`col1col2`表格
- item无序列表
1. item有序列表

错误处理

错误码原因处理方式
40001access_token 无效检查 AppID/Secret 配置,确认 IP 已加白名单
40164IP 不在白名单在公众号后台添加服务器 IP 到白名单
44003empty news data检查 HTML 内容是否为空,确认发布格式正确
40007封面图上传失败检查图片是否损坏,文件是否小于 10MB
40009封面图太大自动压缩后再上传
抓取失败网络问题/链接失效检查链接,保存到失败日志

依赖

pip install requests beautifulsoup4 html2text pillow cssutils lxml playwright
playwright install chromium

v11 新增依赖

依赖用途
playwright截图 HTML 幻灯片为 PNG
chromiumPlaywright 调用的浏览器(playwright install chromium 安装)

注意:Playwright 需要下载 Chromium,首次运行可能需要翻墙或配置镜像源。

注意事项

  1. API 凭据保密:不要将 config/weixincaogao.json 提交到公开仓库
  2. 输出路径:所有文件统一输出到 ~/Desktop/YYYY-MM-DD公众号发文/,避免桌面散落文件
  3. NK Images 每日免费额度 30 张:大量发布时注意控制封面生成次数
  4. Playwright 依赖:v11 版本需要 Chromium 浏览器,如果截图失败会回退到 PIL 生成

💡 安装方法

下载 ZIP 解压到 skills/ 目录即可使用