【开源】Discourse 回帖可见/登录可见插件(discourse-reply-to-view),回复解锁隐藏内容

前言

最近在折腾自己论坛(bbs.eeclub.top)的时候,需要一个”回帖可见”的功能:会员必须回复主题后才能看到帖子里隐藏的资源链接、下载地址等内容,一方面可以刺激论坛活跃度,另一方面也能防止内容被白嫖。

Discourse 本身只有一个 [hide] 标签(对匿名用户隐藏),完全满足不了”回帖解锁”的需求。网上找了一圈没有现成的插件,干脆自己写了一个,取名为 discourse-reply-to-view。整个项目由 AI(GLM)辅助开发,我负责提需求、测试和验收,前后端加测试一共两千多行代码,开发体验相当丝滑。

各家AI大模型API平台推荐与简介:https://blog.zeruns.com/archives/947.html

插件介绍

discourse-reply-to-view 是一个 Discourse 内容保护插件,提供三种 BBCode 标记:

标记作用
[reply]内容[/reply]回帖可见:在本主题回复后才能看到
[​login]内容[​/login]登录可见:注册/登录后就能看到
[reply=N]内容[/reply]回复计数:在本主题发至少 N 条回复后可见(可选开关)

标记里面可以正常嵌套 Markdown,代码块、图片、链接、列表都不受影响;两种标记写在一行里([reply]xxx[/reply])也是支持的。

主要特性

  • 服务端权限判定:隐藏内容的可见性判定 100% 在服务端完成,数据库里的 cooked 字段不保存任何隐藏原文,搜索索引、通知邮件、每日摘要、Onebox 预览、话题列表摘要、RSS、raw 导出接口全部做了防泄露处理,不是前端 CSS 假隐藏
  • 三种解锁模式any_reply(回复任意一次全解锁,默认)、exact_post(必须回复内容所在楼层)、计数模式 [reply=N]
  • 信任等级豁免:可以设置 TL 几以上的用户免回复直接看(默认关闭)
  • 使用权限控制:可以限制只有某个信任等级以上的用户才能使用隐藏标记
  • 编辑器集成:编辑器「+」菜单里有两个插入按钮,桌面端和移动端都有,点一下自动包裹选中的文字
  • 作者所见即所得:作者自己看自己的帖子,隐藏内容会带虚线边框和提示条,方便确认标记位置
  • 回复后自动解锁:用户回复成功后,页面自动局部刷新,不用手动刷新整个页面
  • 防错位注入:每个隐藏块带指纹校验,cook 和序列化两个阶段对不上就整帖降级为占位符,宁可隐藏也不会错位注入
  • 全语言支持:内置 Discourse 支持的全部 49 种语言,前台文案和后台设置都翻译好了(简体中文、英文、日文、韩文等)
  • 多语言内容防泄露:开启了内容本地化(自动翻译帖子)的站点也做了处理,防止翻译版本绕过权限把隐藏内容泄露出去

安全设计

这个插件我最看重的就是安全性,毕竟”假隐藏”(前端藏起来但数据都在)形同虚设。它的安全架构是这么设计的:

  1. 存储层零原文:Markdown 渲染阶段就把标记内的原文丢弃,数据库里只存一个带指纹的占位容器 <div class="rtv-block">
  2. 序列化期注入:原文只在接口序列化时按当前用户权限动态注入,没解锁就拿不到,连 HTML 源码里都没有;
  3. 全出口封堵:raw 导出、搜索索引、邮件通知、修订历史 diff、内容本地化翻译版本这些容易漏的口子都堵上了;
  4. 无缓存泄露窗口:权限判定实时计算,回复后立即生效,不存在低权限用户命中高权限缓存的问题。

安装方法

使用官方 Docker 部署的 Discourse,编辑 containers/app.yml,在 hooksafter_code 里加一行:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/zeruns/discourse-reply-to-view.git

然后重建容器(前端资产要重新编译,必须 rebuild 而不是 restart):

cd /var/discourse
./launcher rebuild app

装完之后在 管理后台 → 设置 → 插件 里可以调整:

  • enable_rtv:插件总开关
  • reply_to_view_mode:回帖解锁模式(任意回复 / 精确楼层)
  • reply_to_view_allow_count:是否启用 [reply=N] 计数语法
  • min_trust_level_to_bypass:信任等级豁免(0 = 不豁免)
  • min_trust_level_to_use:允许使用隐藏标记的最低信任等级

兼容性

在最新版 Discourse(master 分支,2026-09 构建)上开发并验证,依赖新版 markdown-it BBCode 体系,建议 Discourse 3.4 及以上版本使用。测试方面有 79 个 RSpec 用例覆盖权限矩阵和各个泄露面,连续随机顺序运行全绿。

相关教程

项目地址与演示

觉得有用的话去 GitHub 点个 Star 支持一下~

总结

这个项目也算是一次”AI 主力开发 + 人负责验收”的实践:需求、边界条件和安全场景我来定,编码、测试用例、文档由 AI 生成,中间还抓出了好几个我自己都没想到的泄露面(raw 导出接口、修订历史 diff、翻译版本),AI 在这类边界条件枚举上确实比人靠谱。有兴趣折腾论坛的可以试试,有问题欢迎在 GitHub 提 issue,或者在评论区留言。

推荐阅读

English Version of the Article: https://blog.zeruns.top/archives/100.html

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注