lcoy/cipher

Password-gated [protected] BBCode with real-time unlock for Flarum.

Maintainers

Package info

github.com/Lcoy2004/Flarum-cipher

Type:flarum-extension

pkg:composer/lcoy/cipher

Transparency log

Statistics

Installs: 19

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.5 2026-08-11 01:39 UTC

This package is auto-updated.

Last update: 2026-08-11 01:40:26 UTC


README

为 Flarum 提供密码保护的 [protected] BBCode 标签,支持多种可见条件与实时解锁体验。

  • 密码保护内容,未解锁时仅显示锁定卡片(带流动光效)
  • 可选可见条件:点赞、回复、关注作者、关注本帖、帖子赞数、定时可见
  • 解锁弹窗内实时显示每个条件的满足状态(✓ 已满足 / ✗ 未满足)
  • 实时解锁:时间条件到点自动公开;点赞数达标通过 WebSocket(flarum-pusher)实时刷新
  • 可视化编辑弹窗:发帖工具栏 🔒 按钮内提供勾选式条件、快捷时间下拉,无需手写 BBCode
  • 作者、管理员与版主无需密码,直接查看原始内容

仓库地址

安装

composer require lcoy/cipher

启用扩展后,在后台「扩展」页进入 Cipher 设置,可按需配置。

前端构建(可选)

如果扩展自带的 js/dist 不适用,可从源码重新构建前端:

cd js
npm install
npm run build

基本用法

在帖子内容中使用 [protected] 标签包裹需要隐藏的内容:

[protected password="123456"]只有输入密码才能看到的内容[/protected]
  • password:解锁密码(必填,留空则使用管理员的默认密码)
  • title:锁定卡片上显示的标题(可选)

未解锁的访客看到的是一张锁定卡片,点击「解锁」输入密码后即可查看内容。

使用编辑器按钮

发帖/回复的工具栏有 🔒 按钮,打开可视化编辑弹窗:

  1. 选中要隐藏的文字,点击 🔒
  2. 输入密码(留空则使用管理员默认密码)
  3. 勾选需要的可见条件:点赞、回复、关注作者、关注本帖
  4. 可选设置「帖子赞数达到 N」与「指定时间后可见」(带 1h / 6h / 12h / 1d / 3d 快捷时间下拉)
  5. 点击「确定」即可插入或更新 [protected] 标签

再次点击已存在的 🔒 标签可进入编辑模式,原条件会自动回填。

可见条件

除密码外,还可以为内容附加额外条件。条件之间为「并且」关系,全部满足才能解锁。

条件 示例 说明
点赞 like="1" 必须给本帖点过赞
回复 reply="1" 必须在本讨论中回复过(隐藏/删除的回复不计)
关注作者 follow="1" 必须关注帖子作者(依赖 flarum-tags 或具备 user_followers 表的扩展)
关注本帖 followDiscussion="1" 必须关注本讨论(依赖 flarum-subscriptions,订阅状态为 follow
赞数达标 minlikes="10" 本帖总赞数达到 N 个
定时可见 time="2026-08-09 12:00" 到指定时间后自动公开,无需密码
相对时间 time="+2d" / time="12h" / time="30m" / time="45s" 相对发帖时间的偏移,保存时归一化为绝对时间

说明:follow(关注作者)和 followDiscussion(关注本帖)是两种不同的关注行为。前者跟随作者,后者订阅当前讨论。两者可同时启用。

组合示例:

[protected password="123456" title="福利内容" like="1" reply="1" follow="1" followDiscussion="1" minlikes="3" time="2026-08-09 12:00"]内容[/protected]

该内容要求:当前时间已到 2026-08-09 12:00、已点赞、已回复、已关注作者、已关注本帖、帖子满 3 个赞,再输入密码才可查看。

条件状态实时显示

锁定卡片与解锁弹窗都会列出每条已配置的条件:

  • ✓(绿色)表示当前已满足
  • ✗(红色)表示尚未满足

实时更新

  • minlikes(赞数):启用 flarum-pusher 后,其他人点赞导致赞数达标时,正在浏览的访客会实时看到 ✗ 变为 ✓,无需刷新
  • time(定时):到点后锁定卡片自动变为公开内容,无需刷新或输入密码

实时更新由后端 PushPostUpdate 监听 PostWasLiked / PostWasUnliked 事件,并通过 Pusher 在 public 频道广播 cipherPostUpdate 事件;前端订阅该事件后调用 GET /api/cipher/status 拉取最新条件状态。time 条件则在前端按 data-cipher-target 调度一次性定时器,到点自动重渲染。

实时通道按需启用:未安装 flarum-pusher 时不会触发任何推送,扩展仍可正常工作;同时监听器对失败推送做了静默处理,绝不会因 Pusher 故障而打断原帖请求。

权限说明

  • 帖子作者管理员、拥有 discussion.moderate 权限的版主:直接看到原始内容,不显示锁定卡片
  • 访客是否允许解锁,由后台设置控制(默认允许)

管理员设置

后台「Cipher」设置页:

设置 说明 默认
允许访客解锁 关闭后,只有登录用户才能解锁受保护内容 开启
默认密码 作者将密码留空时使用的密码 cipher

默认密码仅保存在服务端,绝不会下发到前端页面。

安全说明

  • 密码在保存帖子时即被单向哈希(bcrypt),数据库与前端均不出现明文
  • 锁定卡片的渲染结果不会包含密码哈希
  • 解锁接口按「帖子 + IP」限流:10 分钟内最多 10 次失败尝试

常见问题

问:忘记密码了怎么办? 作者或管理员可直接查看内容;管理员可在后台修改默认密码供重新尝试。

问:设置了时间条件,密码还有用吗? 有用。到点前需要密码(且密码正确才解锁);到点后内容自动公开,不再需要密码。

问:likereplyfollowfollowDiscussion 条件在什么时机生效? 解锁接口每次都会重新校验,执行对应操作(点赞 / 回复 / 关注作者 / 关注本帖)后无需重新输入密码逻辑,但需要重新提交解锁;配合 WebSocket 时,条件状态会实时刷新。

问:为什么我满足所有条件却仍提示未满足? 请确认是在当前账号下操作:like / reply / follow / followDiscussion 判断的是当前登录用户自己的行为;minlikes 判断的是帖子总赞数。访客账号无法满足点赞 / 回复 / 关注类条件。

问:followfollowDiscussion 有什么区别? follow 关注的是帖子作者(依赖 user_followers 表,由 flarum-tags 等扩展提供);followDiscussion 关注的是当前讨论(依赖 flarum-subscriptions,订阅状态为 follow)。两者独立判定,可同时启用。

问:followDiscussion 启用了但提示未满足? 请到帖子右上角的订阅菜单确认已选择「关注」(follow)状态。「忽略」或默认不订阅都不会算作已关注。

许可证

AFL-3.0