【开源】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 种语言,前台文案和后台设置都翻译好了(简体中文、英文、日文、韩文等)
- 多语言内容防泄露:开启了内容本地化(自动翻译帖子)的站点也做了处理,防止翻译版本绕过权限把隐藏内容泄露出去
使用方法
在编辑器里通过「+」菜单插入,或者直接手写 BBCode:
[reply]
这里写回帖后才能看到的内容,比如下载链接
[/reply]
[login]
这里写登录后就能看到的内容
[/login]
[reply=5]
发满 5 条回复才能看到的内容(需要在后台开启计数语法)
[/reply]前台效果:未满足条件的用户会看到一个占位框(回帖可见是蓝色主题、登录可见是绿色主题),点按钮直接跳回复框或登录页,满足条件后自动显示完整内容。
安全设计
这个插件我最看重的就是安全性,毕竟"假隐藏"(前端藏起来但数据都在)形同虚设。它的安全架构是这么设计的:
- 存储层零原文:Markdown 渲染阶段就把标记内的原文丢弃,数据库里只存一个带指纹的占位容器
<div class="rtv-block">; - 序列化期注入:原文只在接口序列化时按当前用户权限动态注入,没解锁就拿不到,连 HTML 源码里都没有;
- 全出口封堵:raw 导出、搜索索引、邮件通知、修订历史 diff、内容本地化翻译版本这些容易漏的口子都堵上了;
- 无缓存泄露窗口:权限判定实时计算,回复后立即生效,不存在低权限用户命中高权限缓存的问题。
安装方法
使用官方 Docker 部署的 Discourse,编辑 containers/app.yml,在 hooks 的 after_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 用例覆盖权限矩阵和各个泄露面,连续随机顺序运行全绿。
相关教程
- Discourse论坛搭建教程,零基础部署Discourse开源社区论坛网站:https://blog.zeruns.com/archives/919.html
- Discourse AI 配置教程,使用硅基流动API,免费开启AI功能:https://blog.zeruns.com/archives/917.html
项目地址与演示
- GitHub 仓库:https://github.com/zeruns/discourse-reply-to-view
- 演示论坛:https://bbs.eeclub.top/
- 作者博客:https://blog.zeruns.com/
觉得有用的话去 GitHub 点个 Star 支持一下~
总结
这个项目也算是一次"AI 主力开发 + 人负责验收"的实践:需求、边界条件和安全场景我来定,编码、测试用例、文档由 AI 生成,中间还抓出了好几个我自己都没想到的泄露面(raw 导出接口、修订历史 diff、翻译版本),AI 在这类边界条件枚举上确实比人靠谱。有兴趣折腾论坛的可以试试,有问题欢迎在 GitHub 提 issue,或者在评论区留言。
推荐阅读
- 高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html
- 我的世界开服教程:https://blog.zeruns.com/tag/mc/
- Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:https://blog.zeruns.com/archives/939.html
- 维简W96Pro小风扇测评与拆解分析:https://blog.zeruns.com/archives/954.html
- 绿联(Ugreen)DXP4800Pro NAS 开箱评测与拆解:https://blog.zeruns.com/archives/949.html
- 【开源】纯真IP库在线查询系统 - IP地理位置查询、本机IP查询、域名解析:https://blog.zeruns.com/archives/944.html
English Version of the Article: https://blog.zeruns.top/archives/100.html
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »