公众号发布|公众号草稿箱|公众号群发|图文推送|微信 API|wechat automation|WeChat API automation|auto publish|scheduled publish — 公众号 API 发布工具,图文入草稿箱或直接群发,支持封面素材上传、发布前检查与 draft/publis...
公众号 API 直连发布 —— 图文入草稿箱或直接群发,素材上传、发布前检查一站式完成。
套件说明 · 本 skill 属
aws-wechat-article-*一条龙套件(共 9 个 slug,入口aws-wechat-article-main)。跨 skill 的相对引用依赖同一skills/目录,建议一并clawhub install全套。源码: https://github.com/aiworkskills/wechat-article-skills
本 skill 调 publish.py 直连微信公众号官方 API 发布图文。 会把本篇 article.html 与 imgs/* 文件作为 POST body 上传到微信服务器。 具体行为:
aws.env 的 WECHAT_{N}_APPID / WECHAT_{N}_APPSECRET(多槽位支持 N≥1)APPID / APPSECRET 以 query string 形式发给 api.weixin.qq.com/cgi-bin/token 换 access_token;后续请求带 access_token query string。微信返回的 access_token 在进程内存短期缓存, 不落盘material/add_material; article.html 正文与标题/摘要以 JSON POST 发给 draft/add、 freepublish/submitapi.weixin.qq.com;用户可在 WECHAT_{N}_API_BASE / config.yaml.wechat_api_base 自配反代.aws-article/config.yaml、 aws.env、本篇 article.yaml、 article.html、 imgs/*article.yaml 的状态字段( media_id、 publish_id、 publish_completed){python} {baseDir}/scripts/publish.py、 getdraft.py、 article_init.py( {python} = 本机 Python 3 解释器,见 main SKILL 第 0 步:Windows 用 py -3 -X utf8,macOS / Linux 用 python3)建议:首次运行用 publish_method: draft 只入草稿箱确认效果,再切 published 真正群发。
本 skill 是 aws-wechat-article-* 一条龙公众号套件的 发布环节(入口 aws-wechat-article-main)。工作流中的若干步骤会读取同级 ../aws-wechat-article-main/references/*.md 等共享文档(首次引导、articlescreening schema、env/config 示例等)。
skills/ 根目录 时,跨 skill 引用都能读到。file not found;但 publish.py、 getdraft.py、 article_init.py 这几个脚本本身可独立运行(只要 aws.env 与 .aws-article/config.yaml 就绪)。完整 9 slug 清单见 源码仓库。
通过微信公众号 API 将排版稿写入 草稿箱 或再 提交发布(由 config.yaml 的 publish_method 与命令行 --publish 控制)。
任何操作执行前, 必须 按 首次引导 执行其中的 「检测顺序」。检测通过后才能进行以下操作(或用户明确书面确认「本次不检查」):
Agent 执行:确定本 SKILL.md 所在目录为 {baseDir}。发布子命令在 {baseDir}/scripts/publish.py(项目根执行)。
脚本 / 子命令用途**article_init.py初始化或更新本篇 article.yaml(及可选 closing.md)。用于总览 本篇准备(建目录后)或 发布前 补全元数据。仓库根执行: {python} {baseDir}/scripts/article_init.py <文章目录> [--title … --author … --digest …]getdraft.py**独立于 publish.py:用于正式文章查询( published-list / published-fields / publish-get / article-get,对应 freepublish/*),可用于 embeds.related_articles.manual 为空时自动补全推荐链接。注意: freepublish/* 需要公众号具备对应接口权限。仓库根: {python} {baseDir}/scripts/getdraft.py published-fields``check-screening校验 config.yaml 的 publish_method( draft / published / none)check-wechat-env按 config.yaml 槽位 检查 aws.env 的 WECHAT_N_APPID / WECHAT_N_APPSECRET 是否已填( 调用 publish.py 前建议跑)check环境检查: aws.env、各槽位、依赖、可选探测 tokenaccounts列出 config.yaml 中各微信槽位名称,并标记 aws.env 凭证缺项full / token / …调微信 API(需 aws.env 微信凭证)
publish_method ⛔#publish_method(以仓库 config.yaml 为准)#值含义行为**draft(默认)只进公众号 草稿箱full** 创建草稿后 不 调用 freepublish 提交发布。published草稿 + 提交发布full 创建草稿后继续提交发布(异步)。 full --publish 可 单次强制 带发布,即使当前为 draft。none用户明确不填微信full 立即退出,不调任何微信接口( --publish 也会被忽略)。其它子命令( token 等)仍要凭证。
{python} {baseDir}/scripts/publish.py accounts,从 config.yaml 的 wechat_accounts + wechat_N_name 向用户展示列表(例如: 您有2个账号:1."xiaoming",2."xiaoz")必须询问用户选择哪个账号发布到草稿箱,然后根据用户选择发布到指定的账号。config.yaml 写 wechat_publish_slot: <整数>, 或 命令行 --account <序号或名称>( CLI 优先,见 articlescreening-schema.md)。在仓库根具备 aws.env(微信密钥)与 config.yaml(微信槽位数量与名称)。写作/生图见 validate_env.py(微信未齐仍可先做内容)。 publish_method: none 时 full 会跳过; draft/ published 发布前建议 check-wechat-env。API 端点优先取 WECHAT_N_API_BASE,若槽位未配则回退 config.yaml.wechat_api_base(两者都空时使用官方)。
full / create-draft 若 article.yaml 无 author,回退 config.yaml 的 default_author。
publish_completed(本篇是否已发布完成)#article.yaml。 publish.py 不读、不改;由智能体维护。false:发布流程未闭环。true:已视为发布完成(草稿已确认 / 或 published 流程成功且运营确认)。本篇发布真正结束后:将 publish_completed: true 写回 article.yaml。
写回 true 的前置门禁(缺啥补啥):
article.html 存在;
文章目录存在封面图 cover.(png/jpg/jpeg/webp);
封面裁剪框:微信只收一张封面,但 draft/add 可附带两个裁剪框,分别决定 2.35:1(订阅号信息流首图)与 1:1(分享卡片、公众号主页、历史列表)怎么裁;不传时微信自行居中裁切。 publish.py 会按封面实际尺寸自动算出两个框并随草稿提交(需 Pillow;未安装则跳过,交给微信默认行为)。
设计取向是 2.35:1 优先——信息流那一眼决定点不点,1:1 作降级视图。所以封面按 2.35:1 构图即可,不必为迁就方形而牺牲主视图。
需要手动指定时,在本篇 article.yaml 写 pic_crop_235_1 / pic_crop_1_1( X1_Y1_X2_Y2 归一化 0~1),脚本不再覆盖。注意裁出区域的宽高比须与目标比例一致,否则接口返回 53402「封面裁剪失败」。
article.md 与 article.html 中均不含 placeholder;
发布命令成功并拿到回执( media_id 或 publish_id)。
任一不满足:只可标记为“已提交草稿,未闭环”, 不得 写回 publish_completed: true。
在用户 未给出 drafts/… 路径、仅说「发布文章」「帮我发一下」等时:
drafts/ 中子目录;若 多篇,请用户 指定一篇 或选「最新修改」的一篇再读该目录 article.yaml。 勿 在未确认目录时假定路径。article.yaml 中的 publish_completed(YAML 布尔: true / false; 缺省按 false 处理)。publish_completed智能体对用户说明(可略作口语化,勿改含义)true告知: 项目里本篇文档已按记录成功发布;问: 您是否需要编写新文章? 若需要 → 转交 main / writing 从本篇准备或选题起走。false 或缺省读取 article.yaml 的 title(若无则用目录名简述),说明: 《{title}》尚未执行完成(发布流程未闭环);问: 是否需要继续并完成发布? 或 编写新文章? 若继续本篇 → 再核对 config.yaml 的 publish_method、 check-screening、 check-wechat-env 等。
text
发布进度:
- [ ] 前置:配置检查(见本节「配置检查」)⛔
- [ ] 第0步:若用户未给路径 → 选本篇目录 → 读 publish_completed → 按上表分流(true/false)
- [ ] 第1步:读 **`config.yaml`** → **`draft` / `published`**(及是否 **`full --publish`**)
- [ ] 第2步:读取 **`config.yaml`** 的 `wechat_accounts` + `wechat_N_name` 向用户展示账号列表并询问目标槽位;随后跑 **`check-wechat-env`** 校验 `aws.env` 凭证 → **`wechat_publish_slot` 或 `--account`**
- [ ] 第3步:发布前检查(checklist + **`check-screening`** + **`check`**)
- [ ] 第4步:准备文章目录
- [ ] 第5步:**`full`**(仅草稿或含发布,视上步)
- [ ] 第6步:确认结果与用户说明
- [ ] 第7步:成功后写回 **`article.yaml`** 的 **`publish_completed: true`**;按需归档
未给路径时:先按上文 「用户仅说发布」 处理 publish_completed;用户选 继续本篇 后再做下列步骤。
先看 config.yaml 的 publish_method: draft = 默认只进草稿箱; published 或 full --publish = 再提交发布。
多槽位:展示账号列表(来源: config.yaml 的 wechat_accounts + wechat_N_name), 必须请用户选槽位 → wechat_publish_slot 或 --account。
缺微信字段:运行 check-wechat-env,补全 aws.env 后再发。
发布失败(由脚本 stderr / 微信 errcode 判断):
full / publish。中间产物缺失(封面缺失 / 存在 placeholder):先补产物再发;若用户坚持先发草稿,必须明确告知“正文配图未完成”,且保持 publish_completed: false。
bash
{python} {baseDir}/scripts/publish.py check-screening
{python} {baseDir}/scripts/publish.py check-wechat-env
{python} {baseDir}/scripts/publish.py accounts
{python} {baseDir}/scripts/publish.py check
{python} {baseDir}/scripts/publish.py --account 1 full drafts/YYYYMMDD-标题slug/
{python} {baseDir}/scripts/getdraft.py published-fields
详见 references/usage.md、 references/submit-guide.md、 references/api-reference.md。
读取产出article.html、 imgs/、 article.yaml(含 publish_completed 等)、 .aws-article/config.yaml、 aws.env(微信槽位)发布到公众号草稿或提交发布; 成功后 由智能体将 publish_completed: true 写回 article.yaml( publish.py 不改此键)