Skill 创建笔记:cnblogs(博客园随笔自动发布)
日期:2026-05-12 ~ 2026-05-13
用户:xc | 博客园博客名:文字与文明
一、需求背景与目标
背景
用户希望将本地已完成的 OpenHarmony ArkUI 架构文档(ohosArkUIArchitecture.md)自动发布到博客园(cnblogs),并创建一个可复用的 cnblogs skill,供后续自动化发布/管理博客随笔。
目标
- 创建
cnblogsskill,支持通过 API 读取和发布博客随笔 - 成功将 ArkUI 架构文档发布到博客园,保留 markdown 原文格式(代码块、ASCII 架构图能正常渲染)
- 整理本次创建过程的要点记录
工具与模型
- Hermes
- 模型:MiniMax-M2.7
- 主要工具:terminal、execute_code、skill_manage、read_file、patch、write_file、search_files、session_search
- 凭据来源:博客园 access token(博客后台 https://i.cnblogs.com/settings#enableServiceAccess 获取)
二、用户提示词与 Agent 执行记录
2.1 创建 cnblogs skill(第一阶段)
用户提示词 :
阅读博客园 OpenAPI 文档 (https://api.cnblogs.com/help),创建一个名为
cnblogs的 skill,用于自动化发布和修改博客园博客。
Agent 关键动作 :
- 抓取 api.cnblogs.com/help 和 GitHub 仓库 cnblogs/openapi 文档
- 识别出博客园有两套独立 API:OpenAPI(REST)和 MetaWeblog API(XML-RPC)
Agent 关键反馈 :
博客园 OpenAPI 不支持 创建/编辑博客随笔,只能读取。如需发布,必须用浏览器编辑器或第三方工具。
问题 :此时 Agent 误以为 OpenAPI 是博客园唯一的编程接口,忽略了 MetaWeblog API 的存在。
2.2 发现 MetaWeblog API(第二阶段)
用户提示词 :
能否通过 MetaWeblog API 发布博客?
Agent 关键动作 :
- 调研
https://rpc.cnblogs.com/metaweblog/{blogApp}等端点 - 确认博客园支持 MetaWeblog XML-RPC 协议
Agent 关键反馈 :
博客园支持 MetaWeblog API,固定端点为
https://rpc.cnblogs.com/metaweblog/getmoon,认证为 HTTP Basic Auth(博客名 + access token)。
2.3 测试 Markdown 发布(第三阶段)
用户提示词 :
将 ohxArkUIArchitecture.md 发布到博客园,保留 markdown 原文格式。
Agent 关键动作 :
- 最初尝试将 markdown 转换为 HTML 后发送,XML 转义导致
<pre>标签被破坏,代码块和架构图无法渲染 - 后改为直接发送 markdown 原文,只对 XML 特殊字符
& < >做转义,分类加[Markdown]
Agent 关键反馈 :
不要做 markdown → HTML 转换! 转换后的 HTML 裸
<pre>标签经 XML 转义后变成<pre>而失效。正确做法:description 直接填 markdown 原文,分类加[Markdown]。
2.4 发布后端到端验证(第四阶段)
用户提示词 :
删除旧的 HTML 版文章,保留 markdown 版文章。
Agent 关键动作 :
- 用
blogger.deletePost删除旧 HTML 版(postId: 20027965) - 验证新文章(postId: 20028458)markdown 原文渲染正常
Agent 关键反馈 :
markdown 原文直发 +
[Markdown]分类,代码块、ASCII 架构图均能正常渲染。发布成功。
2.5 Skill 维护:凭据去硬编码(第五阶段)
用户提示词 :
检查 skill 里是否有硬编码的凭证。
Agent 关键动作 :
- 全局扫描
grep -rn '文字与文明\|D50059\|4FD7\|753495' skill_dir/ - 发现
publish_post.py和cnblogs_publish.py中 blogId 硬编码为753495 - 发现 SKILL.md 中有内联 Python 凭据读取代码(11 行)
- 将 blogId 改为
get_blog_id()动态获取,从 SKILL.md 中删除内联代码,改为引用references/cnblogs_publish.py
Agent 关键反馈 :
所有凭据读取均通过
load_credentials()动态获取,未发现硬编码。
2.6 删除测试文章
用户提示词 :
文章 id 20027960 和 20025710 是测试时发的,现在删除掉。
Agent 关键动作 :
- 调用
blogger.deletePost分别删除 postId 20027960 和 20025710
Agent 关键反馈 :
两篇测试文章均删除成功。
三、最终产物目录
~/.hermes/skills/cnblogs/
├── SKILL.md # 主文档
│ ├── Overview:双 API 架构(OpenAPI vs MetaWeblog)
│ ├── When to Use:触发条件
│ ├── Authentication:Bearer Token + HTTP Basic Auth
│ ├── Core Workflows:发布/编辑/删除随笔流程
│ ├── Common Pitfalls:XML 转义、struct 注入、deletePost 方法名
│ └── Verification Checklist:发布前检查项
│
├── references/
│ ├── api.md # MetaWeblog XML-RPC 端点详细文档
│ ├── cnblogs_publish.py # Python 封装函数
│ │ ├── load_credentials() # 凭据读取(从 ~/.bashrc 动态读取)
│ │ ├── get_blog_id() # 动态获取 blogId
│ │ ├── publish_markdown_post() # 发布 markdown 原文
│ │ ├── edit_post_title_and_content() # 编辑随笔
│ │ └── delete_post() # 删除随笔
│ └── examples.md # curl / Python 调用模板
│
└── scripts/
├── publish_post.py # 单命令发布脚本
└── list_posts.py # 列出已发布随笔
关键经验
博客园双 API 架构 :
| OpenAPI | MetaWeblog API
---|---|---
协议 | REST / JSON | XML-RPC
端点 | api.cnblogs.com | rpc.cnblogs.com/metaweblog/getmoon
读写 | 只读 | 可写
Markdown 发布三不原则 :
- 不转换:不把 markdown 转成 HTML
- 不转义语法字符:
*_``` 等保持原样,只转义 XML 特殊字符& < > - 不少分类:必须加
[Markdown]分类,博客园才进入 markdown 渲染模式
凭据管理原则 :
- 永远不硬编码在文件中
- execute_code sandbox 不继承 ~/.bashrc,凭据读取必须封装在可被 import 的 .py 文件中
- 发布前做硬编码扫描,确认无真实凭据残留

浙公网安备 33010602011771号