WeChat Article Reader
通过内置浏览器读取微信公众号文章正文内容,自动处理URL参数。
将文件、链接或想法一键转换并发布为微信公众号草稿。
openclaw skills install @lutongsuo/anything-to-wechat命令、参数、文件名以原文为准
将任意文件、文件夹、URL 或想法通过一个无缝的工作流程,一键发布为微信公众号草稿。
支持以下请求形式:
返回结果为已发布的草稿,而非提案。
本技能依赖于:
html-anything — 从任意输入生成格式精美的 HTML 页面。必须安装。**发布与转换脚本已内置于本技能的 scripts/ 目录中。无需额外技能即可完成发布。
在使用本技能前,每位用户必须配置自己的微信公众号凭证。这些凭证属于个人账户,切勿共享。
将凭证设置为环境变量,以便技能自动读取:
macOS / Linux:
export WECHAT_APP_ID="your_appid_here"
export WECHAT_APP_SECRET="your_appsecret_here"Windows(命令提示符):
set WECHAT_APP_ID=your_appid_here
set WECHAT_APP_SECRET=your_appsecret_hereWindows(PowerShell):
$env:WECHAT_APP_ID="your_appid_here"
$env:WECHAT_APP_SECRET="your_appsecret_here"若未设置环境变量,首次使用时技能会交互式提示用户提供凭证。
尝试发布一篇简单文章。若看到 [SUCCESS] Draft published successfully!,说明设置成功。若出现 IP 白名单错误,请返回步骤 2,并添加错误信息中提示的 IP 地址。
若用户未提供来源,则使用 AskUserQuestion 工具询问:
Question: "请提供你想发布到微信公众号的内容来源"
Options:
- "上传文件" (PDF, DOCX, CSV, Markdown, HTML, 等)
- "选择文件夹" (将文件夹转为可浏览页面)
- "粘贴 URL" (抓取并转换网页内容)
- "描述一个想法" (根据文字简述生成内容)若用户已在消息中提供了文件路径、URL 或简要说明,则跳过提问,直接进入下一步。
html-anything 技能:skill: "html-anything"。html-anything 的工作流程:- 分析源文件或简述内容。
- 根据使用场景分类选择自动样式。
- 按照 html-anything 所有规范构建页面。
wechat_article.html。关键微信兼容性规则(在生成 HTML 时必须遵守):
| 规则 | 原因 |
|---|---|
| 仅使用内联样式 | 微信会移除所有 <style> 标签和 <link> 样式表标签 |
使用浅色背景(#ffffff / #fafafa) | 微信默认白色背景;深色主题内容不可见 |
| 避免使用 CSS 变量 | var(--xxx) 会被微信移除 |
避免使用 position: fixed/sticky | 微信会移除此类属性 |
| 避免复杂布局(flex/grid) | 使用简单的块级布局或 <table> 元素 |
max-width: 680px | 微信文章阅读宽度限制 |
| 仅使用系统字体 | -apple-system, 'PingFang SC', 'Microsoft YaHei', sans-serif |
| 整体 HTML 文件小于 2MB | 微信 API 硬性限制 |
所有图片使用 <img> 标签并显式定义 style | 微信仅接受标准 img 标签 |
使用 <section> 替代 <div> 作为容器 | 更符合微信兼容性要求 |
运行转换脚本,确保完全兼容微信:
python "<skill_dir>/scripts/convert_for_wechat.py" \
--input "<path_to_generated_html>" \
--output "<path_to_wechat_ready_html>"该脚本执行以下操作:
<style> 标签中的 CSS 并转换为内联 style 属性;var(--xxx))为具体值;position, z-index, backdrop-filter 等);<script> 标签(微信不支持脚本);<section> 元素中。若 html-anything 步骤未生成合适的主图,则进行如下操作:
ImageGen 工具,根据文章主题和内容生成提示词;wechat_cover.png,置于工作区;1024x768**(微信封面比例 4:3);若文章已有显著的主图,可提取并复用。
从环境变量读取凭证:
WECHAT_APP_ID — 微信公众号 AppIDWECHAT_APP_SECRET — 微信公众号 AppSecret若未获取到,使用 AskUserQuestion 询问用户:
Question: "请提供你的微信公众号 API 凭证"
Options:
- "提供 AppID 和 AppSecret"
- "我需要帮助找到这些信息"若用户需要帮助,引导其操作:
运行发布脚本:
WECHAT_APP_ID=<app_id> WECHAT_APP_SECRET=<app_secret> \
python "<skill_dir>/scripts/publish_to_wechat.py" \
--file "<path_to_wechat_ready_html>" \
--title "<article_title>" \
--cover "<path_to_cover_image>" \
--digest "<article_summary_under_120_chars>"
**重要提示:** 请始终为微信文章生成有意义的 `--digest`(摘要,不超过 120 个汉字),以提升文章预览效果。
#### 5c. 处理 IP 白名单错误
如果 API 返回 `ip not in whitelist` 错误:
1. 从错误信息中提取服务器的公网 IP 地址。
2. 提示用户:“请将 IP `<ip>` 添加到微信公众号后台的 IP 白名单中(设置与开发 → 基本配置 → IP白名单)。”
3. 等待用户确认后,重新执行发布命令。
### 阶段 6:确认与交接
发布成功后:
1. 输出成功信息,并附上 **媒体 ID**。
2. 提供微信后台链接:`https://mp.weixin.qq.com/`
3. 告知用户:“文章已发送至你的微信公众号草稿箱,请登录微信公众平台审核后一键发布。”
## 微信 HTML 兼容性参考
### 微信会移除的内容(请勿使用)
| 类别 | 属性 / 元素 |
|---|---|
| CSS 元素 | `<style>`、`<link rel="stylesheet">`、`<script>` |
| CSS 特性 | `var(--xxx)`、`@media (prefers-color-scheme: dark)`、`@import` |
| 定位 | `position: fixed`、`position: sticky` |
| 层叠 | `z-index` |
| 视觉效果 | `backdrop-filter`、`filter`、`mix-blend-mode`、`clip-path`、`mask` |
| 布局 | 复杂的 `display: flex`、`display: grid`、`overflow: hidden/scroll` |
| 字体 | 外部网络字体(`@font-face`、Google Fonts 的 `<link>`) |
| 颜色 | CSS 变量、`color-scheme: dark` |
### 微信兼容的安全内容(请始终使用)
| 类别 | 值 |
|---|---|
| 样式 | 每个元素使用内联 `style="..."` 属性 |
| 布局 | 块级流布局,表格用于数据展示,简单 `text-align` 对齐 |
| 字体 | `-apple-system, 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', sans-serif` |
| 颜色 | 使用具体的十六进制或 RGB 值:`#ffffff`、`rgb(30, 27, 25)` |
| 图片 | `<img src="..." style="max-width:100%;height:auto;">` |
| 容器 | 使用 `<section>` 包裹,添加内联样式 |
| 宽度 | 外层容器设置 `max-width: 680px` |
## 错误处理
| 错误 | 处理方式 |
|---|---|
| `html-anything` 技能缺失 | 停止并提示用户:“请先安装 html-anything 技能” |
| 缺少 AppID / AppSecret | 通过 AskUserQuestion 交互式询问用户输入凭证 |
| IP 不在白名单中 | 显示错误中的 IP 地址,引导用户在微信后台添加,然后重试 |
| 封面图片上传失败 | 重试一次;若仍失败,尝试使用更小尺寸或不同格式的图片 |
| HTML 文件过大(超过 2MB) | 精简内容,压缩图片,移除非必要部分 |
| 微信返回 `invalid content` | 重新运行 convert_for_wechat.py,检查是否仍有 `<style>` 标签残留 |
| 访问令牌过期 | 自动重新获取令牌并重试 |
| 网络超时 | 等待 5 秒后重试一次 |
| 文章中某张图片上传失败 | 跳过该图片,记录警告信息,继续发布流程 |
## 支持的输入类型
| 格式 | 扩展名 | 说明 |
|---|---|---|
| PDF | `.pdf` | 读取并提取文本与结构,生成 HTML |
| Word | `.docx` | 读取段落、表格、标题,生成 HTML |
| Markdown | `.md` | 转换为带内联样式的结构化 HTML |
| CSV / Excel | `.csv`, `.xlsx` | 生成基于数据的表格型 HTML |
| HTML | `.html` | 重新样式化以适配微信兼容性 |
| 纯文本 | `.txt` | 结构化并格式化后生成 HTML |
| URL | 任意 URL | 获取网页内容,生成 HTML |
| 文件夹 | 目录 | 浏览文件,生成概览或图谱类 HTML |
| 想法 / 简要 | 文本输入 | 扩展为完整文章,生成 HTML |
## 优化建议
- **文章长度**:建议控制在 5000 字以内,以获得最佳微信阅读体验。
- **长文档处理**:对于 30 页以上的 PDF,建议提炼核心观点,而非全文复制。
- **图片选择**:微信会自动压缩上传图片。图表推荐使用 PNG,照片推荐使用 JPEG。
- **移动端优先**:大多数微信用户在手机上阅读。请以 375px 宽度测试可读性。
- **封面图**:对点击率至关重要。应视觉突出且内容相关。
## 脚本参考
| 脚本 | 用途 | 使用方式 |
|---|---|---|
| `scripts/convert_for_wechat.py` | 将 CSS 转为内联样式,暗色模式转为亮色,移除不兼容属性 | `python convert_for_wechat.py --input in.html --output out.html` |
| `scripts/publish_to_wechat.py` | 通过 API 将封面图和文章上传至微信草稿箱 | `python publish_to_wechat.py --file out.html --title "..." --cover img.png` |
两个脚本均支持自动安装缺失的 Python 依赖项(`beautifulsoup4`、`cssutils`、`requests`)。
## 配置项
| 环境变量 | 是否必需 | 说明 |
|---|---|---|
| `WECHAT_APP_ID` | 是 | 微信公众号的 AppID |
| `WECHAT_APP_SECRET` | 是 | 微信公众号的 AppSecret |
以上两项可通过环境变量设置,也可在提示时交互式输入。已收录 1 个 Skill