Skill 创建笔记:cnblogs(博客园随笔自动发布)

日期:2026-05-12 ~ 2026-05-13
用户:xc | 博客园博客名:文字与文明


一、需求背景与目标

背景

用户希望将本地已完成的 OpenHarmony ArkUI 架构文档(ohosArkUIArchitecture.md)自动发布到博客园(cnblogs),并创建一个可复用的 cnblogs skill,供后续自动化发布/管理博客随笔。

目标

  1. 创建 cnblogs skill,支持通过 API 读取和发布博客随笔
  2. 成功将 ArkUI 架构文档发布到博客园,保留 markdown 原文格式(代码块、ASCII 架构图能正常渲染)
  3. 整理本次创建过程的要点记录

工具与模型

  • 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 转义后变成 &lt;pre&gt; 而失效。正确做法: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.pycnblogs_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 发布三不原则

  1. 不转换:不把 markdown 转成 HTML
  2. 不转义语法字符:* _ ``` 等保持原样,只转义 XML 特殊字符 & < >
  3. 不少分类:必须加 [Markdown] 分类,博客园才进入 markdown 渲染模式

凭据管理原则

  • 永远不硬编码在文件中
  • execute_code sandbox 不继承 ~/.bashrc,凭据读取必须封装在可被 import 的 .py 文件中
  • 发布前做硬编码扫描,确认无真实凭据残留
posted @ 2026-05-13 10:31  getmoon  阅读(32)  评论(0)    收藏  举报