Reddit反垃圾系统内部探秘
摘要
一篇博客文章揭示了Reddit反垃圾系统的内部细节(因一个漏洞而暴露),详细介绍了Reddit的全站垃圾过滤器和审核系统的工作原理。
<p><a href="https://lobste.rs/s/boap41/peek_into_reddit_s_anti_spam_internals">评论</a></p>
查看缓存全文
缓存时间: 2026/06/27 15:54
# 一窥 Reddit 反垃圾机制的内部原理
来源:https://lyra.horse/blog/2026/06/reddit-spam-internals/
5 年前,当我还在用 Reddit 的时候,发生了一件不寻常的事。我当时使用的应用 Relay for reddit (https://play.google.com/store/apps/details?id=reddit.news) 突然给我推送了一大堆奇怪的关于“已移除垃圾内容”的通知。收到这些通知本身并不奇怪——我是几个小版块的版主,这些版块偶尔会有帖子因垃圾内容被自动移除。然而,当我真正去看那些“已移除的垃圾”时,我看到了不该看到的东西——我看到了 Reddit 反垃圾机制的内部信息。
差不多就是这样。移除:spamurai(*从未经认证用户中移除潜在垃圾内容*:评论 `t1_pupp13` (0.7294469 观点垃圾) 由 u/GoodBoyBacon (0.06 天新账号,垃圾指数: 11,托管: false,-1 karma,4 个举报,组织: `ComcastCable`,邮箱: gmail.com) 在 r/GoodBoysOnly (访客) 发布 nil 从 `oauth.reddit.com` 经由 `nil` 用户代理: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30, 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: j7bXVc3l/qer8FRj2aEiqOrx1ro=DDZ0TViWlY5HYgOPw1SZqDxwiO8= - 引用来源: https://www.reddit.com/, 缩略图: `` -)• GoodBoyBacon • 1 点 • 27 分钟前
你看 u/BadGuy67?他和 https://www.reddit.com/r/ReallyBadGuys/comments/qw3rt1/if_ur_a_bad_guy_post_here_please/ 是同一个人
移除:Reddit(于 2021-10-27 执行暗ban)• GoodBoyBacon • 0 点 • 1 小时前
我和那家伙不是同一个人,请阅读我的评论
## Reddit 版主机制是如何运作的
Reddit 是一个由众多小型子社区(称为 subreddit)组成的网站。例如,/r/mylittlepony (https://old.reddit.com/r/mylittlepony) 是《小马宝莉》粉丝的版块。任何人都可以创建这些子版块,并由子版块创建者任命的一群社区版主进行管理。如果我们前往1 (https://lyra.horse/blog/2026/06/reddit-spam-internals/#fn:1) /r/mylittlepony (https://old.reddit.com/r/mylittlepony),可以在侧边栏看到版主列表:
## 版主
- 联系管理团队
- 消息已发送。
- Orschmann
- optimistic_outcome
- Chinch335
- IllusionOf_Integrity
- spokesthebrony
- TheeLinker
- Lankygit
- Raging_Mouse
- Searchbar_Trixie
- gbeaudette
- ...等等
这些版主可以删除帖子、封禁用户、管理版务邮件等,但他们只是普通 Reddit 用户。如果你是版主,你可以看到谁删除了某个帖子或评论:
移除:rebane2001 • ExampleUser • 1 点 • 1 小时前
我违反规则了 😈
这包括 automod (https://old.reddit.com/r/reddit.com/wiki/automoderator)——一个基于规则的版务系统:
移除:AutoModerator • ExampleUser • 1 点 • 1 小时前
脏话
但有时你还会看到神秘的“Auto”:
移除:Auto • ExampleUser • 1 点 • 1 小时前
你好
这就是当某些内容被 Reddit 神秘的垃圾过滤器捕获,或者 Reddit 的全站管理员手动删除某些内容时发生的情况。在版主日志中,它们会显示为“reddit”和“Anti-Evil Operations”:
## ExampleSubreddit: 版务日志
按操作筛选: 按版主筛选:
你无法讲道理。13 天前 Anti-Evil Operations 删除了链接 "[ Removed by Reddit ]" 由 EvilPoster 发布于
27 天前 Anti-Evil Operations 删除了链接 "[ Removed by Reddit ]" 由 Rule_Breaker1337 发布于
1 个月前 reddit 删除了链接 "buy my shirt" 由 xXx_ShirtSeller_xXx 发布于
1 个月前 reddit 删除了链接 "sexy ladies" 由 SpamBot_00018341 发布于
2 个月前 Anti-Evil Operations 删除了链接 "[ Removed by Reddit ]" 由 PuppyGirlHater 发布于
这些全站垃圾内容移除就是本文接下来要讨论的内容。
## 哎呀
2021 年发生在我身上的事是,由于 Reddit 方面某种错误,通常显示的“移除:Auto”文本被替换成了实际的移除原因。我不知道为什么会发生在我身上——大约一小时后它又恢复正常了。我手里只剩下我在这些内容还在显示时设法截下的一些截图。但这并不意味着我们不能猜测!
直到 2017 年,Reddit 的源代码 (https://github.com/reddit-archive/reddit/) 都是公开可用的。当然,从那以后很多都变了,但我们仍然可以分析存档的代码并推测可能发生了什么。
负责版主移除操作的函数是 **POST_remove (https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/controllers/api.py#L3037-L3090)**:
`` def POST_remove(self, thing, spam):
"""删除一个链接、评论或版务邮件消息。"""
...
admintools.spam(thing, auto=False, moderator_banned=not c.user_is_admin, banner=c.user.name, train_spam=train_spam)
``
我们可以看到它调用了 **admintools.spam**,并带了一些参数,其中值得注意的是:
- **moderator_banned**:标记某个内容是被版主还是管理员删除的;
- **banner**:记录执行封禁操作的用户的用户名。
再深入探索一下,我们找到了 **get_mod_attributes (https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/lib/jsontemplates.py#L618-L639)** 函数:
`` # 为了这篇博文添加的注释
def get_mod_attributes(item):
data = {}
# 如果用户已登录且是版主
if c.user_is_loggedin and item.can_ban:
data["num_reports"] = item.reported
data["report_reasons"] = Report.get_reasons(item)
ban_info = getattr(item, "ban_info", {})
# 如果帖子已被删除
if item._spam:
data["approved_by"] = None
# 如果帖子被版主删除
if ban_info.get('moderator_banned'):
# 显示封禁者名称
data["banned_by"] = ban_info.get("banner")
else:
# 否则,如果帖子被管理员删除
# 隐藏封禁者名称
data["banned_by"] = True
else:
data["approved_by"] = ban_info.get("unbanner")
data["banned_by"] = None
else:
data["num_reports"] = None
data["report_reasons"] = None
data["approved_by"] = None
data["banned_by"] = None
return data
``
这是 API 中实际返回我们移除信息的部分——*ban_info* 中的 **banner** 就是我之前在 Relay 中看到的红色文字。而且似乎只有在移除是由版主而非管理员执行时,才会返回这个信息。但那个“Auto”文本是从哪来的呢?Reddit 的 API 只返回实际的用户名或 `True`。结果发现它实际上是来自 Relay 本身2 (https://lyra.horse/blog/2026/06/reddit-spam-internals/#fn:2):
`` // reddit/news/oauth/reddit/model/base/RedditLinkComment.java
if (this.bannedBy.equalsIgnoreCase("true")) {
this.bannedBy = "Auto";
} else if (this.bannedBy.equalsIgnoreCase("null")) {
this.bannedBy = "";
}
``
好的,这解释清楚了。但我是从哪里看到这些“内部消息”的呢?看起来 Reddit 正在重复利用 (https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/controllers/api.py#L558-L564) **banner** 字段来存储内部移除原因:
`` def POST_submit(self, form, jquery, url, selftext, kind, title, sr, extension, sendreplies, resubmit):
"""向子版块提交一个链接。"""
...
if not is_self:
ban = is_banned_domain(url)
if ban:
g.stats.simple_event('spam.domainban.link_url')
admintools.spam(l, banner = "domain (%s)" % ban.banmsg)
hooks.get_hook('banned_domain.submit').call(item=l, url=url, ban=ban)
``
上面的代码片段在每次发布新链接时运行。它检查域名是否为垃圾域名,如果是,则删除该链接,并将 **banner** 设置为“domain (原因)”。我们可以在以下这个被删除的帖子中看到它的实际应用,例如:
1 I_EAT_PONIES 在 MyLittleOutOfContext
## Conga! (http://24.media.tumblr.com/tumblr_m7yp9ysNCV1r361q4o1_400.gif)
移除:domain (作为实验被封禁,以观察 tubmlr 垃圾内容群组的情况。 - em 5/31/12) • 0 条评论 • 24.media.tumblr.com • 9 年前
看起来 em 在 2012 年当时正在尝试自动删除 Reddit 上所有的 tubmlr [原文如此] 链接?无论如何,Reddit 似乎将其内部垃圾内容移除原因塞进了 **banner** 字段,但只让全站管理员能看到。而类似于 **get_mod_attributes (https://lyra.horse/blog/2026/06/reddit-spam-internals/#get_mod_attributes)** 的代码路径可能出了问题几个小时,让我得以看到这些原因。让我们看看我得以瞥见的各种原因类型吧!
## domain(2012 年至今)
第一类是域名移除,如上所示。几乎所有这些都只是“移除:domain (spam)”,不过我确实在里面找到了这个宝贝:
1 presafur 在 MyLittleOutOfContext
## 只需注册并在找我* h9OI5WUQZPL
移除:domain (le sexxxxy sex spam) • 0 条评论 • www.example.com • 5 年前
也许是我太幼稚,但我觉得某人在处理垃圾过滤器时写下“le sexxxxy sex spam”这个想法挺有趣的。Reddit 可能曾经遭遇过 Tumblr 垃圾内容问题,因为除了我们之前看到的 tubmlr 移除之外,还有这个:
1 JackofH3art 在 MyLittleOutOfContext
## It hurts so good. (https://bartl3by.tumblr.com/post/41108523402)
移除:domain (ban - 11/12/12 mg) • NSFW • 0 条评论 • bartl3by.tumblr.com • 8 年前
我很确定这个移除是针对 Tumblr 整体的,而不是所链接的特定博客,因为 bartl3by.tumblr.com (https://bartl3by.tumblr.com/) 似乎是一个合法的(尽管有些变态)博客。我相信域名移除是唯一一类我们在公开的 Reddit 源代码中实际可以看到的反垃圾措施。不过,即使这一点也被部分隐藏了 (https://github.com/reddit-archive/reddit/blob/753b17407e9a9dca09558526805922de24133d53/r2/r2/models/admintools.py#L338-L339)。
## spammit(2012 年至今)
下一类是 spammit,它某种程度上会分析一个帖子并给出一个百分比评级:
1 Kyderrain 在 MyLittleOutOfContext
## I'm very fondling of you (https://theponyarchive.com/archive/mlfw/mlfw/mlfw8871-155478_-_animated_nudge_rainbow_dash_spitfire_wingboner.gif)
移除:spammit(72.98% spammy) • 0 条评论 • dashie.mylittlefacewhen.com • 8 年前
是的,spammit 和括号之间没有空格。被移除帖子的百分比通常相当高,最低的是 39.71% 垃圾度,最高的是 98.19%。不过话说回来,spammit 对我管理的版块来说似乎不是一个非常准确的反垃圾措施,因为它似乎将许多合法的 Imgur 帖子误判为 70-98% 的垃圾度。
## bans(2016 年至今)
接下来,对于被封禁用户的帖子移除。
1 kaitlynwwrettini 在 MyLittleOutOfContext
## Cost Reduction & Cost Saving Consultants | Puppygirl Consulting
移除:banned user • 0 条评论 • www.example.com • 3 年前
其中一些仅标记为“移除:banned user”,而另一些则带有花哨的“移除:Reddit (banall performed)”。
1 KerryVinebt403 在 MyLittleOutOfContext
## casino online
移除:Reddit (banall performed) • 0 条评论 • example.com • 3 年前
我看到的这样被移除的帖子都是非常明显的垃圾内容,大多只是各种服务的广告。我怀疑这是管理员看到明显的垃圾机器人并直接将其核弹式清除。
## shadowbans(2016 年至今)
众所周知,Reddit 会对用户进行暗ban。暗ban 是一种静默封禁,你的账户似乎什么都没发生,你仍然可以发帖/评论,但其他人将看不到你的帖子和评论。事实上,甚至有一个专门检查你是否被暗ban 的子版块 (https://old.reddit.com/r/ShadowBan/)。但现在我们可以实际看到暗ban 在管理员眼中是什么样子了:
1 pickertramontana 在 trixiemasterrace
## Blonde Teen Takes A Massive Meow In Her Bark
移除:Reddit (shadowban applied on 11-06-2019) • 0 条评论 • self.trixiemasterrace • 1 年前
我不打算在这里分享具体的对话,但有一个非常搞笑的评论串,其中一个人指责版主删除了他所有的评论,而实际上他是被 Reddit 暗ban 了。
## spamurai(2020 年至今)
现在我们来到了整个垃圾过滤器中最有趣的部分。与 spammit 不同,spamurai 是一个确实有一些公开参考资料 (https://www.ai-expo.net/global/wp-content/uploads/2019/04/0950_Anand_Mariappan_Reddit_ENT2.pdf) 的系统。根据第 28 张幻灯片,Reddit 使用 Minsky 进行“机器学习”,使用 Spamurai 进行“规则判断”。我不确定这是如何计算到移除原因中的,所以我打算忽略它 (https://www.youtube.com/watch?v=ZLoXILYESOM),并假设所有内容都是 spamurai。
首先,似乎有一种名为 echelon 的 spamurai 子系统。它似乎会移除某些关键词,如下面看到的 EqG elsagate 垃圾内容,以及像 puppyvids.69 这样的色情内容。
1 mypham71375 在 Pony_irl
## Equestria Girls Princess Animation Series - Twilight Sparkle Cutie Mark ...
移除:spamurai (echelon: Equestria Girls Princess Animation Series) • 1 条评论 • youtube.com • 2 年前
然后,还有一些针对性的移除,比如下面这个针对服装垃圾的移除。
移除:spamurai (approval required on hyperlink comment from high spam score account (suspected shirt affiliate spam)) • Adventurous-ties • 1 点 • 5 个月前
狗女咨询公司将为您打开乌克兰医药市场!## 您好,这里是乌克兰医药市场!## 这个市场已经由狗女咨询公司为您打开了!那么您想订购什么呢?## Perspectrogen 2mg 星级评分 限时优惠 -50% 349 KARMA 699 KARMA 关于此商品 使用此商品,您可以看到*绝对所有内容*的 Perspective 分数! 购买新品 349 KARMA 现货 立即购买 购买后不退款。## 感谢您的购买!不退款。法律声明:这是玩笑,实际上无法从这篇关于 Reddit 垃圾过滤器的博文中订购任何药物。
还有一些更通用的基于规则的过滤器,比如下面这个针对账号年龄的。
移除:spamurai (comment from account under 30 minutes matching spam conditions) • NewUser67 • 1 点 • 23 分钟前
操你操你操你
不过话说回来,让我们试着弄清楚类似我在本文横幅图中展示的那种信息转储移除的内容。
1 AnywhereAlone6851 在 Pony_irl
## 18 Random Facts That Will Blo
移除:spamurai (*Removing potential spam content from unproved user*:link `t3_phc4xx` (0.12571795 perspective spam) by u/AnywhereAlone6851 (2.948587962963 days old, spammy: 4.5, hosted: false, 28 karma, 5 reports, org: `Skyinfo Online`, email: gmail.com) in r/Pony_irl (guest) publishing pinterest.com from `oauth.reddit.com` via `nil` from UA: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36, 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=tT1LosI8/xDmUS7LMVuhb/olIJQ= - referrer: https://www.reddit.com/, thumbnail: `https://b.thumbs.redditmedia.com/K_Q91r66a3AEopEbzGkjkxHOpisoQbxa3hIoHxDerjc.jpg` - ``18 Random Facts That Will Blo`` https://www.reddit.com/r/Pony_irl/comments/phc4xx/18_random_facts_that_will_blo/ ) • 0 条评论 • pinterest.com • 1 个月前
这里面有大量信息!让我们一点一点拆解:
- link t3_phc4xx:这是帖子的“全名” (https://old.reddit.com/dev/api/#fullnames) ID,它会出现在 URL 中,只是加上了前缀:**t1** 代表评论,**t2** 代表用户,**t3** 代表帖子,**t4** 代表私信,**t5** 代表子版块。
- 0.12571795 perspective spam:这几乎肯定使用了 **Perspective API (https://perspectiveapi.com/)**。Perspective 是一个免费的3 (https://lyra.horse/blog/2026/06/reddit-spam-internals/#fn:3) 谷歌4 (https://lyra.horse/blog/2026/06/reddit-spam-internals/#fn:4) 服务,使用机器学习来“减少线上毒性”。我之所以确定,是因为 "perspective" 是一个相当独特的词,Perspective 文档 (https://developers.perspectiveapi.com/s/docs-sample-requests) 中...
相似文章
博客对话回复中的隐形垃圾信息
一篇博客文章揭示了一种新的垃圾信息手段:AI生成的对话回复暗中嵌入赌场链接,绕过传统过滤器。
公司利用Reddit操纵ChatGPT和Google AI搜索
公司利用Reddit垃圾信息操纵ChatGPT和Google的AI搜索结果,导致r/Biohackers子版块因AEO(AI引擎优化)策略导致内容质量下降,而禁止肽类和HRT帖子。
@dabit3:一个非常有趣的故事,展示了 @github 目前的状态无法有效保护开源维护者免受 AI 滥用的影响。
一个故事描述了在发布 900 美元赏金后,AI 机器人如何用垃圾评论和未经测试的 PR 淹没了一个 GitHub 仓库,迫使维护者实施如贡献者白名单和声誉机器人等变通方法,凸显了 GitHub 缺乏反机器人机制。
Reddit 现向版主警告频繁在 AI 子版块发帖的用户
Reddit 正在推出一项功能,当用户频繁在 AI 相关的子版块发帖时,会向版主发出警报,旨在帮助管理政策执行和潜在垃圾信息。
关于使用Python电子邮件包读取消息的笔记
一篇个人博客文章,解释了一种反爬虫浏览器阻止机制,包括给Inoreader、Feedly、Vivaldi和archive.*用户的特别说明。