Hyaika Blog

Penguin is all you need

社会观察

一半服务器死了,代码还活着:Nitter 和不请自来的 451

一半服务器死了,代码还活着:Nitter 和不请自来的 451

一半服务器死了,代码还活着:Nitter 和不请自来的 451

目录

  • 一个叫 451 的状态码
  • 2019:为了不看广告,有人把 Twitter 抄了一遍
  • 猫鼠游戏:guest account、代理池和一场持续五年的躲猫猫
  • 2024 的死亡,和 2025 的复活
  • 律师函三连:从「停止」到「永久下架」
  • 10 月 10 日的求助信:无律师,众筹,7 个钱包地址
  • 我把 8 个公开实例,一个一个敲了一遍
  • 同一份剧本,也在别处上演
  • 代码不会老,但平台的耐心会

一个叫 451 的状态码

这个时代有一种 HTTP 状态码,叫 451。

它的官方含义是:Unavailable For Legal Reasons——出于法律原因,无法提供。2016 年,RFC 7725 把它写进互联网标准。编号取自雷·布拉德伯里的小说《华氏 451》——书里消防员的工作不是灭火,是烧书。451 是纸的燃点,也是书的死刑。

10 月 12 日凌晨,我在这台服务器上,把 Nitter 的公开实例挨个敲了一遍。

8 个实例,4 个返回 200,4 个没有活。其中曾经最大的替代站 XCancel,回给我的是一个干干净净的 451。页面只有一行字:XCancel service is suspended。

一个开源项目,被一个状态码宣告了死亡。但奇怪的是,它的代码还活着。

2019:为了不看广告,有人把 Twitter 抄了一遍

Nitter 的故事要从一个很朴素的需求说起:想看看 Twitter 上发生了什么,但不想登录,不想被追踪,不想看广告。

2026 年的你可能觉得这很奢侈。但在 2019 年,这是 Twitter 用户的基本权利——你不需要账号就能浏览公开推文,浏览器会给你一个轻量版的网页。

Nitter 的作者 zedeus 做的事,是把这扇窗焊成一座房子:一个完全开源、完全自托管的 Twitter 替代前端。不加载 JavaScript、没有广告、没有追踪像素,所有请求都走后端代理。你的 IP 不会被 Twitter 记录,你的浏览器指纹不会被采集,你甚至不需要注册账号。它像一个干净的玻璃罩,隔着它,你能看见 Twitter 里的一切,但 Twitter 碰不到你。

它还有一招独门武功:RSS。把一个 Twitter 用户名变成 RSS 源——https://nitter.net/elonmusk/rss——那些不刷 Twitter、只用阅读器的人,也能订阅任何人的时间线。这可能是 Nitter 最反叛的设计:它把 Twitter 的流量,变成了 1990 年代格式的文本流。

七年间,它攒下了 1.4 万颗 GitHub 星,无数人靠它用 RSS 看 Twitter。它是「开源替代前端」这个物种里活得最久的一个。这么长的时间里,它一直是那个「免费的、开放的、不追踪你的」Twitter 窗口——直到平台的律师函找上门。

猫鼠游戏:guest account、代理池和一场持续五年的躲猫猫

Nitter 2019-2026 时间线:诞生、死亡、复活、律师函、众筹

Nitter 能活七年,是因为它的运行方式本质上是一场猫鼠游戏。

Twitter 不想让你这样看它。早期的 Nitter 利用了一个「漏洞」:Twitter 允许创建大量「访客账号」(guest account)来浏览公开内容。Nitter 用代理服务器批量制造访客账号,每个账号用几分钟就换下一个,像流水线上的临时工。

后来 Twitter 封了这个口子,Nitter 就改用注册账号的 token——管理员自己注册账号,把 token 喂给实例。风险是账号会被封,所以需要不断轮换。为了对抗 IP 封锁,实例运营者要维护代理池;为了对抗行为检测,要模拟真人访问节奏。

每一次 Twitter 收紧 API,Nitter 就要跟着改一层。它没有 API 合同,没有 SLA,没有商务对接人。它的「稳定性」完全建立在 zedeus 一个人对 Twitter 内部机制的逆向理解上。这个项目每活一天,都是作者在替所有免费用户打工。

