Anything to WeChat

将文件、链接或想法一键转换并发布为微信公众号草稿。

已扫描
适合谁
微信公众号运营者、内容创作者与编辑
不适合谁
无微信公众号账号者、无法配置开发者凭证的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @lutongsuo/anything-to-wechat

Skill 说明

命令、参数、文件名以原文为准

Anything to WeChat

任意文件、文件夹、URL 或想法通过一个无缝的工作流程,一键发布为微信公众号草稿

用户承诺

支持以下请求形式:

  • “把这篇论文发到我的微信公众号草稿箱”
  • “用这个 CSV 做个报告发到微信”
  • “把这个 URL 的内容变成微信文章”
  • “帮我把桌面上的 PDF 发布到公众号”
  • “Publish this research paper to my WeChat account”
  • “把这个文件夹做成微信文章”

返回结果为已发布的草稿,而非提案。

前置条件

本技能依赖于:

  1. **html-anything — 从任意输入生成格式精美的 HTML 页面。必须安装。**

发布与转换脚本已内置于本技能的 scripts/ 目录中。无需额外技能即可完成发布。

首次使用设置(必做)

在使用本技能前,每位用户必须配置自己的微信公众号凭证。这些凭证属于个人账户,切勿共享。

步骤 1:获取 AppID 和 AppSecret

  1. 使用你的微信公众号登录 [微信公众平台](https://mp.weixin.qq.com/)。
  2. 进入:设置与开发基本配置
  3. 复制你的 AppID(开发者 ID)。
  4. 点击 重置 以生成新的 AppSecret(开发者密码),并立即复制(该密钥不会再次显示)。

步骤 2:添加 IP 到白名单

  1. 在同一 基本配置 页面中,找到 IP白名单
  2. 点击 查看修改
  3. 添加运行本技能的服务器公网 IP 地址。若未配置,系统会在 API 错误提示中显示所需 IP。
  4. 保存白名单设置。

步骤 3:设置环境变量

将凭证设置为环境变量,以便技能自动读取:

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_here

Windows(PowerShell):

$env:WECHAT_APP_ID="your_appid_here"
$env:WECHAT_APP_SECRET="your_appsecret_here"

若未设置环境变量,首次使用时技能会交互式提示用户提供凭证。

步骤 4:测试设置

尝试发布一篇简单文章。若看到 [SUCCESS] Draft published successfully!,说明设置成功。若出现 IP 白名单错误,请返回步骤 2,并添加错误信息中提示的 IP 地址。

工作流程

阶段一:收集输入

若用户未提供来源,则使用 AskUserQuestion 工具询问:

Question: "请提供你想发布到微信公众号的内容来源"
Options:
  - "上传文件" (PDF, DOCX, CSV, Markdown, HTML, 等)
  - "选择文件夹" (将文件夹转为可浏览页面)
  - "粘贴 URL" (抓取并转换网页内容)
  - "描述一个想法" (根据文字简述生成内容)

若用户已在消息中提供了文件路径、URL 或简要说明,则跳过提问,直接进入下一步

阶段二:通过 html-anything 生成 HTML

  1. 调用 Skill 工具加载 html-anything 技能:skill: "html-anything"
  2. 严格遵循 html-anything 的工作流程:

- 分析源文件或简述内容。

- 根据使用场景分类选择自动样式。

- 按照 html-anything 所有规范构建页面。

  1. 将生成的 HTML 保存至工作区,文件名为 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> 作为容器更符合微信兼容性要求

阶段三:转换为微信兼容的 HTML

运行转换脚本,确保完全兼容微信:

python "<skill_dir>/scripts/convert_for_wechat.py" \
  --input "<path_to_generated_html>" \
  --output "<path_to_wechat_ready_html>"

该脚本执行以下操作:

  1. 提取 <style> 标签中的 CSS 并转换为内联 style 属性;
  2. 递归解析所有 CSS 变量(var(--xxx))为具体值;
  3. 将暗色背景转换为对应浅色版本;
  4. 移除微信不支持的 CSS 属性(如 position, z-index, backdrop-filter 等);
  5. 移除 <script> 标签(微信不支持脚本);
  6. 将内容包裹在带有微信友好基础样式的 <section> 元素中。

阶段四:生成封面图

html-anything 步骤未生成合适的主图,则进行如下操作:

  • 使用 ImageGen 工具,根据文章主题和内容生成提示词;
  • 保存为 wechat_cover.png,置于工作区;
  • **推荐尺寸:1024x768**(微信封面比例 4:3);
  • 图片需具有视觉吸引力——封面直接影响点击率。

若文章已有显著的主图,可提取并复用。

阶段五:发布至微信草稿箱

5a. 获取凭证

从环境变量读取凭证:

  • WECHAT_APP_ID — 微信公众号 AppID
  • WECHAT_APP_SECRET — 微信公众号 AppSecret

若未获取到,使用 AskUserQuestion 询问用户:

Question: "请提供你的微信公众号 API 凭证"
Options:
  - "提供 AppID 和 AppSecret"
  - "我需要帮助找到这些信息"

若用户需要帮助,引导其操作:

  • 登录 [微信公众平台](https://mp.weixin.qq.com/)
  • 进入:设置与开发 → 基本配置
  • 查找 AppID,重置或查看 AppSecret
  • 将服务器公网 IP 添加至 IP 白名单(IP白名单)

5b. 发布

运行发布脚本:

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 |

以上两项可通过环境变量设置,也可在提示时交互式输入。
L
@lutongsuo

已收录 1 个 Skill

相关推荐