前言:写技术文章,最后一步总是最烦的

如果你也写技术博客,一定经历过这个流程:文章在本地 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 文章。

它自动完成四件原本要手工做的事:

  1. 图片自动转存——发文前扫描正文里的外链图片,逐张上传到 CSDN 图床并回写链接,彻底绕开防盗链裂图;
  2. Markdown 渲染成 HTML——CSDN 编辑器要求发渲染后的 HTML,内置了一个"够用即可"的渲染器(标题/段落/列表/引用/代码围栏/图片/链接/行内代码/加粗);
  3. 网关 HMAC-SHA256 签名——按 CSDN 编辑器前端同款算法计算 x-ca-* 签名头,带登录 Cookie 发到发文接口;
  4. 发布语义安全——默认发草稿(宁可草稿也不误发布),加 --live 才真正发布,支持 --update 原地更新已发文章。

整个工具用仓颉标准库 + stdx 实现(stdx.crypto 的 HMAC、stdx.encoding.base64、stdx.net.http、JSON 处理),零第三方依赖。

发文数据流

下面这张图是 cspub 的完整数据流——从左到右一条主干,六个环节全部自动化:

cspub 发文数据流

这条流水线里最容易被低估的是第②步"图片转存"。它不是简单下载再上传,中间有几道防线,后面细说。

项目地址与构建

构建三条命令:

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 时自动执行)是这样的:

  1. 扫描正文图片引用(代码围栏内的跳过——示例代码里的 ![]() 不该被当真);
  2. 分流:已经是 CSDN 图床或 data: 的跳过;内网、回环、链路本地等非公网地址直接拦截——防止把本机内网服务当成图源发出去;
  3. 下载:拒绝 30x 重定向(重定向可能把请求带到没检查过的主机),单张上限 12 MiB;
  4. 上传:CSDN 图床签名接口(网关 HMAC + Cookie)→ 华为 OBS multipart 上传 → 回调返回 csdnimg.cn 直链;
  5. 回写:从后往前替换 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 都欢迎。

Logo

一站式 AI 云服务平台

更多推荐