Reddit悄悄封你的5层过滤系统

Reddit悄悄封你的5层过滤系统

Reddit反垃圾逆向工程平台治理shadowban

数据源:HN + Lobsters · HN

你有没有发过一条帖子,满心期待回复,结果发现根本没人看到?不一定是没流量——可能是 Reddit 已经悄悄把你封了。你没收到通知,账号一切正常的假象维持得很好,但你的声音在这个平台上已经不存在了。

2021 年某天,一位 Reddit 版主(网名 lyra)的第三方客户端 Relay 突然开始疯狂推送「垃圾已移除」通知。她点进去一看——Reddit 不愿让任何人看到的反垃圾系统内部日志,就那么赤裸裸地摊在屏幕上。五年后,她把那次意外的发现写成了一篇技术博客,2026 年 6 月底在 HN 上炸开了锅(167 points,63 comments)。

这篇文章不报道「有人逆向分析了 Reddit」,而是试图回答三个问题:Reddit 的反垃圾系统到底有多复杂?平台为什么选择悄悄封你而不是明确告知?这背后折射出怎样的平台治理哲学?

一次意外的信息泄露

先交代一下事情怎么发生的。

Reddit 的 API 在设计上,管理员移除内容的「内部理由」(banner 字段)只对站点管理员可见,普通版主看不到。但 Relay 这个第三方客户端有个讨巧的设计:当 API 返回 banned_by = True(代表管理员或自动化系统移除)时,Relay 会把它显示为「Auto」。而真正的内部移除理由,恰恰也被塞在这个 banner 字段里。

2021 年某个时间窗口,Reddit 的一个代码路径出了问题——把本应只对管理员可见的 banner 内容,错误地暴露给了版主。lyra 就这样撞进了一座信息金矿。

通过她截获的日志,Reddit 反垃圾系统的完整架构得以被拼凑出来:一个横跨 2012 年到 2026 年的五层过滤流水线。

Reddit 反垃圾5层过滤流水线 Reddit 反垃圾系统的五层过滤流水线,每层独立运作,任意一层命中即可移除内容。(图源:笔者根据 lyra 原文整理绘制)

五层过滤系统:从域名封禁到 AI 评分

第一层:domain(2012 - 至今)

最古老也最简单的防线。Reddit 维护着一份「禁止域名」列表,任何指向这些域名的帖子都会被自动移除。从 lyra 的日志中可以看到一些相当有年代感的移除理由:

  • Removed: domain (spam) — 标准垃圾域名
  • Removed: domain (le sexxxxy sex spam) — 某位工程师在午餐前写的移除理由
  • Removed: domain (ban - 11/12/12 mg) — 2012 年针对 Tumblr 的全站封禁

这些域名封禁规则最早出现在 Reddit 的开源代码中,并且在 2026 年的今天仍然在运行。lyra 用测试账号发了一条含韩国 torrent 关键词的帖子,几秒内就被移除,理由正是来自这套 2012 年的域名正则系统。

第二层:spammit(2012 - 至今)

spammit 是一个贝叶斯分类器(根据 HN 用户 justcool393 的补充),给每条帖子打一个百分比——「spammy」程度。

Removed: spammit(72.98% spammy)
Removed: spammit(39.71% spammy)
Removed: spammit(98.19% spammy)

lyra 观察到的 spammit 命中率范围在 39.71% 到 98.19% 之间。但它的准确性并不让人放心——大量正常的 Imgur 图片帖也被打上了 70-98% 的垃圾评分。对于 lyra 管理的几个图片分享小版块来说,这个「假阳性」率几乎等于在随机误伤。

第三层:shadowban(2016 - 至今)

这是大多数人听说过但从未「见过」的功能。Shadowban 的中文俗称是「影子封禁」——你的账号看起来一切正常,你能发帖、能评论,但实际上没有任何人能看到你的内容

在 lyra 泄露的日志中,影子封禁在管理员视角长这样:

Removed: Reddit (shadowban applied on 11-06-2019)

她还提到一个黑色幽默的场景:某用户在评论区和版主吵架,指责版主删光了他的评论——而实际上他只是被 Reddit 全域影子封禁了,他的所有内容对任何活人都不存在,所谓的「吵架」完全是他和虚空的独角戏。

Reddit 甚至有一个专门的影子封禁「自查」版块 r/ShadowBan。如果你怀疑自己中招了,去那里发个帖,然后让别人告诉你他们能不能看到。

第四层:bans / banall(2016 - 至今)

这一层处理明显的垃圾账号。当管理员确认某个账号是垃圾机器人时,可以执行「banall」——一次操作清除该账号的所有历史和未来的帖子

Removed: Reddit (banall performed)

