Skip to main content

BlogLoom Publisher Skill —— CSDN 渠道能力与发布流程

面向对象:需要了解 / 维护 / 扩展 BlogLoom 博客分发 Skill 的开发者与 AI Agent。 渠道实现目录:skills/blogloom-publisher-skill/scripts/channels/csdn/ 渠道 SOP:references/channels/csdn/sop.md 通用契约:references/00-tool-contract.md

一、渠道概览

CSDN 是 Skill 的首个对接渠道,主操作走 Playwright(可见浏览器、真实点击/输入/粘贴),CDP 仅作底层增强(复用登录态、Input.insertText 兜底富文本、读取 HttpOnly Cookie 判定登录)。默认有头模式,全程可见。

二、能力矩阵

test publish 用于验证「发布链路可用且不残留内容」。CSDN 支持发布后回滚,故为 PUBLISHED_AND_DELETED。

三、统一调用

统一输出(stdout):
日志走 stderr([publisher] 前缀),便于 Agent 解析。

四、SOP 字段映射(Markdown → CSDN)


五、场景流程详解

5.1 csdn checkLogin —— 检测登录态

步骤
  1. 打开首页 https://www.csdn.net/;
  2. 读取 .toolbar-btn-loginfun 文案:为「登录」则未登录;
  3. 命中「创作」入口且非登录态,或 Cookie 含 UserToken + UserInfo → 已登录;
  4. 同时返回是否存在滑块 .verify-move-block(data.hasSlider)。
返回

5.2 csdn login —— 扫码登录

步骤
  1. 打开 https://passport.csdn.net/login(有头模式);
  2. 用户扫码 / 输入账号完成登录(含可能的滑块验证,脚本不绕过);
  3. 每 2s 轮询登录 Cookie,命中 UserToken / UserInfo 即成功(默认最长 10 分钟);
  4. 登录态保存在独立 profile:~/.blogloom-publisher/chrome-profile-csdn。

5.3 csdn publishDraft —— 保存草稿

步骤
  1. 进入编辑器:首页点「创作」.toolbar-btn-write-new(失败回退直开 editor.csdn.net/md/);
  2. 填标题:先点展示态 .article-bar__title-display(【无标题】)唤出隐藏 input.article-bar__title,清空后写入,回读校验;
  3. 写正文:
    • 点 .editor__inner.markdown-highlighting(<pre contenteditable>);
    • 全选删除默认欢迎内容;
    • 按 paste → cdp → keyboard 策略粘贴(剪贴板粘贴优先,CDP Input.insertText 兜底);
    • 正文含图片时按图片数量估算等待(默认 2s,每满 5 张多 3s),确保图片异步上传完成;
  4. 点顶部「保存草稿」button.btn-save → status=DRAFT_SAVED。
草稿阶段不配置标签/摘要/分类等(后续可在编辑器或发布时补)。

5.4 csdn publish —— 发布

在草稿填写基础上,点「发布文章」button.btn-publish 打开弹窗 .modal__publish-article,依次配置: --dry-run:完成所有填写与弹窗配置,但不点最终发布,返回 status=DRY_RUN 与 publishConfig。 正式发布:点弹窗底部 .modal__button-bar button(发布文章),从成功弹窗 a.success-modal-btn[href*="/article/details/"] 取链接(去查询参数),返回 status=PUBLISHED 与 url。

5.4.1 渠道级发布配置(conf/csdn.conf)

文章的标题/标签/分类/摘要/专栏/封面来自博客顶部 SOP 元数据;下列渠道级选项来自 conf/csdn.conf,脚本执行时默认读取:
优先级:CLI 参数 > 元数据 > conf 默认。加载器见 scripts/lib/channel-conf.js。

5.5 csdn delete —— 删除博客

步骤
  1. 进入内容管理页 https://mp.csdn.net/mp_blog/manage/article;
  2. 按 --id(a[href*="/article/details/<id>"])或 --title 定位文章行 .article-list-item-mp;
  3. 悬停该行 → 行右侧「…」.el_mcm-dropdown .el-dropdown-link;
  4. 下拉点「删除」.el_mcm-dropdown-menu__item;
  5. 二次确认弹窗点「确定」.btn-msg-confirm;
  6. 回查该行已从列表消失 → DELETED,否则 DELETE_UNVERIFIED。
关键:一定要点二次确认弹窗的「确定」,否则不会真正删除。

5.6 csdn test publish —— 发布 → 删除 链路自测

组合 publish + delete:发布成功后立即按 URL/id 删除,返回 PUBLISHED_AND_DELETED,用于验证分发链路可用且不残留内容。

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

站点改版时只改本文件,业务流程代码零改动。

七、错误码与分支

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

八、验证与维护

  • --dry-run 返回 contentStrategy(生效的写入策略)、contentLength 与 publishConfig,据此判断各字段是否写入成功;
  • test publish 验证完整链路且不留残留内容;
  • 单测覆盖:checkLogin / enterEditor / setTitle / setContent / preparePublish / publish / saveDraft / deleteBlog。

下一步