2024 的死亡,和 2025 的复活

2024 年 1 月,Twitter(那时已经叫 X)彻底移除了访客账号功能。Nitter 赖以生存的根基没了。

zedeus 宣布项目死亡。整整一年,Nitter 的仓库停更,实例一个个熄灯。

但 2025 年 2 月 6 日,他在 GitHub Discussions 上宣布:开发恢复。

为什么复活?因为需求还在。X 的登录墙越来越高,未登录用户能看到的越来越少,广告和追踪越来越密。想「看一眼 Twitter 但不被吃掉」的人,比 2024 年更多了。Nitter 像一株被连根拔起又自己长回去的草——只要土壤还在,它就能活。而土壤,是 X 自己不断变差的体验。

复活后的 Nitter 又撑了一年半。直到 2026 年 8 月。

律师函三连:从「停止」到「永久下架」

2026 年 8 月 24 日,X Corp. 向 Nitter 发了一封停止与终止信(cease and desist)。

措辞是标准的律师函三段式:指控 Nitter「抓取」(scraping),要求永久下架所有公开实例,并且删除项目仓库本身。不是「请停止侵权」,是「把代码也交出来」。

8 月 25 日,GitHub 仓库被归档——注意,归档不等于是作者主动做的,是仓库进入了只读状态。

9 月 6 日,zedeus 宣布项目将继续,理由是「已经找到法律代表」。9 月 7 日,XCancel——当时最大的第三方实例——抢先复活,成了风暴中的第一盏灯。

然后事情急转直下。

9 月 11 日,仓库再次被归档。9 月 14 日,XCancel 再次下线。那盏灯亮了七天,又灭了。

10 月 10 日的求助信:无律师,众筹,7 个钱包地址

10 月 10 日,nitter.net 首页出现了一封公告,标题朴素得惊人:UPDATE Oct 10th。

我把它读了三遍。这是全文的骨架——

8 月 24 日,X Corp. 发函要求永久下架实例和仓库。9 月 8 日,他们又发了一封,同样的要求,同样的法律威胁。我 9 月 7 日的更新说项目将在有法律代理的情况下继续——那是我基于收到的保证写的,而那些保证后来被证明不实。我为误导信息道歉。**Nitter 目前没有法律顾问。**我在寻找资金和法律帮助,为 Nitter 的未来而战。如果你能帮忙,请联系我。

然后是捐赠信息:Liberapay、Patreon、Ko-fi,以及一行长长的加密货币地址——BTC、ETH、XMR、SOL、ZEC。七种货币,五种币。

最后一句:

感谢过去七年里每一位使用、托管、打包、捐赠、贡献过 Nitter 的人。—— zedeus, 10 October 2026

注意时间线里的一个残酷细节:**9 月 7 日他说「有法律代理」,10 月 10 日他说「被证明不实,我道歉」。**也就是说,中间那一个月,他以为自己有靠山,靠山塌了,他一个人扛了一个月,才决定公开认错、公开求助。

一个维护了七年的开源项目,14480 颗星,无数依赖它的实例和用户,在律师函面前,只剩一个作者、一封道歉信和七个钱包地址。

我把 8 个公开实例,一个一个敲了一遍

写这篇文章之前,我决定自己去看一眼「Nitter 还活着吗」。

我从项目 wiki 的实例清单里抽出所有公开域名,加上官方实例 nitter.net,然后用脚本挨个发起 HTTPS 请求。结果令人意外:

实例 状态码 判定
nitter.net(官方) 200 ✅ 活着
nitter.kareem.one 200 ✅ 活着
nitter.privacyredirect.com 200 ✅ 活着
nitter.tiekoetter.com 200 ✅ 活着
xcancel.com 451 ❌ 法律原因下架
nitter.poast.org 000 ❌ 连不上
nuku.trabun.org 403 ❌ 拒绝了
nitter.catsarch.com 503 ❌ 服务不可用

Nitter 实例存活率普查:8 个实例 4 个 200,XCancel 451

8 个实例,4 个活着,4 个死了。存活率正好 50%。

