用 AI Agent 给自己造了一个博客发布工具
用 AI Agent 给自己造了一个博客发布工具
为什么要做
我每天在用各种 AI Agent 工具写代码,经常碰到一些值得记录的坑。之前的做法是遇到问题就写个 Markdown,攒几篇手动去博客园后台发布。时间久了发现两个问题:一是写完就忘了发,二是内容里偶尔会不小心带上不该公开的信息——域名、手机号之类的。
想要一个本地工具,把"记录 → 写稿 → 检查 → 发布"串起来,最好能在命令行里完成,不用打开浏览器。
怎么做的
选了 Python 写 CLI,数据存本地 SQLite,发布走博客园的 OpenAPI。工具叫 bloga,整个流程分四步:
第一步:记笔记。 bloga note add --type tech_note 或者 bloga note import ./note.md --type tech_note。支持五种类型——tech_note(技术整理)、daily_work(日常记录)、tooling(工具体验)、learning_summary(学习总结)、incident_review(故障复盘)。其中 incident_review 类型在发布时会被自动拦截,因为故障复盘涉及的细节太多,不适合直接公开。
第二步:写草稿。 有两条路线。一是用 bloga draft generate 调 AI 接口自动生成,系统会按笔记类型选不同的提示词模板。二是自己用 Codex 或手动写好 Markdown,然后 bloga draft import 导入。我平时用第二条路线多,AI 生成的文章要改很多才能用。
第三步:审查。 bloga draft review 会对草稿跑一遍规则检查——格式、敏感信息、内容质量。有 blocker(错误级别)就直接标记为 blocked 不让发布,只有 warning(警告级别)的话标记为 approved。
第四步:发布。 bloga publish run 先跑一遍终审,通过后调博客园 OpenAPI 发布,返回文章链接。发布成功后草稿会归档到 published/ 目录。
博客园的 PAT 存在 macOS Keychain 里(key 是 com.bloga.cnblogs.pat),不写配置文件也不存环境变量。
审查规则:这个功能改了最多次
审查系统是整个工具里改动最频繁的部分。最初只有几条基本规则:标题不能为空、正文不能太短、不能有手机号和邮箱。后来用着用着不断加规则,到现在有 18 条以上。
格式检查——标题为空、正文太短(不到 80 字)、缺少二级标题、第一行不是 # 标题 格式。
敏感信息检查——这一块最严格,全是 blocker 级别。正则匹配手机号(1[3-9]\d{9})、邮箱、身份证号、护照号、营业执照号。还有一条 sensitive_word 规则,加载外部的词汇表文件逐行匹配,可以随时添加不该公开的术语、名称、项目代号。
比较有意思的是证件号规则——我其实从来没在技术文章里写过身份证号,但加上这条几乎不花成本,万一哪天复制粘贴日志的时候带进来了,能拦住。
安全检查——检测文章里是否包含类似凭证的内容,比如密码赋值、密钥赋值这类模式。还有一条检查特定域名后缀的规则,避免把不该公开的地址发出去。
质量检查——这些是后来逐渐加的。
AI 套话检测:维护了一个十几个词的"企业黑话"列表,超过 2 个就警告。还有一条检查机械化小标题结构的——如果出现 4 处以上编号式小标题(像"3.1 / 3.2 / 3.3")这种模式,也会警告。加这两条是因为用 AI 生成的草稿很容易带这种腔调。
事实性检查:如果文章声称是"踩坑记录"、"从零实战"之类的真实经历,但正文里找不到足够的证据(具体日期、文件路径、代码块),就会警告。还有一条检查"经测试"、"实测下来"这种模糊断言的——出现 3 次以上也会警告。
自动化流水线
除了手动用 CLI,我还配了两个 launchd 定时任务:
- 每天 21:30 执行
bloga _internal remind,发一条 macOS 桌面通知提醒我记录今天的工作。 - 每天 22:00 执行
bloga _internal auto-generate,自动查询当天状态为new的笔记,调 AI 接口生成草稿。
另外还配了一个 Codex 自动化任务(~/.codex/automations/daily-blog-draft/automation.toml),用 cron 规则每天 21:30 触发,让 Codex Agent 读取当天笔记、生成草稿、导入系统、跑审查。这个自动化目前是暂停状态——跑过几次发现 AI 生成的草稿质量不够稳定,每篇都要改不少,还不如自己写完再导入来得快。
踩的坑
安全规则误杀代码示例。 写一篇关于额度监控脚本的文章,里面提到了一些技术术语和 HTTP 请求头。结果审查规则把这些当成了真实凭证。改了两轮才通过:先把代码块换成文字描述,再把特定术语加了转义。这个问题现在还没彻底解决,后续可能要让规则跳过反引号包裹的内容。
incident_review 类型一律封禁。 这是故意的设计,但用起来偶尔别扭。有些故障复盘脱敏之后其实可以发,但工具层面直接拦死了。权衡之后觉得宁可严格一点——真要发的话,把类型改成 tech_note 手动导入也不麻烦。
AI 生成草稿的质量问题。 最初用 bloga draft generate 走 AI 接口,生成的文章套话严重,结构死板(总是"现象 → 根因 → 解法 → 总结"四段式)。加了 AI 套话检测规则之后,AI 生成的草稿经常直接被标记为 blocked。后来改成自己写草稿再导入,AI 自动生成的路线基本废弃了。
博客园 PAT 过期不报错。 博客园的 Personal Access Token 有有效期。过期之后调 API 返回的不是 401,而是一个看起来像成功的响应但内容为空。排查了半天才发现是 PAT 过期了,去博客园后台重新生成、更新到 Keychain 就好了。
现在的样子
工具代码大约 1000 行 Python,零第三方运行时依赖(标准库 + macOS security 命令)。SQLite 里 4 张表:record(笔记)、article(草稿)、publish_log(发布日志)、app_setting(配置)。数据全在本地 ~/blog-assistant/ 目录下。
到目前为止用这个工具发了 7 篇文章,审查规则改了五六次。工具本身不复杂,但审查规则的迭代比预想的多——每次碰到一种新的误杀或漏检,就加一两条规则,逐渐变成了现在这个样子。

浙公网安备 33010602011771号