当前位置: 首页 > news >正文

从零打造 Trae AI 的 CNBlog 发布 Skill:技术实现与最佳实践

从零打造 Trae AI 的 CNBlog 发布 Skill:技术实现与最佳实践

引言

在 AI 辅助编程的时代,如何让 AI 助手不仅能写代码,还能直接将技术文章发布到博客平台?本文将分享我为 Trae AI 开发的 CNBlog Publisher Skill 的完整实现过程,这是一个无需外部 MCP(Model Context Protocol)依赖、可直接调用博客园 API 的轻量级发布工具。

背景与需求分析

为什么要做这个 Skill?

在日常开发中,我经常使用 Trae AI 来辅助撰写技术博客。但写完文章后,还需要手动复制粘贴到博客园,这个流程比较繁琐。于是我想:能不能让 AI 直接帮我把文章发布出去?

核心需求

  1. 零依赖:不依赖外部 MCP 服务器,减少配置复杂度
  2. 跨项目可用:可以在任何项目中复制使用
  3. 简单易用:支持命令行和代码调用两种方式
  4. 安全可靠:使用访问令牌而非密码进行认证

技术选型

为什么选择 MetaWeblog API?

博客园提供了基于 XML-RPC 的 MetaWeblog API,这是一个标准的博客发布协议,支持以下操作:

  • newPost - 发布新文章
  • editPost - 编辑文章
  • getPost - 获取文章
  • getCategories - 获取分类列表

Python 标准库中的 xmlrpc.client 模块原生支持 XML-RPC 调用,无需安装额外依赖。

核心实现

1. 配置管理

采用硬编码配置的方式,将认证信息直接嵌入脚本:

CONFIG = {"username": "your_username","access_token": "your_access_token","blog_id": "your_blog_id"
}

设计考量

  • 对于个人使用场景,硬编码是最简单直接的方式
  • 访问令牌可以在博客园的「设置」-「其他设置」-「MetaWeblog 访问令牌」中获取
  • 如需多用户支持,可扩展为配置文件或环境变量方式

2. 发布函数实现

def publish_article(title: str, content: str) -> dict:"""发布文章到博客园"""try:# 连接 MetaWeblog APIserver = xmlrpc.client.ServerProxy(f"https://rpc.cnblogs.com/metaweblog/{CONFIG['blog_id']}")# 准备文章数据post = {"title": title,"description": content,"mt_allow_comments": 1,"mt_allow_pings": 1,"post_type": "post","categories": ["[Markdown]"]}# 发布文章post_id = server.metaWeblog.newPost(CONFIG['blog_id'],CONFIG['username'],CONFIG['access_token'],post,True  # 发布为公开文章)return {"success": True,"post_id": post_id,"title": title,"url": f"https://www.cnblogs.com/{CONFIG['username']}/p/{post_id}.html"}except Exception as e:return {"success": False,"error": str(e)}

关键点解析

  1. ServerProxy:Python 的 xmlrpc.client.ServerProxy 会自动处理 XML 序列化和 HTTP 请求
  2. 文章结构description 字段支持 Markdown 格式,博客园会自动渲染
  3. categories:设置为 ["[Markdown]"] 表示使用 Markdown 编辑器
  4. 发布参数:最后一个参数 True 表示直接发布,设为 False 则为草稿

3. 命令行接口

def main():"""命令行入口"""if len(sys.argv) < 3:print("用法: python cnblog_publisher.py <标题> <内容文件>")print('示例: python cnblog_publisher.py "我的文章" article.md')sys.exit(1)title = sys.argv[1]content_file = sys.argv[2]# 读取内容with open(content_file, "r", encoding="utf-8") as f:content = f.read()# 发布result = publish_article(title, content)if result["success"]:print("✅ 发布成功!")print(f"标题: {result['title']}")print(f"URL: {result['url']}")else:print(f"❌ 发布失败: {result['error']}")

三种使用方式

方式一:命令行直接运行(推荐)

python cnblog_publisher.py "文章标题" article.md

方式二:作为 Python 模块导入

from cnblog_publisher import publish_articleresult = publish_article(title="我的文章",content="# 标题\n\n内容"
)if result["success"]:print(f"发布成功: {result['url']}")

方式三:Trae Skill 调用

在 Trae AI 中配置 Skill 后,可以直接对话:

帮我发表这篇博客标题:文章标题内容:
# 文章内容
Markdown 格式的文章内容...

项目结构

