Nitter 宣布项目将继续:一封律师函没能杀死它,X 的法律打法值得每个开发者研究

Nitter 宣布"项目将继续":一封律师函没能杀死它,X 的法律打法却值得每个开发者研究

8 月 24 日,X Corp. 向 Nitter 项目和它的公共实例运营者发出律师函,要求永久关停全部实例、删除 GitHub 仓库,限期在次日下午 5 点前执行。两周后的 9 月 6 日,Nitter 仓库 README 被更新了一行字:「Following legal advice, the Nitter project will continue」(基于法律意见,Nitter 项目将继续)。9 月 7 日,nitter.net 首页挂出署名 zedeus、日期为 9 月 7 日的公告:这个实例和其他实例将在短时间内恢复运行,一周内会公布更多细节。

从"永久关停"到"项目将继续",中间发生了什么目前还没有公开答案。但把这两周的事件线摊开,能看到的东西比结局本身更多:X 的律师函为什么选了那两部法律、Nitter 这样的工具到底怎么工作、以及为什么实例数量在封禁之后反而超过了封禁前。

zedeus/nitter 仓库卡片:14k stars,项目未归档

时间线:从最后通牒到恢复宣告

8 月 24 日,X Corp. 的律师函发出。TechCrunch 查看了函件原文:X 指控 Nitter "非法使用并规避 X 的应用程序接口(API)及相关数据",并称掌握证据证明 Nitter 抓取了 X 的数据、访问了 X 的账户和会话令牌。函件给出的法律依据是《德州计算机有害访问法》(Texas Harmful Access by Computer Act,§143.001 与 §33.02)和《兰哈姆法》(Lanham Act,15 U.S.C. §§1114、1125),要求在 8 月 25 日东部时间下午 5 点前关停。

8 月 25 日,nitter.net 下线。开发者 zedeus 在网站和仓库挂出公告:开发暂停,正在寻求法律意见,不对具体细节置评。XCancel 这个最知名的第三方实例同样停止了服务。仓库 README 在 8 月 25 日晚上加入了法律声明,8 月 26 日又有一次提交("Unhide donation methods in readme"),把捐赠渠道重新放了回来——这个细节后来被证明是个信号:项目没打算消失。

9 月 5 日,HN 上出现一条 711 分的帖子:Nitter 的可用实例数量已经超过封禁前。社区维护的实例列表里出现了 12 个工作实例、3 个跳转服务和 8 个"活跃但限流"的实例,其中一部分是原实例换域名复活,一部分是新起的分叉。

9 月 6 日 17:14(UTC),zedeus 向仓库提交 "Update README - Nitter lives",正式宣告项目将继续。HN 上这条消息拿到 544 分和 276 条评论,Lobste.rs 同步上榜。XCancel 也恢复了服务,其首页声明"基于 Nitter 项目宣布的法律进展,XCancel 服务已恢复"。

律师函的靶心:两部不需要"签过字"的法律

这场纠纷里最值得开发者研究的,是 X 选择的法律工具。

2023 年 6 月,Google 曾向 YouTube 的第三方前端 Invidious 发出律师函,指控依据是 YouTube API 服务条款。问题在于 Invidious 从未调用那个官方 API,也就从未接受过那些条款。Invidious 的开发者拒绝配合,项目至今仍在运行。那次尝试证明了"用 ToS 打免费开源前端"是条死路:合同约束的是签合同的人。

X 这次换了两件武器。《德州计算机有害访问法》是一部州级计算机滥用法,规范的是"未经授权访问计算机"的行为,它的适用不取决于你是否同意过任何条款;《兰哈姆法》是美国联邦商标法,X 据此主张 Nitter 的服务构成商标问题。这两部法律都绕开了"合同相对性":不管你有没有跟 X 签过协议,只要被认定"未经授权访问"或商标侵权,法律就够得着你。

