必须从 hermes-kb 根目录执行,或传入绝对路径

硬知识 · 2026-07-31 · 精炼版

🎯 【一句话洞察】

🗺️ 【核心逻辑链】

  1. 痛点:公众号永久素材 media_id 会过期(或被后台删除),每次推送前缓存的 .wxgzh-cover-id 可能失效,报 40007 阻断流程。
  2. 解决方案:用一张固定小体积 PNG 作为占位封面,每次推送前重新上传换取新的有效 media_id → 推送成功 → 登录公众号后台编辑草稿,把封面换成真正的出图。media_id 只需要活过"创建草稿"这 5 分钟即可。
  3. 额外价值:把"检查隧道→加载 env→快照→上传封面→推草稿→去重守卫"六步串成一键脚本,不再手动按顺序敲命令,并内置重复草稿清理。
  4. 踩坑 & 规避(2026-07-03):wxgzh-cli 的 withAccessTokenRetry 对写接口(POST /cgi-bin/draft/add/cgi-bin/material/add_material)做了非幂等重试:access_token 临界失效会 clearTokenCache 后再发一次完整 POST。SOCKS5 代理不稳定时,第一次请求已在微信侧创建草稿但返回被判定为 invalid token 错误 → 第二次 POST 再创建第二份。表象是"脚本只打印一次 draft created,实际出现 2 份甚至 3 份",且两份的 thumb_media_id 不一致(material upload 也被重试了两次,两次上传分配到不同 media_id)。根本防御**:推送前后两次 list draft 做 media_id diff,只保留 create_time 最新的一份,其余用 draft delete 清理。

🏗️ 【技术架构】

⚙️ 【上手实践要点】

  1. 【1/5】检查 127.0.0.1:1080 是否 LISTENING,没起就后台拉起 ssh -D 1080 隧道(等 4 秒二次验证)
  2. 【2/5】加载 wxgzh-cli/.env 到当前进程 env,设置代理;同时记录当前所有草稿的 media_id 快照
  3. 【3/5】上传 placeholder_cover.png 拿 media_id,写入 .wxgzh-cover-id
  4. 【4/5】调用 wxgzh draft add 推送,标题 + 内容 HTML + 新 media_id
  5. 【5/5】去重守卫:重新 list draft,对比快照找出「新出现的 media_id」。如果数量 > 1(说明 wxgzh-cli 重试导致重复),按 create_time 倒序只保留最新的 1 份,其余调用 draft delete 清理,并打印 [WARN] 日志。
  1. 进公众号后台 → 草稿箱 → 找到刚创建的草稿 → 编辑
  2. 替换封面为 DALL·E / SD 出的正式图 → 保存或直接群发

📋 【核心用法】

🔗 【相关链接】

标签: tool, ai