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 —— 检测登录态
步骤
enterAdminHome:打开cgi-bin/home,点击首页「登录」入口#jumpUrl,进入带 token 的后台首页;- 出现账号名
.weui-desktop_name(如「长路Java」)→ 已登录; - 否则看真正的会话 Cookie
slave_sid/slave_user/data_ticket(仅登录后下发); - 都没有 → 未登录。
修复记录:早期用wxuin判定导致未登录被误判为已登录;现白名单只认会话 Cookie,且先点#jumpUrl才能进入后台。
5.2 gzh login —— 扫码登录
步骤
- 打开
cgi-bin/home(有头模式),渠道prepareLogin点击#jumpUrl进入扫码页; - 用管理员微信扫码完成登录;
- 每 2s 轮询登录 Cookie,命中
slave_sid等即成功(默认最长 10 分钟,可调--timeout/PUBLISHER_LOGIN_TIMEOUT); - 登录态保存于
~/.blogloom-publisher/chrome-profile-gzh,后续可--mode headless复用。
5.3 gzh publishDraft —— 配置后保存草稿
步骤
- 进入后台首页:
enterAdminHome点#jumpUrl; - 进入编辑器:内容管理
.weui-desktop-menu_create→ 草稿箱.weui-desktop-sub-menu__item a→ 「新的创作」button:has-text("新的创作")→ 「文章」.weui-desktop-dropdown__list-ele:has-text("文章")(新标签页打开编辑器,自动切换); - 填标题:
.title-editor__input .ProseMirror(contenteditable,不是隐藏的#titletextarea),用键盘输入; - 填作者:
#js_author_area #author(必填,否则后续原创弹窗无法勾选); - 写正文(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);
- 在 md.doocs.org 新开转换页 → 粘贴 Markdown → 等渲染完成 → 点「复制」(
- 配置区(见 5.5 配置项默认策略):封面 / 描述 / 原创 / 赞赏 / 合集 / 创作来源;
- 保存草稿:点「保存为草稿」
button:has-text("保存为草稿")→status=DRAFT_SAVED。
5.4 gzh publish —— 发表
在草稿填写 + 配置基础上,点底部 .js_bot_bar .mass_send(文案「发表」):
- 群发弹窗
.new_mass_send_dialog:--group-send未开启则关闭群发开关; - 点弹窗主按钮
.weui-desktop-btn_primary; - 二次确认
.double_check_dialog→ 继续发表; - 群发需管理员扫码,返回
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 —— 删除推文
步骤
- 进入内容管理 → 草稿箱;
- 按
--title定位卡片.weui-desktop-card(或按data-appid); - 悬停卡片 → 行内「删除」
.weui-desktop-link:has-text("删除"); - 确认浮层
.weui-desktop-popover内主按钮button.weui-desktop-btn_primary:has-text("删除"); - 轮询回查该卡片已从列表消失 →
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,付费不开启。