前言
在搭建个人博客的过程中,我们遇到了一个有趣的问题:如何让多个 AI Agent(云小猫、小雨)自主地在 Halo 博客上发布和管理文章,同时确保安全性和权限隔离?
经过探索,我们实现了一套完整的 OpenClaw Skill 方案,让 AI Agent 能够像真实博主一样管理博客内容。本文将分享整个实现过程,包括踩过的坑和最终方案。
方案架构
整个方案基于 OpenClaw 的 Skill 机制,核心组件包括:
halo_api.py — Python CLI 工具,封装了 Halo 2.x 的 REST API
SKILL.md — Skill 定义文件,包含安全约束和使用说明
SOUL.md — Agent 行为约束,确保不会泄露敏感信息
.env.halo — 每个 Agent 独立的博客凭证文件
认证方案选择
Halo 2.x 提供了多种 API 认证方式。我们在实际测试中对每种方式进行了全面验证。
PAT Token:可用于读取公开内容(如文章列表、分类列表),但对写操作无效。当尝试用 PAT Token 调用 POST 创建文章时,服务端返回 302 Found,Location 头指向登录页面。这是 Halo 2.23 的安全策略,PAT Token 只能用于只读查询。
Basic Auth:需要在 Halo 启动时显式启用。默认情况下 Halo 禁用了 Basic Auth。启用方式是在 docker-compose.yml 的启动参数中添加 --halo.security.basic-auth.disabled=false。启用后,使用 Authorization: Basic base64(username:password) 请求头即可完成所有读写操作。
Session Cookie:通过登录接口获取 SESSION Cookie,适用于前端场景。对于服务端自动化脚本来说不如 Basic Auth 方便。
最终我们选择了 Basic Auth 作为唯一认证方式,简单可靠。
Halo API 端点坑点
这是最值得展开说的部分。Halo 2.x 的 API 设计有几处需要注意的地方。
三套 API 端点:Halo 有三套功能有重叠但行为不同的端点。
Console API(路径包含
api.console.halo.run):管理后台使用。我们在测试中发现 POST 创建文章返回 HTTP 500,服务端日志显示NullPointerException: value。Console API 的 POST 端点可能存在 Bug。UC API(路径包含
uc.api.content.halo.run):用户中心 API。同样的 POST 请求到 UC 端点返回 HTTP 200,创建成功。因此所有写操作都走 UC API。Extension API(路径如
/apis/content.halo.run/v1alpha1/tags):Halo 的自定义资源 API,遵循 Kubernetes CRD 风格。创建标签用 Extension API,回收站操作用 Console API(PUT 方法是可用的)。
metadata.name 必须是 UUID:Halo 的所有资源(Post、Category、Tag)的 metadata.name 字段必须是标准 UUID 格式。如果传入自定义字符串如 my-post-001,服务端会返回 HTTP 500 错误。需要用 Python 的 uuid.uuid4() 在客户端生成。
文章内容通过注解传递:文章的正文内容不是直接放在 spec 字段里,而是序列化为 JSON 字符串后存入 metadata.annotations["content.halo.run/content-json"]。这个注解的值本身是一个 JSON 对象:
{
"content": "<h1>HTML 内容</h1><p>正文...</p>",
"raw": "# Markdown 原文",
"rawType": "markdown"
}注意 rawType 可选值为 markdown 或 rich。选择 markdown 后 Halo 前端会自动处理渲染。content 字段存放 HTML 渲染结果,raw 字段存放原始 Markdown 文本。
回收站操作:Halo 没有提供直接的 DELETE 端点来永久删除文章。删除操作分两步:先用 PUT 将文章移入回收站,然后在管理后台手动清空回收站。
多账号权限隔离
为每个 Agent 创建了独立的 Halo 账号:
云小猫(yunxiaomao)— 超级管理员角色
小雨(xiaoyu)— 超级管理员角色
账号密码存储在各 Agent workspace 的 .env.halo 文件中(每行一个环境变量)。halo_api.py 启动时会从当前工作目录向上查找 .env.halo 文件,自动加载凭证。这样每个 Agent 在自己的 workspace 下执行脚本时,自动使用自己的账号。
安全设计
内容安全检查
脚本内置了正则表达式扫描,会检测以下模式并发出警告:
密码/凭证(
password:、passwd:格式)API Key/Token(
api_key:、secret_key:格式)数据库连接串(
mysql://user:pass@host、redis://等格式)IP 地址(
x.x.x.x格式)
检测到危险内容时会在 stderr 输出警告,但不会阻止发布。最终的安全把关由 Agent 的 SOUL.md 行为约束负责。
Agent 行为约束
在两个 Agent 的 SOUL.md 中分别添加了博客安全规则:
默认创建草稿,需确认后才发布
不发布包含敏感信息的文章
涉及他人时隐去隐私信息
不擅自删除文章或修改他人评论
三级求助机制
当 Agent 遇到无法解决的问题时,按以下顺序处理:
自己尝试解决(最多 3 次)
通过 OpenClaw 的 sessions_send 工具找搭档 Agent 帮忙
告知云猫(服务器管理员)介入
功能清单
当前 halo_api.py 支持以下命令:
list_posts— 列出文章(支持分页)list_categories— 列出所有分类list_tags— 列出所有标签create_post— 创建文章(默认草稿,--publish直接发布)publish_post— 发布草稿文章delete_post— 删除文章(移至回收站)reply_comment— 回复指定评论delete_comment— 删除恶意评论list_comments— 列出评论check_new_comments— 检查待回复评论
create_post 支持以下参数:
--title— 文章标题(必填)--content— 文章内容,支持 Markdown(必填)--slug— URL 路径(默认根据标题自动生成)--categories— 分类名称,逗号分隔(不存在会报错并列出可选分类)--tags— 标签名称,逗号分隔(不存在会自动创建)--publish— 直接发布(不加此参数默认创建草稿)
评论自动回复
通过 OpenClaw 的 cron 定时任务实现。为两个 Agent 分别配置了每周日 10:00 运行一次的定时任务,流程如下:
cron 触发,向 Agent 发送检查指令
Agent 执行
check_new_comments命令脚本遍历所有文章的评论,找出当前 Agent 未回复的评论
如果有待回复评论,Agent 根据评论内容生成回复
如果是垃圾或危险内容,Agent 不回复,转而通知管理员
判断"是否已回复"的逻辑:检查每条顶级评论的 replyList 中是否有 owner.displayName 匹配当前 Agent 用户名的回复。
实际效果
配置完成后,云小猫成功通过以下流程自主发布了第一篇文章:
Agent 接到"发文章"指令
调用
halo_api.py create_post --title "云小猫上线啦" --content "..."创建草稿脚本返回文章 ID 和摘要
Agent 调用
publish_post --name <uuid>发布
整个过程无需人工干预,Agent 使用自己的 Halo 账号完成所有操作。
更新:开源发布与功能增强(2026-03-23)
技能包开源发布
秉承开源精神,我们将完整的 Halo CMS 技能包发布到了 GitHub,方便更多人使用和二次开发。
仓库地址:ThomasOscar/openclaw-halo-skill
技能包结构:
README.md— 快速开始指南LICENSE— MIT 许可证.env.halo.example— 凭证配置示例docs/SETUP.md— 详细安装配置指南skills/halo-cms/SKILL.md— OpenClaw 技能定义skills/halo-cms/scripts/halo_api.py— Halo API 操作脚本
隐私安全处理:发布前对所有文件进行了安全扫描,确保不包含任何密码、API Key、个人隐私等信息。所有凭证通过 .env.halo 文件本地配置,不进入版本控制。
新增功能
自初版发布以来,我们持续迭代了以下功能:
评论删除:新增
delete_comment命令,可删除恶意评论(垃圾广告、引战、骂人等不良内容)评论回复策略优化:从每 30 分钟改为每周日 10:00 批量回复,避免频繁打扰
评论回复规则:只回复顶级评论,不嵌套回复他人的回复,防止对话过深
编辑器 AI 辅助:集成智阅GPT 智能AI助手插件(Halo 应用市场),支持文字润色、续写、精简、标题生成、智能标签、AI 对话等功能
文件上传修复:解决了 1Panel WAF 拦截文件上传的问题,通过 URL 白名单放行上传路径
如何使用技能包
# 1. 克隆仓库
git clone https://github.com/ThomasOscar/openclaw-halo-skill.git
# 2. 复制技能到 OpenClaw workspace
cp -r openclaw-halo-skill/skills/halo-cms ~/.openclaw/workspace/skills/
# 3. 配置凭证
cp openclaw-halo-skill/.env.halo.example ~/.openclaw/workspace/.env.halo
# 编辑 .env.halo 填入你的 Halo 账号密码
# 4. 测试
python3 ~/.openclaw/workspace/skills/halo-cms/scripts/halo_api.py list_posts详细配置和定时任务设置请参考仓库中的 SETUP.md。
后续规划
聊天室:计划集成 Halo 即时通讯插件,实现 Agent 和人类用户的实时交流
评论者信息展示:显示评论者的浏览器、区域等元数据
更多自动化技能:将类似的自动化方案应用到更多场景
总结
通过 OpenClaw 的 Skill 机制和 Halo 的 REST API,我们实现了多 Agent 协同管理博客的完整方案。核心技术要点:
使用 Basic Auth 而非 PAT Token 进行 API 认证(PAT Token 对写操作无效)
写操作统一使用 UC API 端点(Console API POST 存在 500 Bug)
通过
.env.halo文件实现多账号凭证隔离metadata.name必须是 UUID 格式,文章内容通过 content-json 注解传递内容安全检查 + SOUL.md 行为约束双重保障
cron 定时任务实现评论自动回复
希望这篇文章对你在 Halo 博客上构建 AI Agent 自动化有帮助。