{"id":"c06f826a-909b-47db-bade-0d353b94d854","shortId":"TfNCQK","kind":"skill","title":"aws-wechat-article-publish","tagline":"将文章发布到微信公众号（API 写入草稿箱或提交发布），含发布前检查。当用户提到「发布」「提交」「群发」「推送」「发出去」「上传到公众号」「发到公众号」「可以发了吗」「发布前检查」时使用。","description":"# 发布\n\n通过微信公众号 API 将排版稿写入**草稿箱**或再**提交发布**（由 **`config.yaml`** 的 **`publish_method`** 与命令行 **`--publish`** 控制）。\n\n## 配置检查 ⛔\n\n任何操作执行前，**必须**按 **[首次引导](../aws-wechat-article-main/references/first-time-setup.md)** 执行其中的 **「检测顺序」**。检测通过后才能进行以下操作（或用户明确书面确认「本次不检查」）：\n\n## 脚本目录\n\n**Agent 执行**：确定本 SKILL.md 所在目录为 `{baseDir}`。发布子命令在 **`{baseDir}/scripts/publish.py`**（项目根执行）。\n\n| 脚本 / 子命令 | 用途 |\n|--------|------|\n| **`article_init.py`** | 初始化或更新本篇 **`article.yaml`**（及可选 **`closing.md`**）。用于总览 **本篇准备**（建目录后）或 **发布前** 补全元数据。仓库根执行：`python {baseDir}/scripts/article_init.py <文章目录> [--title … --author … --digest …]` |\n| **`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` |\n| `check-screening` | 校验 **`config.yaml`** 的 **`publish_method`**（**`draft`** / **`published`** / **`none`**） |\n| `check-wechat-env` | 按 **`config.yaml` 槽位**检查 `aws.env` 的 `WECHAT_N_APPID` / `WECHAT_N_APPSECRET` 是否已填（**调用 `publish.py` 前建议跑**） |\n| `check` | 环境检查：`aws.env`、各槽位、依赖、可选探测 token |\n| `accounts` | 列出 **`config.yaml`** 中各微信槽位名称，并标记 `aws.env` 凭证缺项 |\n| `full` / `token` / … | 调微信 API（需 **`aws.env`** 微信凭证） |\n\n## 凭证与 `publish_method` ⛔\n\n### `publish_method`（以仓库 **`config.yaml`** 为准）\n\n| 值 | 含义 | 行为 |\n|----|------|------|\n| **`draft`**（默认） | 只进公众号**草稿箱** | **`full`** 创建草稿后**不**调用 freepublish 提交发布。 |\n| **`published`** | 草稿 + **提交发布** | **`full`** 创建草稿后继续提交发布（异步）。**`full --publish`** 可**单次强制**带发布，即使当前为 **`draft`**。 |\n| **`none`** | 用户明确不填微信 | **`full`** **立即退出**，不调任何微信接口（**`--publish`** 也会被忽略）。其它子命令（`token` 等）仍要凭证。 |\n\n### 多账号时如何选槽位\n\n1. 运行 **`python {baseDir}/scripts/publish.py accounts`**，从 **`config.yaml` 的 `wechat_accounts` + `wechat_N_name`** 向用户展示列表（例如：`您有2个账号：1.\"xiaoming\"，2.\"xiaoz\"`）必须询问用户选择哪个账号发布到草稿箱，然后根据用户选择发布到指定的账号。\n2. 在 **`config.yaml`** 写 **`wechat_publish_slot: <整数>`**，**或**命令行 **`--account <序号或名称>`**（**CLI 优先**，见 [articlescreening-schema.md](../aws-wechat-article-main/references/articlescreening-schema.md)）。\n\n### 全局环境\n\n在仓库根具备 **`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`**（两者都空时使用官方）。\n\n### 作者名回退\n\n`full` / `create-draft` 若 **`article.yaml` 无 author**，回退 **`config.yaml`** 的 **`default_author`**。\n\n### `publish_completed`（本篇是否已发布完成）\n\n- 字段在**本篇** **`article.yaml`**。**`publish.py` 不读、不改**；由智能体维护。\n- **`false`**：发布流程未闭环。\n- **`true`**：已视为发布完成（草稿已确认 / 或 **`published`** 流程成功且运营确认）。\n\n**本篇发布真正结束后**：将 **`publish_completed: true`** 写回 **`article.yaml`**。\n\n**写回 `true` 的前置门禁（缺啥补啥）**：\n\n1. `article.html` 存在；\n2. 文章目录存在封面图 `cover.(png/jpg/jpeg/webp)`；\n3. `article.md` 与 `article.html` 中均不含 `placeholder`；\n4. 发布命令成功并拿到回执（`media_id` 或 `publish_id`）。\n\n任一不满足：只可标记为“已提交草稿，未闭环”，**不得**写回 `publish_completed: true`。\n\n## 用户仅说「发布」且未明确路径时 ⛔\n\n在用户**未给出** `drafts/…` 路径、仅说「发布文章」「帮我发一下」等时：\n\n1. **确定本篇目录**：列出仓库下 **`drafts/`** 中子目录；若**多篇**，请用户**指定一篇**或选「最新修改」的一篇再读该目录 **`article.yaml`**。**勿**在未确认目录时假定路径。\n2. 读取该目录 **`article.yaml`** 中的 **`publish_completed`**（YAML 布尔：`true` / `false`；**缺省按 `false` 处理**）。\n\n| `publish_completed` | 智能体对用户说明（可略作口语化，勿改含义） |\n|---------------------|---------------------------------------------|\n| **`true`** | 告知：**项目里本篇文档已按记录成功发布**；问：**您是否需要编写新文章？** 若需要 → 转交 [main](../aws-wechat-article-main/SKILL.md) / [writing](../aws-wechat-article-writing/SKILL.md) 从本篇准备或选题起走。 |\n| **`false`** 或缺省 | 读取 **`article.yaml`** 的 **`title`**（若无则用目录名简述），说明：**《{title}》尚未执行完成（发布流程未闭环）**；问：**是否需要继续并完成发布？** 或 **编写新文章？** 若继续本篇 → 再核对 **`config.yaml`** 的 **`publish_method`**、**`check-screening`**、**`check-wechat-env`** 等。 |\n\n## 工作流\n\n```\n发布进度：\n- [ ] 前置：配置检查（见本节「配置检查」）⛔\n- [ ] 第0步：若用户未给路径 → 选本篇目录 → 读 publish_completed → 按上表分流（true/false）\n- [ ] 第1步：读 **`config.yaml`** → **`draft` / `published`**（及是否 **`full --publish`**）\n- [ ] 第2步：读取 **`config.yaml`** 的 `wechat_accounts` + `wechat_N_name` 向用户展示账号列表并询问目标槽位；随后跑 **`check-wechat-env`** 校验 `aws.env` 凭证 → **`wechat_publish_slot` 或 `--account`**\n- [ ] 第3步：发布前检查（checklist + **`check-screening`** + **`check`**）\n- [ ] 第4步：准备文章目录\n- [ ] 第5步：**`full`**（仅草稿或含发布，视上步）\n- [ ] 第6步：确认结果与用户说明\n- [ ] 第7步：成功后写回 **`article.yaml`** 的 **`publish_completed: true`**；按需归档\n```\n\n## 交互顺序（最小提问）\n\n0) **未给路径时**：先按上文 **「用户仅说发布」** 处理 **`publish_completed`**；用户选 **继续本篇** 后再做下列步骤。  \n1) **先看 `config.yaml` 的 `publish_method`**：**`draft`** = 默认只进草稿箱；**`published`** 或 **`full --publish`** = 再提交发布。  \n2) **多槽位**：展示账号列表（来源：`config.yaml` 的 `wechat_accounts` + `wechat_N_name`），**必须请用户选槽位** → **`wechat_publish_slot`** 或 **`--account`**。  \n3) 缺微信字段：运行 **`check-wechat-env`**，补全 **`aws.env`** 后再发。  \n4) **发布失败**（由脚本 stderr / 微信 errcode 判断）：  \n   - **网络类**（超时、连接失败、5xx）：脚本已对单次请求 **自动重试 1 次**；仍失败 → 告知「网络不可用，请稍后重试或检查代理」。  \n   - **凭证/配置类**（如 token 失败带 errcode、缺字段）→ 提示 **第几槽位**、检查 **APPID/SECRET、IP 白名单**，用户改正后再执行 **`full`** / **`publish`**。\n5) **中间产物缺失**（封面缺失 / 存在 `placeholder`）：先补产物再发；若用户坚持先发草稿，必须明确告知“正文配图未完成”，且保持 `publish_completed: false`。\n\n## 命令示例（仓库根）\n\n```bash\npython {baseDir}/scripts/publish.py check-screening\npython {baseDir}/scripts/publish.py check-wechat-env\npython {baseDir}/scripts/publish.py accounts\npython {baseDir}/scripts/publish.py check\npython {baseDir}/scripts/publish.py --account 1 full drafts/YYYYMMDD-标题slug/\npython {baseDir}/scripts/getdraft.py published-fields\n```\n\n详见 [references/usage.md](references/usage.md)、[references/submit-guide.md](references/submit-guide.md)、[references/api-reference.md](references/api-reference.md)。\n\n## 过程文件\n\n| 读取 | 产出 |\n|------|------|\n| `article.html`、`imgs/`、**`article.yaml`**（含 **`publish_completed`** 等）、**`.aws-article/config.yaml`**、**`aws.env`**（微信槽位） | 发布到公众号草稿或提交发布；**成功后**由智能体将 **`publish_completed: true`** 写回 **`article.yaml`**（`publish.py` 不改此键） |","tags":["aws","wechat","article","publish","skills","aiworkskills","agent-skills","ai-skills","ai-writing","chinese-nlp","codex","content-automation"],"capabilities":["skill","source-aiworkskills","skill-aws-wechat-article-publish","topic-agent-skills","topic-ai-skills","topic-ai-writing","topic-chinese-nlp","topic-codex","topic-content-automation","topic-content-creation","topic-copywriting","topic-llm","topic-markdown-to-html","topic-openclaw","topic-wechat"],"categories":["wechat-article-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/aiworkskills/wechat-article-skills/aws-wechat-article-publish","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add aiworkskills/wechat-article-skills","source_repo":"https://github.com/aiworkskills/wechat-article-skills","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 14 github stars · SKILL.md body (5,946 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T01:02:22.458Z","embedding":null,"createdAt":"2026-04-21T19:04:11.874Z","updatedAt":"2026-04-22T01:02:22.458Z","lastSeenAt":"2026-04-22T01:02:22.458Z","tsv":"'/aws-wechat-article-main/references/articlescreening-schema.md':248 '/aws-wechat-article-main/references/first-time-setup.md':41 '/aws-wechat-article-main/skill.md':408 '/aws-wechat-article-writing/skill.md':410 '/config.yaml':667 '/scripts/article_init.py':75 '/scripts/getdraft.py':107,643 '/scripts/publish.py':56,213,614,620,627,631,635 '0':511 '1':209,226,327,367,521,574,637 '2':228,232,330,382,534 '3':334,551 '4':340,561 '5':596 '5xx':571 'account':149,214,219,242,468,485,541,550,628,636 'agent':48 'api':7,23,159,273,277,281 'appid':134 'appid/secret':590 'appsecret':137 'articl':4,94,666 'article-get':93 'article.html':328,337,657 'article.md':335 'article.yaml':63,290,303,322,379,384,415,503,659,677 'article_init.py':61 'articlescreening-schema.md':247 'author':78,292,297 'aw':2,665 'aws-articl':664 'aws-wechat-article-publish':1 'aws.env':130,144,154,161,251,479,559,668 'base':278,282 'basedir':53,55,74,106,212,613,619,626,630,634,642 'bash':611 'check':112,123,142,270,434,437,475,490,492,555,616,622,632 'check-screen':111,433,489,615 'check-wechat-env':122,269,436,474,554,621 'checklist':488 'cli':244 'closing.md':65 'complet':299,319,354,387,396,452,506,517,607,662,674 'config.yaml':29,115,127,151,169,216,234,254,294,429,457,465,523,538 'config.yaml.wechat':280 'cover':332 'creat':287 'create-draft':286 'default':296 'digest':79 'draft':119,174,196,266,288,361,370,458,527 'drafts/yyyymmdd-':639 'embeds.related_articles.manual':99 'env':125,272,439,477,557,624 'errcod':566,585 'fals':308,391,393,412,608 'field':89,110,646 'freepublish':97,102,182 'full':156,178,187,190,199,264,285,461,496,531,594,638 'get':92,95 'getdraft.py':80 'id':343,346 'img':658 'ip':591 'list':86 'main':407 'media':342 'method':32,118,165,167,261,432,526 'n':133,136,221,276,470,543 'name':222,471,544 'none':121,197,262 'placehold':339,600 'png/jpg/jpeg/webp':333 'publish':5,31,34,85,88,91,109,117,120,164,166,184,191,202,237,260,267,298,314,318,345,353,386,395,431,451,459,462,482,505,516,525,529,532,547,595,606,645,661,673 'publish-get':90 'publish.py':82,140,304,678 'published-field':87,108,644 'published-list':84 'python':73,105,211,612,618,625,629,633,641 'references/api-reference.md':652,653 'references/submit-guide.md':650,651 'references/usage.md':648,649 'screen':113,435,491,617 'skill' 'skill-aws-wechat-article-publish' 'skill.md':51 'slot':238,483,548 'source-aiworkskills' 'stderr':564 'titl':77,417,420 'token':148,157,205,583 'topic-agent-skills' 'topic-ai-skills' 'topic-ai-writing' 'topic-chinese-nlp' 'topic-codex' 'topic-content-automation' 'topic-content-creation' 'topic-copywriting' 'topic-llm' 'topic-markdown-to-html' 'topic-openclaw' 'topic-wechat' 'true':310,320,324,355,390,400,507,675 'true/false':454 'validate_env.py':258 'wechat':3,124,132,135,218,220,236,271,275,438,467,469,476,481,540,542,546,556,623 'write':409 'xiaom':227 'xiaoz':229 'yaml':388 '上传到公众号':16 '不':180 '不得':351 '不改':306 '不改此键':679 '不读':305 '不调任何微信接口':201 '与':253,336 '与命令行':33 '且保持':605 '且未明确路径时':358 '两者都空时使用官方':283 '中各微信槽位名称':152 '中均不含':338 '中子目录':371 '中的':385 '中间产物缺失':597 '为准':170 '为空时自动补全推荐链接':100 '也会被忽略':203 '交互顺序':509 '产出':656 '仅草稿或含发布':497 '仅说':363 '仍失败':576 '仍要凭证':207 '从':215 '从本篇准备或选题起走':411 '仓库根':104,610 '仓库根执行':72 '以仓库':168 '任一不满足':347 '任何操作执行前':37 '优先':245 '会跳过':265 '作者名回退':284 '例如':224 '依赖':146 '值':171 '先按上文':513 '先看':522 '先补产物再发':601 '全局环境':249 '其它子命令':204 '再提交发布':533 '再核对':428 '写':235 '写作':256 '写入草稿箱或提交发布':8 '写回':321,323,352,676 '准备文章目录':494 '凭证':480,580 '凭证与':163 '凭证缺项':155 '列出':150 '列出仓库下':369 '创建草稿后':179 '创建草稿后继续提交发布':188 '初始化或更新本篇':62 '判断':567 '前建议跑':141 '前置':443 '勿':380 '勿改含义':399 '单次强制':193 '即使当前为':195 '及可选':64 '及是否':460 '发出去':15 '发到公众号':17 '发布':11,21,357 '发布到公众号草稿或提交发布':670 '发布前':70 '发布前建议':268 '发布前检查':19,487 '发布命令成功并拿到回执':341 '发布失败':562 '发布子命令在':54 '发布文章':364 '发布流程未闭环':309,422 '发布进度':442 '只可标记为':348 '只进公众号':176 '可':192 '可以发了吗':18 '可用于':98 '可略作口语化':398 '可选探测':147 '各槽位':145 '后再做下列步骤':520 '后再发':560 '向用户展示列表':223 '向用户展示账号列表并询问目标槽位':472 '含':660 '含义':172 '含发布前检查':9 '告知':401,577 '命令示例':609 '命令行':241 '回退':293 '在':233 '在仓库根具备':250 '在未确认目录时假定路径':381 '在用户':359 '处理':394,515 '多槽位':535 '多篇':373 '多账号时如何选槽位':208 '失败带':584 '如':582 '子命令':59 '字段在':301 '存在':329,599 '对应':96 '封面缺失':598 '将':317 '将排版稿写入':24 '将文章发布到微信公众号':6 '尚未执行完成':421 '展示账号列表':536 '工作流':441 '已提交草稿':349 '已视为发布完成':311 '布尔':389 '带发布':194 '帮我发一下':365 '并标记':153 '序号或名称':243 '建目录后':68 '异步':189 '当用户提到':10 '微信':565 '微信凭证':162 '微信密钥':252 '微信未齐仍可先做内容':259 '微信槽位':669 '微信槽位数量与名称':255 '必须':38 '必须明确告知':603 '必须询问用户选择哪个账号发布到草稿箱':230 '必须请用户选槽位':545 '您是否需要编写新文章':404 '您有2个账号':225 '成功后':671 '成功后写回':502 '或':69,240,313,344,425,484,530,549 '或再':26 '或用户明确书面确认':45 '或缺省':413 '或选':376 '所在目录为':52 '执行':49 '执行其中的':42 '指定一篇':375 '按':39,126 '按上表分流':453 '按需归档':508 '控制':35 '推送':14 '提交':12 '提交发布':27,183,186 '提示':587 '整数':239 '文章目录':76 '文章目录存在封面图':331 '无':291 '时':263 '时使用':20 '是否已填':138 '是否需要继续并完成发布':424 '智能体对用户说明':397 '最小提问':510 '最新修改':377 '未给出':360 '未给路径时':512 '未闭环':350 '本次不检查':46 '本篇':302 '本篇准备':67 '本篇发布真正结束后':316 '本篇是否已发布完成':300 '来源':537 '标题slug':640 '校验':114,478 '检查':129,589 '检测通过后才能进行以下操作':44 '检测顺序':43 '槽位':128 '次':575 '正文配图未完成':604 '注意':101 '流程成功且运营确认':315 '然后根据用户选择发布到指定的账号':231 '独立于':81 '环境检查':143 '生图见':257 '用于总览':66 '用于正式文章查询':83 '用户仅说':356 '用户仅说发布':514 '用户改正后再执行':593 '用户明确不填微信':198 '用户选':518 '用途':60 '由':28 '由智能体将':672 '由智能体维护':307 '由脚本':563 '白名单':592 '的':30,116,131,217,295,416,430,466,504,524,539 '的一篇再读该目录':378 '的前置门禁':325 '确定本':50 '确定本篇目录':368 '确认结果与用户说明':500 '立即退出':200 '端点优先取':274 '第0步':447 '第1步':455 '第2步':463 '第3步':486 '第4步':493 '第5步':495 '第6步':499 '第7步':501 '第几槽位':588 '等':206,440,663 '等时':366 '继续本篇':519 '编写新文章':426 '缺啥补啥':326 '缺字段':586 '缺微信字段':552 '缺省按':392 '网络不可用':578 '网络类':568 '群发':13 '脚本':58 '脚本已对单次请求':572 '脚本目录':47 '自动重试':573 '若':289,372 '若无则用目录名简述':418 '若槽位未配则回退':279 '若用户坚持先发草稿':602 '若用户未给路径':448 '若继续本篇':427 '若需要':405 '草稿':185 '草稿已确认':312 '草稿箱':25,177 '行为':173 '补全':558 '补全元数据':71 '见':246 '见本节':445 '视上步':498 '详见':647 '说明':419 '请用户':374 '请稍后重试或检查代理':579 '读':450,456 '读取':414,464,655 '读取该目录':383 '调微信':158 '调用':139,181 '超时':569 '路径':362 '转交':406 '过程文件':654 '运行':210,553 '连接失败':570 '选本篇目录':449 '通过微信公众号':22 '配置检查':36,444,446 '配置类':581 '问':403,423 '随后跑':473 '需':160 '需要公众号具备对应接口权限':103 '项目根执行':57 '项目里本篇文档已按记录成功发布':402 '首次引导':40 '默认':175 '默认只进草稿箱':528","prices":[{"id":"c02bce37-076f-4501-a982-685eae01c0cf","listingId":"c06f826a-909b-47db-bade-0d353b94d854","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"aiworkskills","category":"wechat-article-skills","install_from":"skills.sh"},"createdAt":"2026-04-21T19:04:11.874Z"}],"sources":[{"listingId":"c06f826a-909b-47db-bade-0d353b94d854","source":"github","sourceId":"aiworkskills/wechat-article-skills/aws-wechat-article-publish","sourceUrl":"https://github.com/aiworkskills/wechat-article-skills/tree/main/skills/aws-wechat-article-publish","isPrimary":false,"firstSeenAt":"2026-04-21T19:04:11.874Z","lastSeenAt":"2026-04-22T01:02:22.458Z"}],"details":{"listingId":"c06f826a-909b-47db-bade-0d353b94d854","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"aiworkskills","slug":"aws-wechat-article-publish","github":{"repo":"aiworkskills/wechat-article-skills","stars":14,"topics":["agent-skills","ai-skills","ai-writing","chinese-nlp","codex","content-automation","content-creation","copywriting","llm","markdown-to-html","openclaw","wechat","wechat-api","wechat-official-account"],"license":"apache-2.0","html_url":"https://github.com/aiworkskills/wechat-article-skills","pushed_at":"2026-04-21T06:27:58Z","description":"微信公众号 AI 运营助手 | 选题、写稿、审稿、排版、配图、发布全流程 Skill，支持 OpenClaw / Claude Code / Cursor / Codex","skill_md_sha":"e8fe7e5749db6382f029b919c527eda811f94221","skill_md_path":"skills/aws-wechat-article-publish/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/aiworkskills/wechat-article-skills/tree/main/skills/aws-wechat-article-publish"},"layout":"multi","source":"github","category":"wechat-article-skills","frontmatter":{"name":"aws-wechat-article-publish","description":"将文章发布到微信公众号（API 写入草稿箱或提交发布），含发布前检查。当用户提到「发布」「提交」「群发」「推送」「发出去」「上传到公众号」「发到公众号」「可以发了吗」「发布前检查」时使用。"},"skills_sh_url":"https://skills.sh/aiworkskills/wechat-article-skills/aws-wechat-article-publish"},"updatedAt":"2026-04-22T01:02:22.458Z"}}