我用仓颉写了个 CSDN 发文工具:一条命令,从 Markdown 到正式文章
前言:写技术文章,最后一步总是最烦的
如果你也写技术博客,一定经历过这个流程:文章在本地 Markdown 里写得干干净净,往 CSDN 编辑器里一贴——图片裂了。
原因是 CSDN 对站外图片有防盗链:<img> 直连外部图床时,请求返回 HTTP 200 + 0 字节,页面上只剩一个占位框。于是你得手工把图一张张下载下来,再通过编辑器逐个上传,替换链接,检查排版……文章五分钟写完,图片折腾半小时。
更麻烦的是,CSDN 的编辑器接口并不接受 Markdown 源文——它要求渲染后的 HTML,外加一套阿里云 API 网关风格的请求签名。手动复制粘贴既容易丢格式,也没法脚本化批量发。
作为一个喜欢"把重复劳动变成命令"的人,我用华为仓颉语言写了一个 CLI 工具解决这件事:[cspub](https://atomgit.com/qq8864/cspub)。这篇文章介绍它是什么、怎么用、以及几个值得记的实现要点。
顺带交代背景:cspub 本身是用我的另一个开源项目 [cjh](https://atomgit.com/qq8864/cjh)(仓颉从零实现的终端 Coding Agent)开发出来的——这件事后文细说,它可能是本文最有意思的部分。
介绍:cspub 是什么
cspub 的定位一句话能说清:
一份 Markdown(带 front-matter 元数据),一条命令发成 CSDN 文章。
它自动完成四件原本要手工做的事:
- 图片自动转存——发文前扫描正文里的外链图片,逐张上传到 CSDN 图床并回写链接,彻底绕开防盗链裂图;
- Markdown 渲染成 HTML——CSDN 编辑器要求发渲染后的 HTML,内置了一个"够用即可"的渲染器(标题/段落/列表/引用/代码围栏/图片/链接/行内代码/加粗);
- 网关 HMAC-SHA256 签名——按 CSDN 编辑器前端同款算法计算
x-ca-*签名头,带登录 Cookie 发到发文接口; - 发布语义安全——默认发草稿(宁可草稿也不误发布),加
--live才真正发布,支持--update原地更新已发文章。
整个工具用仓颉标准库 + stdx 实现(stdx.crypto 的 HMAC、stdx.encoding.base64、stdx.net.http、JSON 处理),零第三方依赖。
发文数据流
下面这张图是 cspub 的完整数据流——从左到右一条主干,六个环节全部自动化:

这条流水线里最容易被低估的是第②步"图片转存"。它不是简单下载再上传,中间有几道防线,后面细说。
项目地址与构建
- 项目地址:atomgit.com/qq8864/cspub(MIT License)
- 语言要求:仓颉 1.0.5+(1.2.0 实测通过)
构建三条命令:
export CANGJIE_STDX=<stdx>/dynamic/stdx # 与 cjc 版本配套的 stdx
export PATH=$CANGJIE_HOME/bin:$CANGJIE_HOME/tools/bin:$PATH
cjpm build
# 产物:target/release/bin/main
用法
第一步:配置登录 Cookie(二选一)
推荐环境变量方式(不落盘):
export CSPUB_CSDN_COOKIE='<浏览器复制的 Cookie 整串>'
或者写配置文件 ~/.cspub/config.json(记得 chmod 600):
{"csdnCookie": "..."}
Cookie 的获取方法:浏览器登录 CSDN → F12 打开开发者工具 → 随便找一个 blog.csdn.net 的请求 → 复制请求头里 Cookie 的整串。配好后 cspub whoami 校验配置是否就位。
第二步:发文
日常使用就两条命令:
cspub publish 我的文章.md # 默认发草稿(推荐先看效果)
cspub publish 我的文章.md --live # 确认无误后直接发布
发布成功后回显文章链接与 id,之后修改用 --update 原地更新:
cspub publish 我的文章.md --update 170026615 # 原地更新,不产生新文章
完整子命令一览
cspub check <文章.md> 解析 front-matter + 渲染统计(不联网)
cspub imgs <文章.md> 图片处理预演(rehost / skip / BLOCKED)
cspub html <文章.md> 打印渲染后的 HTML(调试用)
cspub publish <文章.md> 发文(默认草稿,--live 直发,--update 原地更新)
cspub whoami 校验 Cookie 配置
cspub imgs 值得单独一提:发文前先跑一遍,它会列出正文每张图会被如何处理——外链图标 rehost、图床图标 skip、可疑地址标 BLOCKED,所见即所得,不发一个网络请求。
图文处理:防盗链问题是怎么被根治的
CSDN 的图片防盗链有个迷惑性极强的形状:<img> 直连站外图返回 HTTP 200 但响应体 0 字节。状态码看起来一切正常,页面上图就是不出来。所以"检查图片 URL 是否有效"这种常规手段完全失效,唯一的解法是把图变成站内图。
cspub 的转存流水线(publish 时自动执行)是这样的:
- 扫描正文图片引用(代码围栏内的跳过——示例代码里的
![]()不该被当真); - 分流:已经是 CSDN 图床或
data:的跳过;内网、回环、链路本地等非公网地址直接拦截——防止把本机内网服务当成图源发出去; - 下载:拒绝 30x 重定向(重定向可能把请求带到没检查过的主机),单张上限 12 MiB;
- 上传:CSDN 图床签名接口(网关 HMAC + Cookie)→ 华为 OBS multipart 上传 → 回调返回
csdnimg.cn直链; - 回写:从后往前替换 Markdown 里的 URL(从后往前是为了偏移不挪位);best-effort——单张失败保留原链接并提示,不阻断发文。
这里有一个非常值得记的坑,调试时花了不少时间:
图床签名响应里的
customParam.isAudit是 JSON 数字,用只认字符串的jsonStr去取会得到空串;而把空的x:isAudit发给华为 OBS,OBS 居然回 HTTP 200 + 0 字节——表象完全像"请求被网关吞了",实际是回调拿不到字段。解法是写一个jsonScalar:按 JSON 值的 Kind 分别取字符串/数字/布尔字面量。
修完这个坑之后实测:一篇带 2 张外链图的真实文章,转存 2/2 成功,回写后的链接形如 https://i-blog.csdnimg.cn/direct/<hash>.png,发文后正文图片全部正常显示。
顺带一提,本文里这张数据流图,就是走"本地路径直传"的方式发出来的——Markdown 里直接写本机绝对路径,cspub 检测到本地文件后跳过下载环节直接上图床,比外链转存更稳。
一个侧证:cspub 是 cjh 开发的,cjh 已达到实战可用度
先介绍 cjh 是什么
cjh(项目官网)是一个用华为仓颉语言从零实现的终端 Coding Agent——终端里说一句话,Agent 自己规划、调工具、读结果、迭代到任务完成。
它的核心能力:
- Agent 主循环 + 15 个内置工具:读/写文件、精确改写、bash 执行、检索(grep/glob)、联网搜索抓取、任务列表等,覆盖"读代码 → 改代码 → 验证"的完整闭环;
- 多 agent 并行编排:
task工具派发 explore/worker 子代理并行干活,Agents 面板实时观测每个子代理的轮次与 token,边界四键管控; - 全屏 TUI:差分渲染、流式输出、思考过程逐轮回看、10 套主题、审批弹窗,全部手写(termios/Win32 纯 libc FFI,不依赖第三方终端库);
- Web 界面:内置 HTTP + WebSocket 服务与前端 SPA,同一套 Agent 可被浏览器驱动;
- 安全边界:capability 三域权限白名单、插件 SHA256 校验 + SM2 国密签名、web_fetch SSRF 防护。
工程指标也过硬:1150 个单元测试 + 203 个库包测试 + 77 个 PTY 场景全绿;静态单文件分发(Linux 17.1 MB / Windows exe 14.1 MB),零运行时依赖,拷过去就能跑;Releases 提供双平台预编译包,--mock 模式无需 API Key 即可体验。
再说回 cspub 与 cjh 的关系
cspub 的整个开发过程就是在 cjh 里完成的:读 README 理清协议、查 stdx 的 HMAC 用法、写 Markdown 渲染器、调试签名对账、修 OBS 上传的坑——这些活都是"终端里说一句话,Agent 自己读代码、改代码、跑测试、迭代到完成"的日常操作。
换句话说,cspub 这个能用的真实工具,本身就是 cjh 实战能力的一份完整交付物:从需求理清、代码实现到发布上线,整个开发闭环都跑在 cjh 里。工具链自己是自己写的工具造出来的——这个自举场景,大概是 agent 可用度最硬的试金石。
总结
- cspub 解决的问题:CSDN 发文的"最后一步"——图片防盗链、Markdown 要转 HTML、接口要签名,全部自动化成一条命令;
- 怎么用:
publish默认发草稿、--live直发、--update原地更新;发文前imgs预演图片处理、check校验格式; - 技术成色:全程仓颉标准库 + stdx 实现,零第三方依赖,HMAC/HTTP/JSON/Markdown 渲染器全部手写;
- 间接收获:它作为 cjh 开发的真实工具,侧面验证了仓颉终端 Agent 的实战可用度。
如果你也在 CSDN 写作、也受够了手动传图,欢迎到 项目仓库 试试,issue 和 PR 都欢迎。
更多推荐


所有评论(0)