对平台来说,这个组合拳还有一个隐性优势:打的是最没有钱应诉的人。公共实例的运营者大多是个人或小社区,回应一封律师函所需的法律费用远超关站的成本。律师函不是判决书,德州那套理论从未经过一个真正应诉的被告检验——但应诉的成本结构决定了大部分人不会去检验它。

Nitter 到底是什么:一个后端代理前端的架构

Nitter 是 2019 年 6 月创建的开源项目,Nim 语言编写,AGPLv3 授权,作用是给 X(原 Twitter)提供一个免登录、无广告、无 JavaScript 的轻量前端。它的技术结构决定了它为什么会被盯上,也决定了它为什么难以被彻底消灭。

工作方式:浏览器只跟 Nitter 后端通信,从不直接接触 Twitter/X 的服务器。后端调用 X 的非官方接口抓取公开内容,去掉广告、追踪脚本和 JavaScript 指纹采集,以纯净 HTML 返回给访问者。官方 README 给的对比数据:渲染 @nim_lang 的页面,Nitter 输出 60KB,twitter.com 输出 784KB。因为所有请求都由后端发出,X 看到的访问者是实例服务器,不是真实用户——阅读行为不产生登录会话、Cookie、广告 ID 或任何与身份挂钩的信号。

2024 年 X 收紧 API 之后,Nitter 的运行方式发生过一次关键变化:运营公共实例需要维护真实的 X 账号,用它们的会话令牌(session token)向后端供血。这正对应了 X 律师函里"访问 X 账户和会话令牌"的指控点——函数提到的"证据",指的就是这套机制。

这个架构也解释了实例生态的韧性:Nitter 服务端是开源代码,任何一个实例被关掉,任何人都可以在自己的服务器上重新部署。社区甚至沉淀出了一份运营手册:如何批量获取和维护会话令牌、收到 DMCA 投诉时如何用欧盟 2001/29/EC 指令下的临时复制豁免或美国 DMCA 512(a) 传输豁免做反通知、如何用 Gluetun 容器把实例流量套进 VPN 以规避投诉。

没死透的原因:分叉与去中心化

截至 9 月 7 日,GitHub 上的 zedeus/nitter 仓库处于未归档状态,14,217 star、1,299 fork,AGPLv3 授权,最近一次提交是 9 月 6 日的 README 更新。律师函要求的"删除仓库"没有发生,也很可能永远不会真正生效——1,299 个分叉意味着代码在函件发出前就被镜像了一千多次,删除原始仓库不会让代码从互联网上消失,只会打击任何人托管"第 1300 个分叉"的意愿。

而实际发生的事恰好相反:封禁后两周,社区实例数量超过了封禁前。一部分新实例来自一个活跃的分叉项目(Codeberg 上的 mv12star/shitter,从 zedeus/nitter 分叉而来,9 月 6 日还在提交代码,加了搜索栏、修了 Docker 镜像),一部分是老运营者换域名重开。HN 上的讨论把逻辑讲得很清楚:对 X 来说,第三方前端是一场打地鼠游戏,每打掉一只,运营成本和舆论成本都在累积,而地鼠的数量由「部署一个 Docker 容器的难度」决定。

一周后的公告会说什么

zedeus 的 9 月 7 日公告承诺一周内公布更多信息。以现有信息能确定的范围是:项目复活以「法律意见」为前提,说明要么 X 的主张被评估为站不住脚,要么双方达成了某种安排,要么运营架构做了调整(比如实例运营者更分散、或迁移到对中介责任更友好的司法辖区)。这三种可能对其他被律师函瞄准的开源项目都有不同的参考价值,值得等公告出来再对照。

对普通读者,这个事件的实用结论只有两条:免登录阅读 X 的通道正在恢复,实例列表在社区 wiki 里维护;以及,X 上真正重要的公开内容,现在比任何时候都更应该随手存档。


图片来源:GitHub 仓库 zedeus/nitter 的 og:image(repo 卡片图)。

标签:Nitter、X、开源、法律