wechat-publisher
将 HTML 富文本文章发布到微信公众号草稿箱。 支持多种封面图片获取方式(自动提取/Unsplash 搜索/AI 生成/指定 URL),自动处理封面上传并获取 media_id。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
将 HTML 富文本文章发布到微信公众号草稿箱。 支持多种封面图片获取方式(自动提取/Unsplash 搜索/AI 生成/指定 URL),自动处理封面上传并获取 media_id。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
将 Markdown 内容转换为微信公众号兼容的 HTML 格式。 支持内联 CSS 样式、多种主题(airbnb/apple/binance/claude/coinbase/mastercard/notion/opencode.ai/pinterest/shopify/spacex/stripe/vercel)、智能配图和代码高亮。 同时支持对现有 HTML 进行排版优化(统一样式 + 微信兼容性修复)。 可自动分析内容选择合适的模板和主题,支持 Unsplash API 获取配图。
抓取微信公众号文章并转换为 Markdown 格式。 支持模拟微信 iPhone 客户端请求头绕过反爬,自动重试机制,提取标题/作者/发布时间/正文内容。 支持 CLI 和 Web 界面使用。
将本地图片上传到 Cloudinary,获取永久 HTTP 链接,用于替换文章中的本地图片引用。 支持单张图片上传、从文章提取图片、目录扫描三种模式,自动替换图片引用。
| name | wechat-publisher |
| description | 将 HTML 富文本文章发布到微信公众号草稿箱。 支持多种封面图片获取方式(自动提取/Unsplash 搜索/AI 生成/指定 URL),自动处理封面上传并获取 media_id。 |
| allowed-tools | ["Read","Write","Edit","Grep","Glob"] |
| metadata | {"trigger":"发布文章到微信公众号草稿箱、上传封面图到微信","category":"wechat","version":"1.0.0"} |
将 HTML 富文本文章发布到微信公众号草稿箱,自动处理封面图片上传获取 media_id。
将已经生成的微信公众号 HTML 文章发布到草稿箱。微信公众号创建草稿接口要求提供封面图的 thumb_media_id,本 Skill 负责:
media_id注意:HTML 内容中的图片链接保持原样,不需要替换。封面图 thumb_media_id 是调用微信草稿接口的必要参数。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| html | string | 是 | HTML 格式的文章内容(内联 CSS) |
| title | string | 是 | 文章标题 |
| author | string | 否 | 作者名称 |
| digest | string | 否 | 文章摘要,默认自动生成 |
| thumb_image | string | 否 | 封面图片处理方式:auto | extract | unsplash | generate | url | none,默认 auto |
| thumb_url | string | 否 | 当 thumb_image=url 时,指定封面图片 URL |
| thumb_keywords | string | 否 | 封面图搜索/生成关键词,未提供时从标题提取 |
| content_source_url | string | 否 | 原文链接 |
| need_open_comment | number | 否 | 是否打开评论,0=关闭,1=打开,默认 1 |
| only_fans_can_comment | number | 否 | 是否仅粉丝可评论,0=所有人,1=仅粉丝,默认 0 |
| 变量名 | 必填 | 说明 |
|---|---|---|
| WECHAT_APP_ID | 是 | 微信公众号 AppID |
| WECHAT_APP_SECRET | 是 | 微信公众号 AppSecret |
| UNSPLASH_ACCESS_KEY | 否 | Unsplash API Access Key,用于搜索配图(thumb_image=unsplash 时必填) |
返回草稿创建结果:
{
"success": true,
"media_id": "草稿ID",
"title": "文章标题",
"thumb_media_id": "封面图media_id",
"thumb_source": "封面图来源:extracted/unsplash/generated/none",
"message": "草稿创建成功"
}
环境变量要求:
WECHAT_APP_ID - 微信公众号 AppIDWECHAT_APP_SECRET - 微信公众号 AppSecret前置检查(仅验证存在性,不输出值):
!node -e "console.log('WECHAT_APP_ID: ' + (process.env.WECHAT_APP_ID ? '已设置' : '未设置')); console.log('WECHAT_APP_SECRET: ' + (process.env.WECHAT_APP_SECRET ? '已设置' : '未设置'))"
如果环境变量未设置,提示用户配置。
根据 thumb_image 参数获取封面图片,上传到微信获取 thumb_media_id:
智能选择封面图源:
<img> 标签,获取第一张图片的 URL从文章 HTML 中提取第一张图片作为封面:
提取规则:
<img[^>]+src=["']([^"']+)["'] 正则表达式data:image)示例:
<!-- 会被提取 -->
<img src="https://example.com/image.jpg">
<!-- 会被排除 -->
<img src="data:image/png;base64,xxx">
如果文章中无图片:
从 Unsplash 搜索并下载配图:
步骤 1:提取关键词
thumb_keywords,直接使用步骤 2:搜索图片
GET https://api.unsplash.com/search/photos
Headers:
Authorization: Client-ID {UNSPLASH_ACCESS_KEY}
Query Parameters:
query: {关键词}
per_page: 5
orientation: landscape
步骤 3:选择最佳图片
步骤 4:下载图片
urls.regular(1080px 宽度)错误处理:
UNSPLASH_ACCESS_KEY → 提示用户配置或切换模式AI 生成封面配图:
步骤 1:构建生成提示词
基于文章标题和关键词构建提示词:
主题:{文章标题}
关键词:{thumb_keywords 或从标题提取}
风格:适合微信公众号封面的横版配图,专业、美观、有视觉冲击力
尺寸:900x500 像素
步骤 2:生成图片
ImageGen 工具生成图片步骤 3:读取生成的图片
使用用户指定的图片 URL:
要求:
thumb_url 参数处理流程:
不设置封面图:
thumb_media_id 参数获取到封面图片后,上传到微信素材库:
调用方法:
import { WeChatAPI } from './src/wechat/api';
const wechatAPI = new WeChatAPI({
appId: process.env.WECHAT_APP_ID!,
appSecret: process.env.WECHAT_APP_SECRET!,
});
// 方式1:从 URL 上传
const thumbMediaId = await wechatAPI.uploadImageFromUrl(imageUrl);
// 方式2:从 Buffer 上传(AI 生成或已下载的图片)
const thumbMediaId = await wechatAPI.uploadImage(imageBuffer, filename);
上传流程:
media_id(永久素材 ID)错误处理:
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 40001 | AppSecret 错误 | 检查 WECHAT_APP_SECRET |
| 40014 | access_token 过期 | 自动重新获取 |
| 45009 | 接口调用超过限制 | 稍后重试 |
| 61004 | 未设置 IP 白名单 | 在微信后台添加服务器 IP |
如果未提供 digest,自动生成摘要:
生成规则:
示例:
// 原始 HTML
<p>React Hooks 是 React 16.8 引入的新特性,它让你在函数组件中使用状态和其他 React 特性...</p>
// 生成摘要
"React Hooks 是 React 16.8 引入的新特性,它让你在函数组件中使用状态和其他 React 特性..."
调用 wechat/api.ts 中的 createDraft() 方法:
const article = {
title: title,
content: html, // 原始 HTML,不修改图片链接
thumb_media_id: thumbMediaId, // 封面图 media_id(可选)
author: author,
digest: digest,
content_source_url: contentSourceUrl,
need_open_comment: needOpenComment,
only_fans_can_comment: onlyFansCanComment,
};
const mediaId = await wechatAPI.createDraft(article);
参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
| title | 是 | 文章标题,最长 64 字符 |
| content | 是 | 图文消息具体内容,支持 HTML 标签 |
| thumb_media_id | 否 | 封面图片素材 ID |
| author | 否 | 作者,最长 16 字符 |
| digest | 否 | 图文消息摘要,最长 120 字符 |
| content_source_url | 否 | 阅读原文链接 |
| need_open_comment | 否 | 是否打开评论,0/1 |
| only_fans_can_comment | 否 | 是否仅粉丝可评论,0/1 |
{
"success": true,
"media_id": "草稿ID",
"title": "文章标题",
"thumb_media_id": "封面图media_id",
"thumb_source": "extracted",
"message": "草稿创建成功,可在公众号后台查看"
}
thumb_image=auto
│
├─ 文章中有图片?
│ ├─ 是 → 使用第一张图片(extract 模式)
│ └─ 否 → 继续判断
│
├─ 配置了 UNSPLASH_ACCESS_KEY?
│ ├─ 是 → 从 Unsplash 搜索(unsplash 模式)
│ └─ 否 → 使用 AI 生成(generate 模式)
| 模式 | 适用场景 | 要求 |
|---|---|---|
| auto | 通用场景,让 AI 自动选择最佳方案 | 无 |
| extract | 文章已有合适配图 | 文章中包含 <img> 标签 |
| unsplash | 需要高质量免费配图 | UNSPLASH_ACCESS_KEY |
| generate | 需要定制化、独特的封面图 | 无(使用 AI 生成) |
| url | 已有确定的图片链接 | 提供 thumb_url |
| none | 不需要封面图 | 无 |
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| -1 | 系统繁忙 | 稍后重试 |
| 40001 | AppSecret 错误 | 检查 WECHAT_APP_SECRET |
| 40013 | AppID 错误 | 检查 WECHAT_APP_ID |
| 40014 | access_token 过期 | 自动重新获取 |
| 42001 | access_token 超时 | 自动重新获取 |
| 45009 | 接口调用超过限制 | 稍后重试 |
| 45002 | 消息内容超过限制 | 文章内容过长(>20000字) |
| 47001 | 解析 JSON 错误 | 检查 HTML 格式 |
| 50002 | 用户受限 | 检查公众号状态 |
| 61004 | 未设置 IP 白名单 | 在微信后台添加服务器 IP |
| 场景 | 处理方式 |
|---|---|
| extract 模式但文章无图片 | 提示用户选择其他模式,或降级到 unsplash/generate |
| unsplash 搜索无结果 | 调整关键词重试,或降级到 generate 模式 |
| unsplash API 错误 | 降级到 generate 模式 |
| AI 生成失败 | 提示用户选择其他模式 |
| 图片下载失败 | 重试 3 次,仍失败则提示用户 |
| 图片过大(>2MB) | 压缩图片后重试 |
| 微信上传失败 | 根据错误码提示用户 |
发布以下文章到微信公众号草稿箱:
标题:深入理解 React Hooks
HTML:
<section style="max-width: 677px; margin: 0 auto; padding: 20px 16px;">
<h1 style="font-size: 22px; font-weight: bold; text-align: center;">深入理解 React Hooks</h1>
<img src="https://example.com/react-hooks.jpg" style="max-width: 100%;">
<p>React Hooks 是 React 16.8 引入的新特性...</p>
</section>
AI 会自动:
https://example.com/react-hooks.jpgthumb_media_id发布文章到草稿箱,使用文章中的图片作为封面:
标题:深入理解 React Hooks
thumb_image: extract
HTML:...
发布文章到草稿箱,使用 Unsplash 搜索封面图:
标题:人工智能的未来发展
thumb_image: unsplash
thumb_keywords: artificial intelligence, technology, future
HTML:...
发布文章到草稿箱,AI 生成封面图:
标题:探索量子计算的奥秘
thumb_image: generate
thumb_keywords: quantum computing, abstract, technology
HTML:...
发布文章到草稿箱,使用指定封面图:
标题:每日技术资讯
thumb_image: url
thumb_url: https://my-cdn.com/cover.jpg
HTML:...
发布文章到草稿箱,不设置封面图:
标题:每日技术资讯
thumb_image: none
HTML:...
src/wechat/api.ts - 微信 API 客户端.agents/skills/wechat-article/SKILL.md - 文章生成 Skill.agents/skills/wechat-article/design-system/index.md - 设计系统规范axios - HTTP 请求form-data - 表单数据构造ImageGen 工具 - AI 生成图片(仅在 generate 模式下使用)