cnblog-publisher/
├── SKILL.md              # 技能文档
├── skill.py              # Trae skill 接口
└── cnblog_publisher.py   # 核心发布脚本 ⭐

复制到其他项目

这个 Skill 的设计理念是完全独立,可以轻松复制到任何项目:

# 复制到另一个项目
cp -r .trae/skills/cnblog-publisher /path/to/other/project/# 直接使用
python cnblog-publisher/cnblog_publisher.py "标题" article.md

踩坑记录

1. 访问令牌获取

博客园的访问令牌位置比较隐蔽:
设置其他设置MetaWeblog 访问令牌

2. 文章分类

categories 字段必须包含 [Markdown],否则文章会以富文本编辑器打开,导致 Markdown 格式无法正确渲染。

3. 发布状态

newPost 方法的最后一个布尔参数控制发布状态:

  • True:直接发布
  • False:保存为草稿

扩展思路

这个 Skill 还可以进一步扩展:

  1. 支持编辑文章:实现 editPost 方法
  2. 支持获取文章列表:实现 getRecentPosts 方法
  3. 支持图片上传:结合 newMediaObject 方法实现图床功能
  4. 多平台支持:扩展为支持知乎、简书等其他平台

总结

通过 Python 标准库的 xmlrpc.client 模块,我们实现了一个零依赖、跨项目可用的博客园发布工具。这个 Skill 的核心优势在于:

  • 零外部依赖:仅使用 Python 标准库
  • 配置简单:硬编码认证信息,开箱即用
  • 使用灵活:支持命令行和代码调用
  • 易于迁移:单个文件即可复制使用

希望这个实现能为你的 AI 辅助写作工作流带来便利!

参考链接

  • 博客园 MetaWeblog API 文档
  • Python xmlrpc.client 文档
  • MetaWeblog API 规范

本文由 Trae AI 辅助撰写并直接发布到博客园

http://www.jsqmd.com/news/448090/

相关文章:

  • DASD-4B-Thinking与ROS集成:服务机器人决策系统开发
  • ibus拼音输入法避坑指南:Ubuntu 22.04终端光标消失的3种修复方案
  • 长春全屋定制首选伟伦 大数据见证口碑传奇——深耕匠心铸品牌,靠谱服务暖万家 - 品牌企业推荐师(官方)
  • Equalizer APO零成本优化指南:系统级音频均衡器配置与实战
  • 智能提取视频转PPT:告别低效截图的效率工具
  • 文件分析与安全检测的利器:Detect-It-Easy全面解析
  • AIGlasses_for_navigation效果评测:IoU指标与人工标注结果对比分析报告
  • OpenCore Legacy Patcher:让老旧Mac重获新生的开源解决方案
  • 数学建模竞赛应用:RMBG-2.0在美赛中的实战案例
  • OpenCore Legacy Patcher技术指南:旧款Mac设备的系统升级方案
  • 3种企业级流媒体解决方案:基于SRS-Windows的低延迟视频传输实践
  • 4大核心价值:extract-video-ppt的智能转化方案
  • Python入门:使用AnythingtoRealCharacters2511完成第一个动漫转真人项目
  • MOOTDX:Python量化分析系统的通达信数据接口解决方案
  • QwQ-32B效果实测:ollama环境下131K上下文推理作品分享
  • 开箱即用的深度学习环境:训练环境镜像详细使用教程
  • Step3-VL-10B-Base在Ubuntu系统管理中的应用:自动化运维方案
  • AI智能文档扫描仪技术选型:为何选择OpenCV而非AI模型
  • MusePublic在网络安全领域的异常检测应用
  • 影墨·今颜多模态交互:宣纸UI+朱砂印+墨韵反馈的沉浸式创作
  • 突破性能边界:SMUDebugTool的底层优化技术与实战指南
  • ccmusic-database效果惊艳展示:Top5预测概率分布可视化作品集
  • 霜儿-汉服-造相Z-Turbo助力Vue前端应用:实时汉服设计预览系统
  • AIVideo如何适配多平台?抖音9:16、B站16:9、小红书4:5比例设置教程
  • DriverStore Explorer:系统硬件智能管家的驱动全生命周期管理工具
  • 5步驯服Windows驱动丛林:DriverStore Explorer实战指南
  • Z-Image Atelier 赋能内容创作:自动化生成技术博客文章配图
  • OLED显示花屏?51单片机IIC通信常见问题与解决方案
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4大模型部署优化技巧
  • UNet图像上色模型cv_unet_image-colorization:OpenCV图像对齐技术深度解析