给 Halo SEO 插件接入 IndexNow:我如何把自动提交做成可恢复的持久任务
一篇文章公开后,真正麻烦的往往不是生成内容,而是还要记得补搜索描述、检查分享元数据,再把公开地址提交给搜索服务。这个流程一旦交给自动化处理,问题也会随之变得具体:重复提交怎么办,外部接口失败会不会影响发文,凭据放在哪里,文章地址变化后旧状态还算不算成功?
我用 AI 开发工具协助梳理需求、拆分任务和检查改动,最后把 Halo 2.25+ 的轻量 SEO 插件推进到 0.3.0。这个版本没有把正文复制到搜索服务,而是围绕公开文章 URL 建立了一套可追踪、可人工恢复的 IndexNow 提交流程。
先划清自动化的边界:Halo 仍是唯一内容源
我先把需求拆成两类:一类是插件自己维护的 SEO 信息,另一类是向外部服务发送公开地址。两者不能混在一起处理。
Halo 始终是文章的唯一内容源。插件可以自动维护搜索描述和分享元数据,但不会把文章正文复制给搜索服务。IndexNow 提交的对象也限定为已经公开的文章 URL,避免草稿、私密内容或尚未对外可访问的地址被发送出去。
自动提交默认关闭。开启后只补偿最近 24 小时的新文章,历史文章需要人工确认。这是一个刻意保守的选择:安装升级后,不能因为打开一个开关,就把站内历史文章一次性批量外发。
在拆解需求时,我让 AI 先把功能描述转换成边界条件,再逐项检查哪些条件能由代码保证,哪些仍需要管理员判断。这样做比直接要求生成一个接口调用更有用,因为真正的风险不在 HTTP 请求本身,而在请求前后状态是否可信。
用持久化任务处理重复提交和中断
最关键的设计调整,是没有把提交动作做成文章发布流程里的同步调用,而是新增了持久化搜索提交任务。
任务按文章标识和公开地址实现幂等防重,并记录等待、执行、成功、重试、失败、结果未知和取消等状态。这样,提交是否发生过、是否还可以重试,不再依赖一次页面请求是否顺利结束。
外部请求前先持久化执行状态。若进程在请求过程中异常中断,任务会被标记为结果未知,而不是直接当成失败再发一次。这个状态看起来没有失败那么明确,却更符合实际:系统无法确认外部服务究竟有没有收到请求,就不应该擅自把重发当成安全操作。
自动重试也设置了限次和退避。管理员可以在文章级别查看提交状态,并在需要时手动提交或恢复处理。这里的重点不是让系统无限坚持,而是让每一次重试都有记录、有边界,也能被人看懂。
三处返工,修正了状态与操作之间的错位
开发过程中,AI 生成的初版方案并没有直接采用。我把任务状态、文章 permalink 和 Console 提示放在一起检查,发现了三处必须返工的地方。
第一,等待重试的任务原本无法被管理员立即重试。自动重试和人工操作不是一回事,再次点击应该明确表达管理员要求重新执行,而不是继续等待下一次调度。修正后,人工重试拥有清晰的触发语义。
第二,文章公开地址变化后,旧 URL 的成功状态不能沿用。任务现在按文章标识与当前 permalink 精确匹配。文章还是同一篇,但 URL 已经不同,就必须视为新的提交对象,不能用旧地址的成功记录掩盖当前地址尚未提交的事实。
第三,失败或等待重试时,界面不能继续显示成功提示。Console 现在根据任务结果显示成功、警告或错误反馈,并提供文章级提交状态、配置入口和手动提交操作。
这些修改没有增加很多表面功能,却决定了插件是否能被管理员信任。状态记录如果和实际操作不一致,自动化越积极,排查起来越困难。
凭据安全优先于多接一个接口
IndexNow 接入使用官方 HTTPS 接口,并加入公开密钥校验。插件还提供单篇手动验证,先让管理员用一篇公开文章确认配置和外部链路,再考虑是否打开自动提交。
百度普通收录 API 则暂缓接入。材料中显示,官方当前仍展示 HTTP Token 接口,同时 HTTPS 入口存在证书无法验证的问题。为了追求接口数量而通过明文传输凭据,不符合这个插件设定的安全边界,所以我选择不把它放进 0.3.0。
这也是我在使用 AI 开发工具时反复强调的一点:它可以帮助比较接口、补齐调用结构和检查遗漏,但不能替代安全判断。遇到凭据传输、公开范围和外部服务故障这些问题,最终需要先确定不能接受的风险,再决定哪些功能暂缓。
用构建和静态检查确认交付边界
代码完成后,我没有只看 Console 页面是否能显示按钮,而是按插件交付物逐层核对。
干净构建成功,并生成了 0.3.0 插件 JAR。29 个 Java 测试全部通过,没有失败、错误或跳过。Vue 类型检查和生产前端构建也通过。
随后检查 JAR 内容,确认其中包含提交任务、IndexNow 客户端、公开密钥端点、Console 前端、设置和权限资源。安全扫描没有发现明文服务密钥、调试输出或非 HTTPS IndexNow 地址。
这些结果能证明构建产物和自动化检查通过,但不能替代正式站点验证。本地 Docker 没有运行,因此还没有完成 Halo 开发实例中的实际页面截图和真实文章手动提交。下一步需要在正式站点安装升级包、配置 IndexNow 密钥,先用一篇公开文章完成真实验证,再决定是否开启自动提交。
到这里,0.3.0 解决的是一条可审计的外部提交路径,而不是承诺搜索引擎一定收录文章。对一个 Halo 插件来说,先把公开范围、任务状态、重试边界和凭据安全交代清楚,再扩大自动化范围,才是更稳妥的推进方式。