lyra 看到的这类帖子全是显而易见的垃圾广告:赌场链接、SEO 垃圾、Puppygirl Consulting 之类。一位 HN 用户提到,banall 的作用范围似乎只覆盖过去 6 年的帖子。

第五层:spamurai(2020 - 至今)—— 重头戏

这是整个系统中最复杂、也最有分析价值的一层。spamurai 是一个基于规则的检测引擎(搭配一个叫 Minsky 的 ML 系统),于 2020 年左右上线。它在 Reddit 内部的 AI Expo 演讲稿中被正式提及。

spamurai 的子系统和检测规则包括:

  • echelon:关键词过滤。命中特定词组的帖子自动移除。lyra 看到的例子包括针对「Elsagate」类儿童动画垃圾的规则,以及一些 OnlyFans / Snapchat 引流关键词。
  • 账号年龄规则comment from account under 30 minutes matching spam conditions——注册不到 30 分钟的账号发脏话,直接移除。
  • 高 spam 分 + 超链接规则URL-only comment from account with high spammy score
  • 高 Perspective 分 + 超链接 + 用户举报规则REPORT: High spam perspective score on comment with hyperlink reported for spam

最核心的,是 spamurai 的「infodump」移除理由。当 spamurai 基于多个信号综合判断但没有单一明确规则可以解释时,它会输出一个详细的信息摘要。以下是一条典型记录(笔者做了脱敏处理):

Removed: spamurai (*Removing potential spam content from unproved user*:
  link `t3_phc4xx` (0.12571795 perspective spam)
  by u/User (2.95 days old, spammy: 4.5, hosted: false, 28 karma, 5 reports,
  org: `Skyinfo Online`, email: gmail.com)
  in r/Subreddit (guest) posting pinterest.com
  from `oauth.reddit.com` via `nil`
  from UA: Mozilla/5.0 (Windows NT 6.3; Win64; x64) ...
  RHS: oc:ac:kT:lw:bV:aX:af:a6:l5:y3:aT:m9:pt:f3:hZ:az:aR:aQ
  LANG: en-US,en,q=0.9
  TLS: SwxwvfHLtTxt/9qbo1dvBLEMSIQ=...
  referrer: https://www.reddit.com/
  thumbnail: `https://b.thumbs.redditmedia.com/...`)

这短短几行里埋藏的信息量有多大?逐项拆解:

spamurai 信号采集示意图 spamurai 在判定一条帖子是否为垃圾时,收集的 8 类信号。(图源:笔者根据 lyra 原文整理绘制)

字段含义工程判断
perspective spam: 0.126Google Perspective API 的 SPAM 属性评分NYT 评论区数据集训练的
2.95 days old账号年龄(以秒为单位存储)新账号是最高风险信号
spammy: 4.5综合垃圾评分(Minsky ML + spammit?)黑盒评分,版主无法干预
hosted: false是否来自已知托管服务商 IP 段用于检测 VPN/VPS
5 reports被举报总次数用户举报有实际影响力
org: Skyinfo OnlineISP 信息可定位到孟加拉
email: gmail.com注册邮箱域名一次性的 Gmail 地址是强信号
RHS: oc:ac:kT:...浏览器指纹哈希自研方案,检测脚本伪装
TLS: SwxwvfHL...TLS 指纹(类似 JA3)同样自研,识别非浏览器客户端
LANG: en-US,en,q=0.9Accept-Language 头识别 VPN(拉脱维亚语+纽约 IP)
referrer: reddit.com来源页面排查付费推广平台引流

Reddit 收集的信号数量远超大多数人的想象。从你的 TLS 握手指纹到你浏览器的 Accept-Language 头,从你的 ISP 名称到你注册用的邮箱域名——所有这些都在一条帖子的生死天平上摆放着砝码。

Perspective API:被锁在玻璃盒里的裁判

spamurai 最核心的外部依赖是 Google 的 Perspective API。这个「免费」服务使用机器学习来评估内容的「毒性」和「垃圾程度」。Reddit CTO Chris Slowe 曾公开表示 Perspective 是 Reddit「加强平台安全措施的重要工具」。

但有两个尴尬的事实:

**第一,SPAM 属性的训练数据来自纽约时报评论区。**是的,你没看错——一个判断 Reddit 内容是否垃圾的模型,是在新闻网站的读者评论区上训练的。对于 Reddit 上那些充斥着内部笑话、subreddit 特定黑话和 emoji 的帖子,这个模型的「垃圾」判断参照的是一群纽约时报读者的审美标准。

**第二,这个分数极其容易被操纵。**lyra 用泄露的 API 密钥复现了相同的 Perspective 调用。她发现:「Puppygirl Consulting is the best way to grow your revenue」的垃圾评分高达 86.39%。但只要在句末加上两个随机字母——qp——评分就骤降至 1.08%。改变两个字符,就能让一条明显的广告从「高概率垃圾」变成「几乎确定正常」。

