当前位置: 首页 > news >正文

Wechatsync CSDN 草稿同步源码分析:为什么当前只能保存草稿,不能自动公开发布

摘要:本文基于本地 Wechatsync 源码,分析 CSDN 文章同步链路从 CLI、MCP、Extension 到 CSDN adapter 的完整调用路径。结论是:当前源码实现对 CSDN 的能力边界是“保存到草稿箱”,不是“自动公开发布”。如果要做公开发布,需要额外确认 CSDN 公开发布接口、请求字段、签名和风控逻辑。

1. 问题背景

在做 CSDN 自动化发布链路时,一个很关键的问题是:Wechatsync 到底能不能直接把文章公开发布?

这个问题不能只看工具名称里的publishsync。很多内容平台的自动化工具内部都会把“发布”抽象成一个publish()方法,但实际落到平台 API 时,可能只是创建或保存草稿。

本文的分析对象是本地源码:

/Users/jerry/tmpProject/Wechatsync

重点看四个位置:

模块源码文件关注点
CLIpackages/cli/src/index.ts命令参数是否提供公开发布开关
MCP Serverpackages/mcp-server/src/server.tsMCP 工具语义是否是草稿
Extension adapter 调度packages/extension/src/adapters/index.ts是否默认按草稿执行
CSDN adapterpackages/core/src/adapters/platforms/csdn.ts实际调用哪个 CSDN API,请求体是什么

验证状态:来自源码分析,未执行真实 CSDN 网络请求。

2. 先看 CLI:只有 sync,没有公开发布参数

CLI 入口里,CSDN 同步最终走的是sync <file>命令。这个命令暴露的核心参数是:

-p, --platforms <platforms> -t, --title <title> --cover <url> --dry-run

从源码可以看出,它没有提供类似下面这些公开发布开关:

--publish --public --final --release

CLI 在非 dry-run 模式下,会通过 bridge 请求 Extension:

bridge.request('syncArticle',{platforms,article:{title,markdown:processedMarkdown,content:processedHtml,cover,},})

这里传过去的是文章内容和目标平台,没有传“公开发布”状态。

这个信号很重要:如果 CLI 层没有发布状态参数,后面的 adapter 即使支持公开发布,也没有稳定入口让用户显式选择。

3. 再看 MCP:工具描述就是“保存为草稿”

MCP Server 里定义了sync_article工具。这个工具的描述是:

同步文章到指定平台(保存为草稿)

它接收的字段包括:

platforms title content markdown cover

同样没有公开发布相关参数。

调用时,它也只是把文章对象转发给 Extension bridge:

this.bridge.request('syncArticle',{platforms,article:{title,content,markdown,cover,},})

所以从 MCP 侧看,当前工具语义已经明确偏向“草稿同步”,不是“公开发布”。

4. Extension 调度层:默认传draftOnly: true

Extension 的syncToPlatform()是平台 adapter 的统一调度入口。

关键逻辑是:

adapter.publish(platformArticle,{draftOnly:options?.draftOnly??true,onImageProgress:...})

也就是说,在没有额外传入draftOnly的情况下,默认就是true

而批量同步的syncToMultiplePlatforms()调用syncToPlatform()时,传入的 options 是undefined

constresult=awaitsyncToPlatform(platformId,article,undefined,wrappedImageProgress)

因此默认行为可以明确理解为:按草稿同步。

这里还要注意一个细节:即使调度层传了draftOnly: false,也不代表 CSDN 就会公开发布。最终是否公开发布,要看 CSDN adapter 有没有把这个参数转成 CSDN 平台认可的发布接口和发布字段。

5. CSDN adapter:实际调用的是saveArticle

CSDN adapter 的核心方法是publish(article, options)

它做了几件事:

  1. 检查 CSDN 登录态。
  2. 处理 Markdown 图片。
  3. 准备 HTML 内容。
  4. 生成 CSDN API 签名。
  5. 调用 CSDN 保存文章接口。

关键接口路径是:

/blog-console-api/v3/mdeditor/saveArticle

请求地址是:

https://bizapi.csdn.net/blog-console-api/v3/mdeditor/saveArticle

请求体里最关键的字段是:

{title:article.title,markdowncontent:markdown,content:htmlContent,readType:'public',level:0,tags:'',status:2,// 草稿categories:'',type:'original',original_link:'',authorized_status:false,not_auto_saved:'1',source:'pc_mdeditor',cover_images:[],cover_type:1,is_new:1,vote_id:0,resource_id:'',pubStatus:'draft',creator_activity_id:'',}

这里有两个判断点:

status: 2 pubStatus: 'draft'

源码注释也把status: 2标成了“草稿”。

所以从 CSDN adapter 的真实请求体看,当前实现不是公开发布,而是保存草稿。

6. 返回链接也是编辑器草稿地址

保存成功后,adapter 取 CSDN 返回的文章 ID:

constpostId=res.data.id

然后生成链接:

constdraftUrl=`https://editor.csdn.net/md?articleId=${postId}`

这个 URL 是 CSDN Markdown 编辑器地址,不是公开文章访问地址。

公开文章通常应该是博客正文页,而不是编辑器页。因此返回链接也进一步说明:当前同步结果是草稿箱中的编辑态文章。

7.draftOnly只是结果标记,不会改变 CSDN 请求体

CSDN adapter 最后返回结果:

returnthis.createResult(true,{postId:postId,postUrl:draftUrl,draftOnly:options?.draftOnly??true,})

这段代码容易误解。

draftOnly在这里只是返回结果里的标记。它没有参与请求体构造,也没有改变statuspubStatus

也就是说,如果外层强行传入:

{draftOnly:false}

当前 CSDN adapter 仍然会调用saveArticle,仍然会传:

status: 2 pubStatus: draft

最多只是返回结果里的draftOnly标记可能变成 false,但平台侧行为不会因此变成公开发布。

这一点在工程上很关键:不能把返回标记当成平台发布状态。

8. 当前调用链路总结

完整链路可以画成这样:

wechatsync sync article.md -p csdn -> CLI 解析 Markdown/HTML -> bridge.request('syncArticle') -> MCP / Extension bridge 转发文章 -> syncToMultiplePlatforms() -> syncToPlatform() -> CSDNAdapter.publish() -> POST /blog-console-api/v3/mdeditor/saveArticle -> status: 2, pubStatus: draft -> 返回 editor.csdn.net/md?articleId=xxx

从这条链路看,当前 Wechatsync 对 CSDN 的能力边界可以总结为:

能力当前源码是否支持依据
检查 CSDN 登录态支持checkAuth()调用 CSDN base info 接口
上传/处理图片支持adapter 有图片上传和替换逻辑
保存 Markdown 正文支持调用saveArticle
保存为 CSDN 草稿支持status: 2pubStatus: draft
返回草稿编辑器链接支持editor.csdn.net/md?articleId=xxx
自动公开发布当前未看到支持CLI/MCP 无公开发布参数,adapter 请求体固定草稿字段

9. 如果要实现公开发布,需要补什么

不能简单把:

pubStatus: draft

猜成:

pubStatus: publish

也不能只把:

status: 2

改成另一个数字。

原因是 CSDN 的公开发布可能涉及:

  • 独立的发布接口;
  • 分类、标签、封面、原创声明、AI 内容标识等必填字段;
  • 平台审核状态;
  • 验证码、实名、安全验证或风控;
  • 签名路径变化;
  • 成功响应到底表示公开可见,还是进入审核队列。

更稳的实现路径应该是:

10. 对项目封装的落地建议

基于当前源码,项目自己的 CSDN 发布封装应该保持三个原则。

10.1 默认只表述为“同步到草稿箱”

日志、终端输出和交付说明都应该写:

已同步到 CSDN 草稿箱

不要写:

已发布到 CSDN

因为这会误导使用者,以为文章已经公开可见。

10.2 payload 记录期望字段,日志不要误报自动设置

Wechatsync CLI 当前主要传标题和正文。分类、标签、封面、原创声明、AI 内容标识等字段,即使写进项目 payload,也只能作为草稿核对项。

比较稳的日志表达是:

自动传入:title, body 人工核对:category, tags, original, ai_label, cover

10.3 公开发布必须作为实验版能力单独实现

公开发布不是草稿同步的自然延伸。它应该有独立开关、独立日志和独立失败诊断。

建议命令形态类似:

python3 10_csdn_publish/run_csdn_publish.py--filearticle.md--publish

但这个参数只有在抓包验证完成后才能真正启用。

11. 总结

从当前源码看,Wechatsync 的 CSDN 链路已经能完成文章草稿同步,但还不能称为自动公开发布。

核心证据有三个:

  • CLI 和 MCP 没有公开发布参数;
  • Extension 调度默认按draftOnly: true执行;
  • CSDN adapter 调用saveArticle,并传入status: 2pubStatus: 'draft'

所以更稳的工程结论是:当前项目可以把 Wechatsync 用作 CSDN 草稿箱同步通道;如果要做公开发布,需要基于真实 CSDN 发布请求单独实现实验版。

如果你关注 Java 后端、Spring Boot 升级、MCP/Agent 落地和线上问题排查,可以关注我的 CSDN 专栏。

http://www.jsqmd.com/news/913435/

相关文章:

  • 开福区标书制作哪家靠谱
  • MongoDB事务处理实战
  • 别再死记硬背了!用这3个方法,让你的Mac快捷键记忆效率翻倍(附实用工具推荐)
  • AI智能日志异常检测告警平台:告别人工排查,秒级定位线上故障
  • 打破Windows与Linux数据壁垒:5分钟掌握NTFS-3G跨平台文件互通
  • Claude情感响应失真诊断手册(工业级情感熵值测算首次公开)
  • 在HermesAgent项目中自定义Provider接入Taotoken多模型服务
  • 2026最新华为OD机试新系统 机考真题考点分类 + 备考策略
  • 2026年AI服务统一入口横评,主流平台技术硬实力究竟谁领先?
  • 3分钟解锁极域电子教室控制:JiYuTrainer让课堂学习更自由
  • FreeRTOS 队列深度解析:队列的读写
  • 书匠策AI到底是个啥?一个论文科普博主的深度拆解,看完你会回来谢我
  • 01-倒排索引原理-搜索引擎为什么能秒搜
  • 【字节跳动】云南昆明高原恒温算力中枢 极致精细化逐条全拆解
  • Claude用户分群实战指南:从原始日志到高净值客户识别的7步标准化流程
  • NoFences:免费开源的Windows桌面整理终极方案
  • Web4Browser 入门:指纹浏览器如何做多账号环境管理?
  • Java后台一键生成Word报告:模板占位符替换、动态表格扩展、多格式图片嵌入
  • Claude创新方案生成落地难题全解析(2024最新版):87%团队踩中的3类语义坍塌陷阱
  • 人与AI的关系——AI是工具,还是伴侣?
  • 手把手教你在Claude中构建多情景NPV仪表盘:含通胀跳跃、监管突变、技术替代三重压力测试
  • 如何快速批量下载微博相册高清图片:终极免费工具指南
  • 不止于画线:用Vectrosity插件在Unity里制作平滑的游戏技能轨迹与UI指示线
  • MongoDB备份恢复实战
  • 二手车价格预测Python实战工程:带清洗数据、多模型代码、评估报告与详细注释
  • 数学建模竞赛党必备的MATLAB算法工具箱:十大高频算法+详细注释+真题参考解法
  • “摸鱼神器”来袭!系统故障模拟器,让你的摸鱼更有借口
  • 【Android】抖音无水印下载安卓端 轻载 QingZai v1.0.4
  • 055、运动模糊图片如何复原?DeblurGAN 推理加速与退化模拟方案
  • 从“激活弹窗“到“永久安心“:一个普通用户的KMS激活故事