最近我在做一件很具体、也很实用的事:让 OpenClaw 真正参与我的博客维护工作流。
最开始我以为只能像普通用户一样登录 Halo 后台,手动复制标题、粘贴正文、设置摘要、再点发布。后来查 Halo 官方文档时才确认:Halo 本身就提供了 RESTful API 和个人令牌(PAT)机制。这意味着,博客文章并不一定要靠 Web 后台手工操作,完全可以通过程序来管理。
这篇文章不讲空泛概念,重点记录一套已经实测可行的方案:
- 用 Halo 个人令牌完成认证
- 通过 Halo Console API 管理文章
- 使用 OpenClaw 生成并写入文章内容
- 最后完成文章发布
这篇是系列第一篇,先聚焦“文章草稿与发布”。后续再扩展图库、瞬间、归档、友链等能力。
一、目标与最终效果
本文要实现的目标很明确:
- 不登录 Halo Web 后台手动发文
- 由 OpenClaw 负责生成博客内容
- 通过 Halo 官方 API 完成:
- 读取文章列表
- 更新草稿元信息(标题、slug、摘要)
- 更新正文内容
- 正式发布文章
最终效果是:
给 OpenClaw 一个主题,它可以帮你生成文章,并直接写入到 Halo,必要时还能继续完成发布。
二、前置条件
开始之前,需要满足这些条件:
- 你有一个可用的 Halo 2.x 站点
- 你有一个拥有文章管理权限的账号
- 你可以访问 Halo 的 个人中心
/uc - 你可以创建 个人令牌(PAT)
- 你有一台可以运行 OpenClaw 的机器
- 你愿意把 Halo PAT 专门分配给 OpenClaw 使用
我这次实际使用的是:
- 博客地址:
https://blog.timingup.dev - 管理方式:Halo 个人令牌(PAT)
- 执行端:OpenClaw 所在服务器
三、Halo 官方提供了哪些能力
这里先给结论:Halo 官方是支持程序化管理博客的。
根据官方文档:
- Halo 提供 RESTful 风格 API
- Halo 的前端(Console、UC)与后端本身就是通过 API 交互
- 推荐的认证方式是 个人令牌(PAT)
- PAT 可以直接作为
Bearer Token用于访问 Halo API
也就是说,这条路不是“曲线救国”,而是 Halo 官方认可的能力边界。
个人令牌入口
Halo 2.11 之后,个人中心提供了:
- 个人资料
- 通知配置
- 个人令牌
- 我的文章
你可以通过:
- 后台左下角进入个人中心
- 或直接访问:
/uc
然后在 个人令牌 页面创建一个专门给 OpenClaw 用的 PAT。
官方参考文档
建议至少先看这几篇:
- Halo 个人中心文档:<https://docs.halo.run/user-guide/user-center>
- Halo RESTful API 介绍:<https://docs.halo.run/developer-guide/restful-api/introduction>
- Halo 在线 API 文档:<https://api.halo.run>
四、这次实际用到的关键 API
这部分是整篇文章最核心的内容。实际接入时,我主要用到了 Halo Console API 下面这几组接口。
1)读取文章列表
GET /apis/api.console.halo.run/v1alpha1/posts用途:
- 查看已有文章和草稿
- 获取文章
metadata.name - 获取
headSnapshot - 获取当前文章状态(草稿 / 已发布)
2)读取某篇文章当前内容
GET /apis/api.console.halo.run/v1alpha1/posts/{name}/content?snapshotName={snapshotName}用途:
- 读取指定文章在某个 snapshot 下的正文
- 获取当前
raw、content、rawType - 为后续更新内容做准备
3)更新文章元信息
PUT /apis/api.console.halo.run/v1alpha1/posts/{name}用途:
- 更新标题
- 更新 slug
- 更新摘要
- 更新文章配置项
这里要注意:这个接口不是只传一个简单对象,而是要按 PostRequest 结构提交。
4)更新正文内容
PUT /apis/api.console.halo.run/v1alpha1/posts/{name}/content用途:
- 更新 Markdown 原文
- 更新渲染后的 HTML 内容
- 指定
rawType
我这次实际测试里,PUT /content 是整个流程里最关键的一步。只要这一步通了,正文就能真正写进去。
5)发布文章
PUT /apis/api.console.halo.run/v1alpha1/posts/{name}/publish?headSnapshot={headSnapshot}用途:
- 把当前草稿对应的内容版本正式发布出去
这个接口要求带上当前文章的 headSnapshot,否则无法明确发布哪一个内容版本。
五、为什么我最后选择“先更新草稿,再发布”
一开始我以为最直接的方法是:
- 创建一篇新文章
- 一次请求把标题、正文、摘要全写进去
- 然后直接发布
但实际测试后发现,这样并不稳。原因在于 Halo 的文章模型并不是一个简单的“标题 + 正文”表单,而是包含了:
- Post 对象
- Snapshot
headSnapshot/baseSnapshot- Console API 和内容接口的协同
所以更可靠的方案是:
- 先选定一个草稿
- 更新文章元信息
- 再更新正文内容
- 最后发布
这条路径的优点是:
- 接口职责更清晰
- 出错时更容易定位
- 更接近 Halo Console 自己的工作方式
六、OpenClaw 侧的实现思路
这次我在 OpenClaw 工作区里写了一个脚本:
scripts/halo_post.py它负责做这些事:
- 读取 Halo 文章列表
- 选定一个可复用的草稿
- 更新标题、slug、摘要
- 把 Markdown 正文和 HTML 内容一起写入
- 根据参数决定是否发布
这次用到的关键参数
--base-url:Halo 站点地址--title:文章标题--excerpt:文章摘要--content-file:Markdown 正文路径--reuse-post-name:指定使用哪个草稿--publish:是否直接发布
七、实际命令示例
1)更新一个已有草稿,但不发布
HALO_PAT=你的PAT python3 scripts/halo_post.py \
--base-url https://blog.timingup.dev \
--reuse-post-name 文章ID \
--title "你的标题" \
--excerpt "你的摘要" \
--content-file ./post.md2)更新一个已有草稿并直接发布
HALO_PAT=你的PAT python3 scripts/halo_post.py \
--base-url https://blog.timingup.dev \
--reuse-post-name 文章ID \
--title "你的标题" \
--excerpt "你的摘要" \
--content-file ./post.md \
--publish3)我这次实际验证的结果
这篇文章本身,就是通过这套流程发布出来的。
也就是说,这套链路不是“理论可行”,而是:
- 已经实测
- 已经能发
- 已经能从 OpenClaw 侧完成一次真实发布
八、这次踩到的坑
这部分很重要,因为如果你也准备自己接 Halo,很可能会踩到同样的问题。
坑 1:不是所有接口都能直接乱用
Halo 的内容接口、Console 接口、底层内容模型接口,虽然看起来都和文章有关,但用途并不完全一样。
一开始如果直接对底层内容模型硬 POST / PUT,很容易出现:
500 Internal Server Error502 Bad Gateway
这不代表 Halo 不支持,而是说明接口使用方式不对。
坑 2:创建草稿接口的行为不算特别直觉
在这次测试里,POST /apis/api.console.halo.run/v1alpha1/posts 这个接口有一个细节:
- 空 body 比传
{}更稳定
这类行为在官方 schema 里不一定写得非常直观,所以实测很重要。
坑 3:更新标题和更新正文不是一回事
很多系统里,标题和正文常常一起提交。
但在 Halo 这里:
- 标题 / slug / 摘要 走
PUT /posts/{name} - 正文内容 走
PUT /posts/{name}/content
这意味着你必须按顺序理解它,而不是把它当成一个扁平表单接口。
坑 4:不要随便用简陋的 Markdown 转 HTML
如果你要同时写 raw 和 content,渲染层一定要认真处理。
否则就会出现:
- 列表格式不对
- 代码块丢失
- Markdown 语法没正确转成 HTML
- 页面可读性差
这也是这次改稿里专门补的一部分。
九、推荐的实际工作流
如果你想长期让 OpenClaw 参与博客维护,我推荐的顺序是:
第一阶段:自动生成内容
让 OpenClaw 帮你完成:
- 标题
- 摘要
- 正文
- 标签建议
- Markdown 成稿
第二阶段:自动写入草稿
让 OpenClaw 通过 Halo API:
- 更新草稿元信息
- 更新正文
- 返回 permalink 和状态
第三阶段:确认后发布
如果你想保守一点:
- 先看草稿
- 再决定要不要正式发布
如果你已经很信任这条链路,也可以让它一步完成发布。
十、为什么我仍然建议“先草稿、后发布”
虽然这次已经跑通了自动发布,但对大多数博客场景来说,我仍然建议:
优先把 OpenClaw 当成“博客搭子”和“草稿助手”,而不是无脑自动发文机器。
原因很简单:
- 博客内容通常比聊天消息更值得最后审一眼
- 你可能会临时补图、改标题、调语气
- 草稿模式自动化收益已经很高,但风险比直接发布低很多
所以真正适合长期维护的方式,是:
OpenClaw 负责生成与落稿,你负责最后判断和定稿。
十一、后续扩展方向
这篇只解决了 文章草稿与发布。
如果继续往下做,后面还可以扩展:
- 图库管理
- 瞬间(动态)发布
- 分类 / 标签自动化
- 归档维护
- 友链管理
- 发布后自动回传文章 URL
- 图片上传与正文自动插图
也就是说,这篇只是第一步。
十二、参考链接
- Halo 个人中心文档:<https://docs.halo.run/user-guide/user-center>
- Halo RESTful API 介绍:<https://docs.halo.run/developer-guide/restful-api/introduction>
- Halo 在线 API 文档:<https://api.halo.run>
结语
这次折腾之后,我最大的感受是:
OpenClaw 不只是一个聊天助手,也完全可以变成博客工作流的一部分。
当它能帮你写内容、帮你整理结构、帮你自动落草稿、甚至帮你完成发布时,博客维护这件事真的会顺手很多。
如果你也在用 Halo,又正好在折腾 OpenClaw,希望这篇实战记录能帮你少走一点弯路。