Skip to main content

BlogLoom Publisher Skill —— 公众号(gzh)渠道能力与发布流程

面向对象:需要了解 / 维护 / 扩展 BlogLoom 博客分发 Skill 的开发者与 AI Agent。 渠道实现目录:skills/blogloom-publisher-skill/scripts/channels/gzh/ 渠道 SOP:references/channels/gzh/sop.md 通用契约:references/00-tool-contract.md 流程参照已跑通的 auto-sync-blog 微信公众号实现,并经真实公众号后台验证。

一、渠道概览

关键点:直接访问 cgi-bin/home 会显示「请重新登录」,必须点击首页的「登录」入口 #jumpUrl 才会带 token 进入后台(会话有效则直接进入)。未登录态会下发 wxuin / ua_id 等 Cookie,不能用它们判定登录,否则假阳性。 公众号编辑器不识别 Markdown,正文需先经 md.doocs.org 渲染成带内联样式的 HTML,再复制富文本粘贴回编辑器。

二、能力矩阵

公众号直接发表需管理员扫码/审核、不适合自动回滚,故 test publish 采用 channel.testMode='draft',即 保存草稿 → 立即删除。 渠道可声明 successStatuses: ['SUBMITTED'],核心层按「存在则并入成功态」处理。

三、统一调用

渠道专属参数(从 --xxx 原样透传,由 gzh/index.js 的 augmentPayload 解析,核心 CLI 不感知):

四、SOP 字段映射(Markdown → 公众号)


五、场景流程详解

5.1 gzh checkLogin —— 检测登录态

步骤
  1. enterAdminHome:打开 cgi-bin/home,点击首页「登录」入口 #jumpUrl,进入带 token 的后台首页;
  2. 出现账号名 .weui-desktop_name(如「长路Java」)→ 已登录;
  3. 否则看真正的会话 Cookie slave_sid / slave_user / data_ticket(仅登录后下发);
  4. 都没有 → 未登录。
修复记录:早期用 wxuin 判定导致未登录被误判为已登录;现白名单只认会话 Cookie,且先点 #jumpUrl 才能进入后台。

5.2 gzh login —— 扫码登录

步骤
  1. 打开 cgi-bin/home(有头模式),渠道 prepareLogin 点击 #jumpUrl 进入扫码页;
  2. 用管理员微信扫码完成登录;
  3. 每 2s 轮询登录 Cookie,命中 slave_sid 等即成功(默认最长 10 分钟,可调 --timeout / PUBLISHER_LOGIN_TIMEOUT);
  4. 登录态保存于 ~/.blogloom-publisher/chrome-profile-gzh,后续可 --mode headless 复用。

5.3 gzh publishDraft —— 配置后保存草稿

步骤
  1. 进入后台首页:enterAdminHome 点 #jumpUrl;
  2. 进入编辑器:内容管理 .weui-desktop-menu_create → 草稿箱 .weui-desktop-sub-menu__item a → 「新的创作」button:has-text("新的创作") → 「文章」.weui-desktop-dropdown__list-ele:has-text("文章")(新标签页打开编辑器,自动切换);
  3. 填标题:.title-editor__input .ProseMirror(contenteditable,不是隐藏的 #title textarea),用键盘输入;
  4. 填作者:#js_author_area #author(必填,否则后续原创弹窗无法勾选);
  5. 写正文(md.doocs 样式化):
    • 在 md.doocs.org 新开转换页 → 粘贴 Markdown → 等渲染完成 → 点「复制」(button:has-text("复制"), button:has-text("Copy"))把富文本 HTML 写入剪贴板;
    • 回编辑页粘贴进内容 ProseMirror .rich_media_content .ProseMirror(注意与标题 ProseMirror 区分);
    • 粘贴后微信弹「内容结构检测」确认框 → 点「继续插入」button:has-text("继续插入") 内容才真正写入;
    • 转换失败自动回退为原始 Markdown 写入策略(paste → cdp → keyboard);
  6. 配置区(见 5.5 配置项默认策略):封面 / 描述 / 原创 / 赞赏 / 合集 / 创作来源;
  7. 保存草稿:点「保存为草稿」button:has-text("保存为草稿") → status=DRAFT_SAVED。
返回

5.4 gzh publish —— 发表

在草稿填写 + 配置基础上,点底部 .js_bot_bar .mass_send(文案「发表」):
  1. 群发弹窗 .new_mass_send_dialog:--group-send 未开启则关闭群发开关;
  2. 点弹窗主按钮 .weui-desktop-btn_primary;
  3. 二次确认 .double_check_dialog → 继续发表;
  4. 群发需管理员扫码,返回 status=SUBMITTED(检测到成功提示时 PUBLISHED)。
--dry-run:完成所有填写与配置,但不点最终发表。

5.5 配置项默认策略(preparePublish,保存草稿前自动完成)

原创/赞赏弹窗为微信自定义组件:对自动化合成点击响应不稳定。chooseOrigin 采用「填作者 → 关闭重开重试」策略;enableRewardAndPay 加整体超时(不会卡住主流程)。付费按需求不开启。

5.5.1 渠道级发布配置(conf/gzh.conf)

文章标题/标签/分类/摘要/正文来自博客顶部 SOP 元数据;上表这些渠道级选项来自 conf/gzh.conf,脚本执行时默认读取:
优先级:CLI 参数 > 元数据 extra > conf 默认。加载器见 scripts/lib/channel-conf.js。

5.6 gzh delete —— 删除推文

步骤
  1. 进入内容管理 → 草稿箱;
  2. 按 --title 定位卡片 .weui-desktop-card(或按 data-appid);
  3. 悬停卡片 → 行内「删除」.weui-desktop-link:has-text("删除");
  4. 确认浮层 .weui-desktop-popover 内主按钮 button.weui-desktop-btn_primary:has-text("删除");
  5. 轮询回查该卡片已从列表消失 → DELETED,否则 DELETE_UNVERIFIED。
修复记录:删除不是「…」菜单,而是行内「编辑 / 删除」;确认按钮必须点真正的 button(不是 .weui-desktop-btn_wrp 外层 div)。

5.7 gzh test publish —— 发布草稿 → 删除 链路自测

channel.testMode='draft':保存草稿 → 立即删除该草稿,返回 status=DRAFT_SAVED_AND_DELETED,验证链路可用且不残留内容。

六、选择器对照表(channels/gzh/selectors.js)

md.doocs 转换选择器集中在 channels/gzh/format.js(editable: .cm-content、copyButton)。
站点改版时只改选择器文件,业务流程代码零改动。

七、错误码与分支

退出码:0 成功 / 1 执行异常 / 2 checkLogin 未登录或 login 超时。

八、验证与维护

  • 单测覆盖:checkLogin / prepareLogin / enterEditor / setTitle / setAuthor / setContent(含继续插入) / preparePublish / publish / saveDraft / deleteBlog / augmentPayload;
  • contentStrategy=md-style-paste 表示走通 md.doocs 样式转换;
  • 真机验证结论:标题 / 作者 / 正文样式化 / 封面 / 描述(≤120) / 原创 / 合集 / 创作来源 / 保存草稿 / 删除 / test publish 均已跑通;赞赏为 best-effort,付费不开启。

下一步