Discourse-indexnow —— 主题创建或编辑时即时通知 Bing 和 Yandex

:information_source: 概述 在主题创建、编辑、删除以及回复时,自动向 IndexNow 协议提交公开主题的 URL,以便 Bing、Yandex 及其他兼容的搜索引擎能够在几分钟内发现或下架您的内容,而无需等待爬虫抓取。
:hammer_and_wrench: 仓库 github.com/imlotso/discourse-indexnow
:open_book: 安装指南 如何在 Discourse 中安装插件

在我的论坛上还有一篇提供更多背景信息的中文文章:sitetalk.net/t/topic/642

功能特性

  • 自动提交新的公开主题;当首帖或关键主题属性发生变化时,重新提交。
  • 回复时提交:当发布新回复时,自动提交分页 URL(例如 ?page=3),并支持可配置的每 URL 冷却时间以防止滥用。
  • 在主题删除时自动提交主题 URL,以帮助搜索引擎快速检测 404/410 状态并下架内容。
  • 当启用 内容本地化 且爬虫语言查询参数处于激活状态时,自动批量提交本地化主题 URL。使用实际配置的语言参数,而非硬编码。
  • 将规范 URL 和本地化 URL 打包到单个 IndexNow urlList 批量请求中,而不是逐个发送。
  • 历史回填:支持按分类和日期范围筛选,预览匹配数量,并批量提交。对于超过协议 10,000 条限制的批次,会自动进行分块处理。可以从日志标签页中取消正在运行的任务。
  • 手动提交:支持按需逐行提交自定义 URL;外部链接或不符合条件的链接会被自动过滤。
  • 智能速率限制:使用细粒度的滑动窗口算法应用每小时和每日限制。在遇到 429 错误时自动退避(遵循 Retry-After 头)。管理界面包含可视化的配额条,显示当前使用情况以及容量释放的确切时间。
  • 在自动化隐私过滤之上,作为业务层规则排除特定的分类和标签
  • 密钥轮换功能,并带有意外覆盖确认对话框;之前的密钥会立即失效。
  • 管理员验证 /<key>.txt 的公开可访问性。
  • 主题移动、分类可见性变更和标签更新会触发后台作业中的异步重新提交或排除扇出,以防止 UI 阻塞。
  • 丰富的日志条目,包含批次 ID、语言、触发原因、7 天成功/失败趋势图以及分类的失败原因(速率限制、密钥错误、域名不匹配)。
  • 完全异步提交,严格遵守隐私边界:私信、受限分类、未列出/已删除的主题以及需要登录的网站永远不会被提交。
  • 提供英语和简体中文两种语言支持。

设置步骤

  1. 按照上述指南安装插件并重建您的容器。
  2. 前往 管理员 > 插件 > discourse-indexnow
  3. 设置 下,点击 生成密钥(或粘贴现有的 32 位十六进制密钥)。
  4. 勾选 启用 IndexNow 提交
  5. 验证密钥的公开可访问性:
https://your-forum-domain.com/<key>.txt

应返回 HTTP 200 状态码及密钥字符串。管理面板也会显示一个缓存的绿色/红色指示器。
6. (可选)在 日志 标签页中,使用“回填”面板:选择条件,点击 预览,然后点击 提交
7. (可选)使用手动提交框来提交自动化流程之外的单个 URL。

日志页面还包含配额使用条、7 天趋势图和失败分解指标,以便轻松诊断提交问题。

配置设置

设置项 描述
indexnow_enabled 主开关。如果启用了 login_required,则会自动禁用。
indexnow_api_key 用于提交验证的 32 位十六进制密钥。
indexnow_submit_on_create 当创建新的公开主题时自动提交。
indexnow_submit_on_edit 当首帖或主题属性发生变化时自动重新提交。
indexnow_submit_on_reply 当发布新回复时自动提交特定的分页 URL。
indexnow_url_cooldown_minutes 每个 URL 的冷却时间(以分钟为单位),以防止重复提交。
indexnow_excluded_category_ids 即使公开也要排除的分类。
indexnow_excluded_tag_names 即使主题分类符合条件也要排除的标签。
indexnow_hourly_limit 每小时提交的最大 URL 数量(滑动窗口)。
indexnow_daily_limit 每天提交的最大 URL 数量(滑动窗口)。

已知限制

  • Google 目前不参与 IndexNow 协议。
  • 仅当爬虫语言参数处于激活状态且存在本地化内容时,才会提交本地化 URL。
  • 目前支持首帖编辑和新回复的分页,但对中间回复的编辑不会独立触发提交。

这是一个独立的非官方插件——并非由 Discourse 团队维护。它正在我自己的论坛的生产环境中运行,具有 RSpec 测试覆盖率,并在每次推送/PR 时运行 CI。如果您通过 GitHub issue 或在此处回复报告任何 bug 或提出功能请求,我将不胜感激。

7 个赞

太感谢了!我刚刚还在想,我是不是得自己写一个 Indexnow 插件?结果一下就找到了这个!

请问 indexnow_submit_on_edit 是否会在所有导致内容变更的重新烘焙(rebake)操作时,都触发一次 Indexnow 提交?

不是 —— 它仅通过正常的 PostRevisor 流程触发的真实编辑时才会触发,并且只针对主题的首帖(OP)。非 OP 的回复以及由系统触发的重新烘焙(例如图片修复计划任务、管理员批量重新烘焙等)不会触发重新提交,因为这些操作不会经过该插件所挂钩的事件。

我使用这个插件已经一周了,体验很棒。它的表现完全符合我的需求,不过我确实遇到了一些 bug,导致插件在安装后立即失效。

具体来说,我发现与其他使用相同端点的插件存在路由冲突。此外,速率限制也存在一些问题,提交请求可能会触发限制,等待几分钟后再次触发。另外,管理面板的样式表被注入到了公共区域,并且 CSS 类名没有为插件正确添加前缀。

我还添加了一个我非常想要的功能:当话题有回复时能够进行提交。该提交操作针对特定的页码进行,因此无需处理整个话题。对于拥有数百条回复的话题,它只会提交最后一页,这有助于爬虫更快地找到回复并更新话题。

2 个赞

已合并。

感谢你花这么多时间深入分析代码库。滑动窗口的分桶逻辑和后台任务批处理都是扎实的改进。回复触发器也是一个很棒的细节。

我已更新主帖文档,以涵盖你新增的配额条和冷却设置。

非常欣赏这个高质量的 PR 以及详细的说明。:content:

1 个赞