将内容发布到微信公众号,支持通过 API 或 Chrome CDP 发布文章(支持 HTML、Markdown 或纯文本输入)和贴图(多张图片)。Markdown 文章工作流默认将普通外部链接转换为底部引用,以生成适合微信的输出。当用户提到“发布公众号”、“post to wechat”、“微信公众号”或“贴图/图文/文章”时使用。
发布到微信公众号
用户输入工具
当此技能提示用户时,请遵循以下工具选择规则(按优先级):
- 优先使用当前 Agent 运行时内置的用户输入工具,例如
AskUserQuestion、request_user_input、clarify、ask_user或任何等效工具。 - 回退方案:如果没有此类工具,则发送编号的纯文本消息,并让用户回复所选编号/答案。
- 批量处理:如果工具支持一次调用多个问题,则将所有适用问题合并为一次调用;如果仅支持单个问题,则按优先级顺序逐个询问。
以下具体的 AskUserQuestion 引用仅为示例——在其他运行时中请替换为本地等效工具。
语言
使用用户的语言回复。如果用户使用中文,则用中文回复;如果使用英文,则用英文回复。技术性标记(路径、标志、字段名)保持英文。
脚本目录
{baseDir} = 此 SKILL.md 文件所在目录。解析 ${BUN_X}:优先使用 bun;否则使用 npx -y bun;否则建议 brew install oven-sh/bun/bun。
| 脚本 | 用途 |
|---|---|
scripts/wechat-browser.ts |
贴图(图文) |
scripts/wechat-article.ts |
通过浏览器发布文章 |
scripts/wechat-api.ts |
通过 API 发布文章 |
scripts/md-to-wechat.ts |
将 Markdown 转换为带图片占位符的微信兼容 HTML |
scripts/check-permissions.ts |
验证环境与权限 |
偏好设置(EXTEND.md)
按顺序检查以下路径,第一个找到的生效:
| 路径 | 范围 |
|---|---|
.baoyu-skills/baoyu-post-to-wechat/EXTEND.md |
项目 |
${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-post-to-wechat/EXTEND.md |
XDG |
$HOME/.baoyu-skills/baoyu-post-to-wechat/EXTEND.md |
用户主目录 |
找到 → 读取、解析、应用。未找到 → 在执行其他操作前运行首次设置(references/config/first-time-setup.md)。
最小键值(不区分大小写,接受 1/0 或 true/false):
| 键 | 默认值 | 映射 |
|---|---|---|
default_author |
空 | 当 CLI 或 frontmatter 未提供时,作为 author 的回退值 |
need_open_comment |
1 |
draft/add 中的 articles[].need_open_comment |
only_fans_can_comment |
0 |
draft/add 中的 articles[].only_fans_can_comment |
推荐的 EXTEND.md:
default_theme: default
default_color: blue
default_publish_method: browser
default_author: 宝玉
need_open_comment: 1
only_fans_can_comment: 0
chrome_profile_path: /path/to/chrome/profile
# 远程 API 发布(可选)——仅当微信 IP 白名单
# 排除本地机器时设置。参见下方“远程 API 方法”。
# remote_publish_host: server.example.com
# remote_publish_user: deploy
# remote_publish_port: 22
# remote_publish_identity_file: ~/.ssh/id_ed25519
# remote_publish_known_hosts_file: ~/.ssh/known_hosts
# remote_publish_strict_host_key_checking: accept-new
# remote_publish_connect_timeout: 10
# remote_publish_proxy_jump: bastion.example.com
有意不支持原始 ssh/scp 选项;仅识别上述类型化键。认证仅支持 SSH 密钥(无密码)。
主题选项:default, grace, simple, modern。颜色预设:blue, green, vermilion, yellow, purple, sky, rose, olive, black, gray, pink, red, orange(或十六进制颜色)。
值优先级:CLI 参数 → frontmatter → EXTEND.md(账户级别 → 全局)→ 技能默认值。
多账户支持
EXTEND.md 支持 accounts: 块来管理多个公众号。当有 2 个及以上条目时,工作流会插入第 0.5 步来提示选择账户(或根据 default: true 或 --account <alias> 自动选择)。
完整详情——兼容性规则、每个账户的键、凭据解析、每个账户的 Chrome 配置文件、CLI 用法——请参见 references/multi-account.md。
环境检查(可选)
首次使用前,建议进行环境检查(用户可跳过):
${BUN_X} {baseDir}/scripts/check-permissions.ts
检查项:Chrome、配置文件隔离、Bun、辅助功能、剪贴板、粘贴按键、API 凭据、Chrome 冲突。
| 检查失败 | 修复方法 |
|---|---|
| Chrome | 安装 Chrome 或设置 WECHAT_BROWSER_CHROME_PATH |
| 配置文件目录 | 共享配置文件位于 baoyu-skills/chrome-profile |
| Bun 运行时 | brew install oven-sh/bun/bun 或 npm install -g bun |
| 辅助功能(macOS) | 系统设置 → 隐私与安全性 → 辅助功能 → 启用终端应用 |
| 剪贴板复制 | 确保 Swift/AppKit(macOS:xcode-select --install) |
| 粘贴按键(Linux) | 安装 xdotool(X11)或 ydotool(Wayland) |
| API 凭据 | 按照第 2 步的引导设置,或在 .baoyu-skills/.env 中设置 |
贴图(图文)
包含多张图片(最多 9 张)的短帖:
${BUN_X} {baseDir}/scripts/wechat-browser.ts --markdown article.md --images ./images/
${BUN_X} {baseDir}/scripts/wechat-browser.ts --title "标题" --content "内容" --image img.png --submit
详情:references/image-text-posting.md。
文章发布工作流
- [ ] 第 0 步:加载偏好设置(EXTEND.md)
- [ ] 第 0.5 步:解析账户(仅多账户——参见 references/multi-account.md)
- [ ] 第 1 步:确定输入类型
- [ ] 第 2 步:选择方法并配置凭据
- [ ] 第 3 步:解析主题/颜色并验证元数据
- [ ] 第 4 步:发布到微信
- [ ] 第 5 步:报告完成
第 0 步:加载偏好设置
检查并加载 EXTEND.md(参见上方“偏好设置”)。如果未找到,则在提出任何其他问题前完成首次设置。解析并缓存以下值供后续步骤使用:default_theme、default_color、default_author、need_open_comment、only_fans_can_comment。
第 1 步:确定输入类型
| 输入 | 检测 | 下一步 |
|---|---|---|
| HTML 文件 | 路径以 .html 结尾,文件存在 |
跳至第 3 步 |
| Markdown 文件 | 路径以 .md 结尾,文件存在 |
第 2 步 |
| 纯文本 | 不是文件路径,或文件不存在 | 保存为 markdown,然后第 2 步 |
纯文本处理:
- 生成 slug(前 2-4 个有意义的单词,kebab-case;将中文翻译为英文用于 slug)。
- 保存到
post-to-wechat/YYYY-MM-DD/<slug>.md(如需要则创建目录)。 - 继续作为 markdown 文件处理。
第 2 步:选择发布方法并配置
询问方法,除非在 EXTEND.md 或 CLI 中已指定:
| 方法 | 速度 | 要求 |
|---|---|---|
api(推荐) |
快 | API 凭据(本地 IP 已加入白名单) |
browser |
慢 | Chrome + 已登录会话 |
remote-api |
快 | API 凭据 + 一个可通过 SSH 访问且 IP 在微信白名单中的服务器 |
选择 API 但缺少凭据 → 按照 references/api-setup.md 运行引导设置(写入 .baoyu-skills/.env)。
remote-api 方法:微信的“公众号设置 → IP 白名单”通常将 API 访问限制在一两个固定 IP。如果本地机器的 IP 不在该列表中,但云服务器的 IP 在,则使用 remote-api:所有 markdown 渲染、图片处理、草稿组装和 HTML 重写仍在本地进行,只有向 api.weixin.qq.com(token、uploadimg、add_material、draft/add)的出站 HTTPS 调用通过 SSH SOCKS5 动态端口转发(ssh -N -D)隧道传输,使微信将远程服务器视为源 IP。不会向远程主机写入任何文件;AppSecret 永远不会离开本地进程。远程主机仅需 sshd 和出站网络——无需 Python,无需 Agent 进程。参见下方“远程 API 方法”。
第 3 步:解析主题/颜色并验证元数据
- 主题:CLI
--theme→ EXTEND.mddefault_theme→default(第一个匹配项生效;如果已解析则不再询问)。 - 颜色:CLI
--color→ EXTEND.mddefault_color→ 省略(应用主题默认颜色)。 - 验证元数据(markdown 的 frontmatter,HTML 的 meta 标签):
| 字段 | 缺失时 → |
|---|---|
| 标题 | 询问,或按回车从内容自动生成 |
| 摘要 | Frontmatter description → summary → 询问或自动生成 |
| 作者 | CLI --author → frontmatter author → EXTEND.md default_author |
| 来源 URL | CLI --source-url → frontmatter sourceUrl/contentSourceUrl/content_source_url |
自动生成:标题 = 第一个 H1/H2 或第一句话;摘要 = 第一段,截断至 120 字符。
- 封面图片(API
article_type=news必需):CLI--cover→ frontmatter(coverImage/featureImage/cover/image)→imgs/cover.png→ 第一张内联图片 → 如果仍缺失则停止并要求提供。
第 4 步:发布
重要——切勿预先将 markdown 转换为 HTML。 发布脚本内部处理转换,两种方法渲染图片的方式不同:API 渲染 <img> 标签以上传,浏览器使用占位符以粘贴替换。传递预先转换的 HTML 会破坏其中一种方法。
Markdown 引用默认:对于 markdown 输入,默认将普通外部链接转换为底部引用。仅当用户明确希望保留内联链接时使用 --no-cite。现有 HTML 输入保持不变。
API 方法(接受 .md 或 .html):
${BUN_X} {baseDir}/scripts/wechat-api.ts <file> --theme <theme> [--color <color>] [--title <title>] [--summary <summary>] [--author <author>] [--cover <cover_path>] [--source-url <url>] [--no-cite]
始终传递 --theme,即使它是 default。仅当用户或 EXTEND.md 明确设置时才传递 --color。
远程 API 方法(相同脚本,添加 --remote):
${BUN_X} {baseDir}/scripts/wechat-api.ts <file> --theme <theme> --remote [--remote-host <host>] [--remote-user <user>] [--remote-port <port>] [--remote-identity-file <path>] [--remote-known-hosts-file <path>] [--remote-strict-host-key-checking yes|no|accept-new] [--remote-connect-timeout <s>] [--remote-proxy-jump <spec>]
任何 --remote-* 标志都隐含 --remote。CLI 值覆盖账户级别,然后覆盖 EXTEND.md 中的全局 remote_publish_* 键。设置 default_publish_method: remote-api 也会启用远程模式,无需 --remote。
draft/add 负载规则:
- 端点:
POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN article_type:news(默认)或newspic- 对于
news,包含thumb_media_id(封面必需) - 始终在请求体中包含
need_open_comment(默认1)和only_fans_can_comment(默认0),即使 CLI 未暴露它们 - 对于
news,可选包含content_source_url(原文链接,显示为“阅读原文”链接,最大 1KB)。通过--source-urlCLI 标志或 frontmattersourceUrl/contentSourceUrl/content_source_url提供
浏览器方法(接受 --markdown 或 --html):
${BUN_X} {baseDir}/scripts/wechat-article.ts --markdown <markdown_file> --theme <theme> [--color <color>] [--no-cite]
${BUN_X} {baseDir}/scripts/wechat-article.ts --html <html_file>
第 5 步:完成报告
微信发布完成!
输入:[类型] - [路径]
方法:[API | Browser]
主题:[theme] [color if set]
文章:
• 标题:[title]
• 摘要:[summary]
• 图片:[N] 张内联
• 评论:[open/closed],[fans-only/all] ← 仅 API 方法
结果:
✓ 草稿已保存到微信公众号
• media_id:[media_id] ← 仅 API 方法
后续步骤(API):
→ 管理草稿:https://mp.weixin.qq.com(登录后进入「内容管理」→「草稿箱」)
创建的文件:
[• post-to-wechat/YYYY-MM-DD/slug.md(如果输入为纯文本)]
[• slug.html(已转换)]
功能对比
| 功能 | 贴图 | 文章(API) | 文章(远程 API) | 文章(浏览器) |
|---|---|---|---|---|
| 纯文本输入 | ✗ | ✓ | ✓ | ✓ |
| HTML 输入 | ✗ | ✓ | ✓ | ✓ |
| Markdown 输入 | 标题/内容 | ✓ | ✓ | ✓ |
| 多张图片 | ✓(最多 9 张) | ✓(内联) | ✓(内联) | ✓(内联) |
| 主题 | ✗ | ✓ | ✓ | ✓ |
| 自动生成元数据 | ✗ | ✓ | ✓ | ✓ |
默认封面回退(imgs/cover.png) |
✗ | ✓ | ✓ | ✗ |
| 评论控制 | ✗ | ✓ | ✓ | ✗ |
| 需要 Chrome | ✓ | ✗ | ✗ | ✓ |
| 需要 API 凭据 | ✗ | ✓ | ✓ | ✗ |
| 需要可通过 SSH 访问且 IP 已加入白名单的服务器 | ✗ | ✗ | ✓ | ✗ |
| 速度 | 中等 | 快 | 快 | 慢 |
故障排除
| 问题 | 修复方法 |
|---|---|
| 缺少 API 凭据 | 按照第 2 步的引导设置 |
| Access token 错误 | 验证凭据有效且未过期 |
| 未登录(浏览器) | 首次运行会打开浏览器——扫描二维码登录。设置 TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID 以通过 Telegram 接收二维码图片 |
| 未找到 Chrome | 设置 WECHAT_BROWSER_CHROME_PATH |
| 标题/摘要缺失 | 使用自动生成或手动提供 |
| 无封面图片 | 添加 frontmatter 封面或将 imgs/cover.png 放置在文章目录中 |
| 评论默认值错误 | 检查 EXTEND.md 中的 need_open_comment / only_fans_can_comment |
| 粘贴失败 | 检查系统剪贴板权限 |
Remote publish host is required |
设置 --remote-host 或 EXTEND.md 中的 remote_publish_host |
SOCKS proxy on 127.0.0.1:… not ready |
SSH 无法启动隧道——检查密钥、主机、StrictHostKeyChecking,或使用 --remote-connect-timeout |
远程发布时 ssh exited early |
验证用户可以通过非交互方式 ssh 到服务器;如果链接慢则增加 --remote-connect-timeout |
远程 API 调用返回 errcode 40164(无效 IP) |
远程服务器的出口 IP 不在微信白名单中;在“公众号设置 → IP 白名单”中添加 |
参考资料
| 文件 | 内容 |
|---|---|
references/image-text-posting.md |
贴图参数、自动压缩 |
references/article-posting.md |
文章主题、图片处理 |
references/multi-account.md |
多账户兼容性、凭据、Chrome 配置文件、CLI |
references/api-setup.md |
引导式凭据设置 |
references/config/first-time-setup.md |
首次 EXTEND.md 设置 |
扩展支持
通过 EXTEND.md 进行自定义配置。参见“偏好设置”了解路径和受支持的选项。