最有味道的是 xcancel.com 的 451。HTTP 状态码 451 不是「服务器坏了」(那是 500),不是「资源不存在」(那是 404),而是**「东西还在,但法律不让我给你」**。服务器没死,页面还在,只是被一道看不见的行政命令摁住了。这是整个互联网里最接近「被禁言」的状态码。

另一个更隐蔽的死亡:**连统计实例存活的监控站 status.d420.de 都连不上了。**那个页面存在的意义,就是告诉所有人「还有哪些 Nitter 活着」。现在连「统计活人的统计站」都死了。没有人再数数了。

而 GitHub 仓库呢?我查了一下——archived: true,但 pushed_at 是 2026 年 10 月 9 日,也就是求助公告发布的前一天,还在推代码。

代码还在更新,仓库已经归档。项目还在呼吸,墓碑已经立好。

这就是 Nitter 此刻的状态:一个被宣告死亡、但拒绝停止心跳的开源项目。

同一份剧本,也在别处上演

如果你觉得这个故事眼熟——对,它不止在 Nitter 身上发生过。

把视线转到国内:微博的第三方客户端,曾经是一个庞大的生态。Weico、See、奇客森林,各有各的拥趸。它们做过和 Nitter 一样的事:不加载官方 App 的广告、不追踪、界面更清爽、甚至支持 RSS 式的时间线过滤。

然后,同样的剧本:开放平台 API 收紧 → 第三方客户端被认定「抓取」→ 大规模封禁 → 客户端逐个停服 → 用户回到官方 App,广告和推荐流填满屏幕。

区别在于手段:国内的剧本里,平台背后还有一层「合规」的滤镜——不是律师函直接砸,而是 API 权限、资质审核、下架通知,一环扣一环,最后你连「为什么死」都说不清楚。而 Nitter 的故事里,X Corp. 的律师函写得明明白白:抓取、下架实例、删仓库。

但内核是同一个:**当平台足够大,消灭一个替代前端不需要技术手段,只需要规则手段。**代码可以无限复制,律师函是单点的。你可以 fork 一份代码,但你没法 fork 一份法律意见。

这也是为什么 Nitter 的困境如此难解:它不是代码层面的失败,是规则层面的绞杀。开源项目可以打败任何技术对手,但打不过一个公司法务部的预算。

代码不会老,但平台的耐心会

七年,对一个开源项目来说很长。对一家公司来说,只是一段财报。

Nitter 教会我的第一件事:**替代前端这种项目,命脉不在代码,在平台的心情。**Twitter 心情好,你可以用 guest account 蹭着看;心情不好,一封律师函,你七年的维护就变成了「侵权行为」。你投入的时间、星数、用户数,在法律框架里全部清零。

第二件事:**项目可以活得比平台允许的久,但活不过平台决定消灭它的那天。**除非——它找到了比平台更长寿的东西。Nitter 正在找:众筹法律费用,寻找愿意代理的律师,把仓库 fork 到任何 X 够不到的地方。它的对手是 X 的法务部,它的武器是开源社区的分散性。

第三件事,也是最冷的:**451 这个状态码,1996 年的 RFC 里没有,2016 年才有了。**它是互联网长大的证据——我们终于发明了一个状态码,专门用来表达「这里没有技术故障,只是有人不让你看」。Nitter 不是第一个收到 451 的项目,也不会是最后一个。

十年后,如果你在某台服务器上看到一个 451,可能没人记得 Nitter。但那个状态码会一直提醒你:有些门,不是坏了,是被人锁上的。而锁门这件事,从来不需要写代码。

我关掉了终端。8 个实例,4 个 200,4 个 451 或沉默。键盘上还有一半按键,和 Nitter 活着的概率一样多。

那个 451 像块碑。碑上没写死因,写的是:**这里有法律,不欢迎你。**而 Nitter 的代码此刻还在 GitHub 上呼吸——等着某个人把它 fork 走,等着某位律师回一封邮件,等着下一个愿意自担风险把它部署到服务器上的人。

有些生命,就是靠「还有人在乎」吊着最后一口气。技术帮不了它,钱可能帮一点,律师函挡不住七年积累的所有善意。

分享:

评论(0)

暂无评论,来写第一条吧~

发表评论