跳到主要内容

Spam Blocker

Spam Blocker 是一个集中式的垃圾内容检测服务,它会评估传入的发布请求并给出风险分数。它由两个软件包组成:

  • @bitsocial/spam-blocker-server —— 承载评估接口和挑战接口的 HTTP 服务器。
  • @bitsocial/spam-blocker-challenge —— 一个轻量的客户端包,社区集成它来把发布内容送去评估。

源代码: github.com/bitsocialnet/spam-blocker

风险评分的工作方式

每一条提交到 /evaluate 端点的发布内容都会得到一个数值风险分数。这个分数是多个信号的加权组合:

信号说明
账户年龄越新的账户,风险分数越高。
Karma在社区中积累的 karma 会降低风险。
作者声誉由后台网络索引器收集的声誉数据。
内容分析文本层面的启发式判断(链接密度、已知的垃圾内容模式等)。
发布速率同一作者短时间内连续发帖会提高风险。
IP 情报国家级地理定位和威胁情报库查询。只存储国家代码——原始 IP 地址绝不会提供给社区。

分级阈值

风险分数会映射到四个可配置的等级之一,由它决定接下来会发生什么:

  1. 自动通过 —— 分数足够低,发布内容无需任何挑战即被接受。
  2. 仅需 OAuth —— 作者必须完成一次 OAuth 验证才能继续。
  3. OAuth 加额外验证 —— 仅有 OAuth 还不够,还需要额外的验证(例如 CAPTCHA)。
  4. 自动拒绝 —— 分数过高,发布内容被直接拒绝。

所有阈值都可以按社区分别配置。

挑战流程

当一条发布内容落到需要验证的等级时,挑战流程就会启动:

  1. 系统首先提示作者通过 OAuth 进行认证(GitHub、Google、Twitter 以及其他受支持的提供方)。
  2. 如果仅有 OAuth 还不够(第 3 级),则会出现由 Cloudflare Turnstile 驱动的 CAPTCHA 兜底验证
  3. OAuth 身份只用于验证——绝不会共享给社区或其他用户。

API 端点

POST /evaluate

提交一条发布内容做风险评估。返回计算出的风险分数以及所需的挑战等级。

POST /challenge/verify

提交已完成挑战的结果(OAuth 令牌、CAPTCHA 答案,或两者)以供验证。

GET /iframe/:sessionId

返回一个可嵌入的 HTML 页面,为对应会话渲染相应的挑战界面。

速率限制

速率限制会根据作者的账户年龄和声誉动态调整。较新或声誉较低的作者会受到更严格的限制,而老资格的作者则享有更宽松的额度。这样既能挡住垃圾内容洪流,又不会惩罚可信的参与者。

后台网络索引器

服务器会运行一个后台索引器,持续爬取网络以构建和维护作者声誉数据。这些数据直接进入风险评分流水线,使系统能够跨社区识别出反复出现的善意参与者。

隐私

Spam Blocker 在设计时就考虑了隐私:

  • OAuth 身份仅用于挑战验证,绝不会披露给社区。
  • IP 地址只解析到国家代码;原始 IP 不会被存储或共享。

数据库

服务器使用 SQLite(通过 better-sqlite3)在本地持久化声誉数据、会话状态和配置。