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

Wechatsync CSDN 草稿同步源码分析:为什么当前只能保存草稿,不能自动公开发布 摘要本文基于本地 Wechatsync 源码分析 CSDN 文章同步链路从 CLI、MCP、Extension 到 CSDN adapter 的完整调用路径。结论是当前源码实现对 CSDN 的能力边界是“保存到草稿箱”不是“自动公开发布”。如果要做公开发布需要额外确认 CSDN 公开发布接口、请求字段、签名和风控逻辑。1. 问题背景在做 CSDN 自动化发布链路时一个很关键的问题是Wechatsync 到底能不能直接把文章公开发布这个问题不能只看工具名称里的publish或sync。很多内容平台的自动化工具内部都会把“发布”抽象成一个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 --releaseCLI 在非 dry-run 模式下会通过 bridge 请求 Extensionbridge.request(syncArticle,{platforms,article:{title,markdown:processedMarkdown,content:processedHtml,cover,},})这里传过去的是文章内容和目标平台没有传“公开发布”状态。这个信号很重要如果 CLI 层没有发布状态参数后面的 adapter 即使支持公开发布也没有稳定入口让用户显式选择。3. 再看 MCP工具描述就是“保存为草稿”MCP Server 里定义了sync_article工具。这个工具的描述是同步文章到指定平台保存为草稿它接收的字段包括platforms title content markdown cover同样没有公开发布相关参数。调用时它也只是把文章对象转发给 Extension bridgethis.bridge.request(syncArticle,{platforms,article:{title,content,markdown,cover,},})所以从 MCP 侧看当前工具语义已经明确偏向“草稿同步”不是“公开发布”。4. Extension 调度层默认传draftOnly: trueExtension 的syncToPlatform()是平台 adapter 的统一调度入口。关键逻辑是adapter.publish(platformArticle,{draftOnly:options?.draftOnly??true,onImageProgress:...})也就是说在没有额外传入draftOnly的情况下默认就是true。而批量同步的syncToMultiplePlatforms()调用syncToPlatform()时传入的 options 是undefinedconstresultawaitsyncToPlatform(platformId,article,undefined,wrappedImageProgress)因此默认行为可以明确理解为按草稿同步。这里还要注意一个细节即使调度层传了draftOnly: false也不代表 CSDN 就会公开发布。最终是否公开发布要看 CSDN adapter 有没有把这个参数转成 CSDN 平台认可的发布接口和发布字段。5. CSDN adapter实际调用的是saveArticleCSDN adapter 的核心方法是publish(article, options)。它做了几件事检查 CSDN 登录态。处理 Markdown 图片。准备 HTML 内容。生成 CSDN API 签名。调用 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 返回的文章 IDconstpostIdres.data.id然后生成链接constdraftUrlhttps://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在这里只是返回结果里的标记。它没有参与请求体构造也没有改变status或pubStatus。也就是说如果外层强行传入{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?articleIdxxx从这条链路看当前 Wechatsync 对 CSDN 的能力边界可以总结为能力当前源码是否支持依据检查 CSDN 登录态支持checkAuth()调用 CSDN base info 接口上传/处理图片支持adapter 有图片上传和替换逻辑保存 Markdown 正文支持调用saveArticle保存为 CSDN 草稿支持status: 2、pubStatus: draft返回草稿编辑器链接支持editor.csdn.net/md?articleIdxxx自动公开发布当前未看到支持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, cover10.3 公开发布必须作为实验版能力单独实现公开发布不是草稿同步的自然延伸。它应该有独立开关、独立日志和独立失败诊断。建议命令形态类似python3 10_csdn_publish/run_csdn_publish.py--filearticle.md--publish但这个参数只有在抓包验证完成后才能真正启用。11. 总结从当前源码看Wechatsync 的 CSDN 链路已经能完成文章草稿同步但还不能称为自动公开发布。核心证据有三个CLI 和 MCP 没有公开发布参数Extension 调度默认按draftOnly: true执行CSDN adapter 调用saveArticle并传入status: 2、pubStatus: draft。所以更稳的工程结论是当前项目可以把 Wechatsync 用作 CSDN 草稿箱同步通道如果要做公开发布需要基于真实 CSDN 发布请求单独实现实验版。如果你关注 Java 后端、Spring Boot 升级、MCP/Agent 落地和线上问题排查可以关注我的 CSDN 专栏。