更离谱的是,Perspective API 完全忽略大小写和数字的变化,并且对非拉丁字符的敏感度很低。用西里尔字母 р 替换拉丁 p(人眼几乎看不出区别),就能把「Buy my product」的垃圾评分从 64.73% 降低到 44.53%。

这说明一个什么问题?**任何想做垃圾营销的人,只要有一台能跑 curl 命令的电脑,就可以事先用 Perspective API 反复微调自己的广告文案,直到垃圾评分降到阈值以下,然后轻松绕过 Reddit 最核心的 AI 防线。**在这篇博文发布之前的整整六年里,这一直是一个敞开的漏洞。lyra 将之称为「对坏人来说完全可用」的绕过路径。

隐蔽 vs 透明:平台为什么选择悄悄封你?

这引出一个根本性的治理哲学问题:为什么 Reddit 坚持影子封禁和隐蔽移除,而不是明确告知用户?

从平台视角看,隐蔽操作有它的合理性。一个垃圾制造者如果收到「你的帖子被标记为垃圾」的通知,他会立刻知道自己的策略被识破了,然后换一个策略。Shadowban 的精妙之处就在于此——让垃圾发送者在无知的幻觉中继续浪费精力,以为自己在发帖,实际上早已被消音。这是一种「信息不对称防御」:攻击者不知道自己在与什么规则作斗争,因而无法快速迭代绕过方案。

但反过来问:**这对普通用户公平吗?**笔者不站队,只是呈现事实。在 HN 讨论中,多位用户分享了被影子封禁的经历。一位 10 年老用户表示自己的账号被「追溯性地全域 shadowban」,申诉虽然显示「已批准」,但实际功能没有恢复。另一位用户评论道:「申诉流程存在的意义只是为了在合规清单上打勾,而不是真的解封任何人。」

还有更让人哭笑不得的案例——有用户因为引用了一句辛普森一家的台词,被 Reddit 全域警告「宣扬暴力」;申诉之后,警告被撤销。但这位用户还算幸运的,因为他的申诉确实被人看过了

平台控制与用户自由之间的张力,在这里被拉到了一个极限。Reddit 可以读取你的 TLS 指纹、浏览器 UA、ISP、邮箱域名和 Accept-Language 偏好——但你无法看到这些数据是如何被用来审判你的。

12 年历史包袱与 2026 年的新挑战

lyra 的分析还揭示了一个有趣的侧面:Reddit 的反垃圾系统承载着巨大的历史包袱。

2012 年的 domain 正则至今仍在工作;spammit 这个贝叶斯分类器尽管假阳性率高得离谱,也没被退役;而 spamurai 的上层规则在不断叠加。这不像一个精心设计的体系,更像一座不断加盖的违章建筑。

而且,2026 年的 Reddit 面临着一个全新的敌人:AI 生成的批量内容。一位 HN 用户(电商版块版主)分享了自己的经历——他曾花了几个月才揭开一整套由 AI 运营的营销账号网络,这些账号互相回复、制造虚假的「用户讨论」氛围,目标是污染 AI 训练数据——让 LLM 在抓取 Reddit 内容时学到这些虚构的「品牌故事」。

另一位版主则表示:「我已经在自己的 subreddit 里加了专门检测 AI 文风的 AutoMod 规则,经常出现我的规则和 Reddit 的系统同时移除同一条内容(某种竞态条件)。现在 Reddit 上 AI 生成内容的占比,可能比你想象的要大得多。」

**Reddit 在和两类敌人同时作战:传统的垃圾发送者,以及新一代的 AI 内容农场。**而它的武器库里,既有 2012 年的手工正则,也有 Google 的机器学习 API,还有自己研发的浏览器指纹方案。这一切被 patch 在一起,勉强运转。

结语

lyra 在博文末尾附了一个令人唏嘘的彩蛋。她用一个 5 年老的测试账号在自管 subreddit 上发帖,测试某个 2012 年的正则是否还生效——结果这条帖子【没有】被那个正则命中,但 Reddit 的整个系统直接把这个 5 年老的账号永久封禁了,所有历史发帖一并清除。

「RIP」——她在文章里写道。似乎 Reddit 的反垃圾系统对「测试」这个动作本身,也不怎么友好。


参考链接:


本文素材来自 lyra 的博文《A peek into Reddit’s anti-spam internals》(2026年6月27日)、Hacker News 相关讨论帖(167 pts / 63 comments),以及 Reddit 开源代码仓库中的历史提交记录。文中所有具体移除日志和数据均来自 lyra 原文,笔者仅做了整理和解读,未添加未经证实的信息。