Spam Blocker
Spam Blocker 是一个集中式的垃圾内容检测服务,它会评估传入的发布请求并给出风险分数。它由两个软件包组成:
@bitsocial/spam-blocker-server—— 承载评估接口和挑战接口的 HTTP 服务器。@bitsocial/spam-blocker-challenge—— 一个轻量的客户端包,社区集成它来把发布内容送去评估。
源代码: github.com/bitsocialnet/spam-blocker
风险评分的工作方式
每一条提交到 /evaluate 端点的发布内容都会得到一个数值风险分数。这个分数是多个信号的加权组合:
| 信号 | 说明 |
|---|---|
| 账户年龄 | 越新的账户,风险分数越高。 |
| Karma | 在社区中积累的 karma 会降低风险。 |
| 作者声誉 | 由后台网络索引器收集的声誉数据。 |
| 内容分析 | 文本层面的启发式判断(链接密度、已知的垃圾内容模式等)。 |
| 发布速率 | 同一作者短时间内连续发帖会提高风险。 |
| IP 情报 | 国家级地理定位和威胁情报库查询。只存储国家代码——原始 IP 地址绝不会提供给社区。 |
分级阈值
风险分数会映射到四个可配置的等级之一,由它决定接下来会发生什么:
- 自动通过 —— 分数足够低,发布内容无需任何挑战即被接受。
- 仅需 OAuth —— 作者必须完成一次 OAuth 验证才能继续。
- OAuth 加额外验证 —— 仅有 OAuth 还不够,还需要额外的验证(例如 CAPTCHA)。
- 自动拒绝 —— 分数过高,发布内容被直接拒绝。
所有阈值都可以按社区分别配置。
挑战流程
当一条发布内容落到需要验证的等级时,挑战流程就会启动:
- 系统首先提示作者通过 OAuth 进行认证(GitHub、Google、Twitter 以及其他受支持的提供方)。
- 如果仅有 OAuth 还不够(第 3 级),则会出现由 Cloudflare Turnstile 驱动的 CAPTCHA 兜底验证。
- OAuth 身份只用于验证——绝不会共享给社区或其他用户。
API 端点
POST /evaluate
提交一条发布内容做风险评估。返回计算出的风险分数以及所需的挑战等级。
POST /challenge/verify
提交已完成挑战的结果(OAuth 令牌、CAPTCHA 答案,或两者)以供验证。
GET /iframe/:sessionId
返回一个可嵌入的 HTML 页面,为对应会话渲染相应的挑战界面。
速率限制
速率限制会根据作者的账户年龄和声誉动态调整。较新或声誉较低的作者会受到更严格的限制,而老资格的作者则享有更宽松的额度。这样既能挡住垃圾内容洪流,又不会惩罚可信的参与者。
后台网络索引器
服务器会运行一个后台索引器,持续爬取网络以构建和维护作者声誉数据。这些数据直接进入风险评分流水线,使系统能够跨社区识别出反复出现的善意参与者。
隐私
Spam Blocker 在设计时就考虑了隐私:
- OAuth 身份仅用于挑战验证,绝不会披露给社区。
- IP 地址只解析到国家代码;原始 IP 不会被存储或共享。
数据库
服务器使用 SQLite(通过 better-sqlite3)在本地持久化声誉数据、会话状态和配置。