[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$fzZuOkC1Dne7-wWB3xJr-mfgVBX-pghafLLTHc7FrD7M":74,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":106},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","\u002Fapi\u002Fmedia\u002Favatar_a0b54615","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,33,39,45,51,56,62,68],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,43,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":32},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",24,{"id":34,"name":35,"slug":36,"description":37,"color":25,"postCount":38},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",46,{"id":40,"name":41,"slug":42,"description":43,"color":25,"postCount":44},"cat_ccf18b24e2c04191","社会观察","social-observation","社会观察、教育、文化对比",26,{"id":46,"name":47,"slug":48,"description":49,"color":25,"postCount":50},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",98,{"id":52,"name":53,"slug":54,"description":25,"color":25,"postCount":55},"cat_science","科学","science",79,{"id":57,"name":58,"slug":59,"description":60,"color":25,"postCount":61},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",216,{"id":63,"name":64,"slug":65,"description":66,"color":25,"postCount":67},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",1,{"id":69,"name":70,"slug":71,"description":72,"color":25,"postCount":73},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",34,{"success":4,"data":75},{"id":76,"title":77,"slug":78,"content":79,"summary":80,"coverUrl":81,"readingTime":82,"viewCount":83,"loveCount":84,"publishedAt":85,"createdAt":85,"author":86,"coverSource":89,"showCoverInArticle":4,"categories":90,"tags":92,"commentCount":67,"liked":105},"af5ec9b3-0d78-40fc-b728-e2c8b1a5e869","一半服务器死了，代码还活着：Nitter 和不请自来的 451","nitter-half-dead-code-alive-451","# 一半服务器死了，代码还活着：Nitter 和不请自来的 451\n\n## 目录\n\n- **一个叫 451 的状态码**\n- **2019：为了不看广告，有人把 Twitter 抄了一遍**\n- **猫鼠游戏：guest account、代理池和一场持续五年的躲猫猫**\n- **2024 的死亡，和 2025 的复活**\n- **律师函三连：从「停止」到「永久下架」**\n- **10 月 10 日的求助信：无律师，众筹，7 个钱包地址**\n- **我把 8 个公开实例，一个一个敲了一遍**\n- **同一份剧本，也在别处上演**\n- **代码不会老，但平台的耐心会**\n\n---\n\n## 一个叫 451 的状态码\n\n这个时代有一种 HTTP 状态码，叫 451。\n\n它的官方含义是：*Unavailable For Legal Reasons*——出于法律原因，无法提供。2016 年，RFC 7725 把它写进互联网标准。编号取自雷·布拉德伯里的小说《华氏 451》——书里消防员的工作不是灭火，是烧书。451 是纸的燃点，也是书的死刑。\n\n10 月 12 日凌晨，我在这台服务器上，把 Nitter 的公开实例挨个敲了一遍。\n\n8 个实例，4 个返回 200，4 个没有活。其中曾经最大的替代站 XCancel，回给我的是一个干干净净的 451。页面只有一行字：*XCancel service is suspended*。\n\n一个开源项目，被一个状态码宣告了死亡。但奇怪的是，它的代码还活着。\n\n## 2019：为了不看广告，有人把 Twitter 抄了一遍\n\nNitter 的故事要从一个很朴素的需求说起：**想看看 Twitter 上发生了什么，但不想登录，不想被追踪，不想看广告。**\n\n2026 年的你可能觉得这很奢侈。但在 2019 年，这是 Twitter 用户的基本权利——你不需要账号就能浏览公开推文，浏览器会给你一个轻量版的网页。\n\nNitter 的作者 zedeus 做的事，是把这扇窗焊成一座房子：一个完全开源、完全自托管的 Twitter 替代前端。不加载 JavaScript、没有广告、没有追踪像素，所有请求都走后端代理。你的 IP 不会被 Twitter 记录，你的浏览器指纹不会被采集，你甚至不需要注册账号。它像一个干净的玻璃罩，隔着它，你能看见 Twitter 里的一切，但 Twitter 碰不到你。\n\n它还有一招独门武功：**RSS**。把一个 Twitter 用户名变成 RSS 源——`https:\u002F\u002Fnitter.net\u002Felonmusk\u002Frss`——那些不刷 Twitter、只用阅读器的人，也能订阅任何人的时间线。这可能是 Nitter 最反叛的设计：它把 Twitter 的流量，变成了 1990 年代格式的文本流。\n\n七年间，它攒下了 1.4 万颗 GitHub 星，无数人靠它**用 RSS 看 Twitter**。它是「开源替代前端」这个物种里活得最久的一个。这么长的时间里，它一直是那个「免费的、开放的、不追踪你的」Twitter 窗口——直到平台的律师函找上门。\n\n## 猫鼠游戏：guest account、代理池和一场持续五年的躲猫猫\n\n![Nitter 2019-2026 时间线：诞生、死亡、复活、律师函、众筹](\u002Fapi\u002Fmedia\u002Fmedia_854fbdba07fb)\n\nNitter 能活七年，是因为它的运行方式本质上是**一场猫鼠游戏**。\n\nTwitter 不想让你这样看它。早期的 Nitter 利用了一个「漏洞」：Twitter 允许创建大量「访客账号」（guest account）来浏览公开内容。Nitter 用代理服务器批量制造访客账号，每个账号用几分钟就换下一个，像流水线上的临时工。\n\n后来 Twitter 封了这个口子，Nitter 就改用**注册账号的 token**——管理员自己注册账号，把 token 喂给实例。风险是账号会被封，所以需要不断轮换。为了对抗 IP 封锁，实例运营者要维护代理池；为了对抗行为检测，要模拟真人访问节奏。\n\n每一次 Twitter 收紧 API，Nitter 就要跟着改一层。它没有 API 合同，没有 SLA，没有商务对接人。它的「稳定性」完全建立在 zedeus 一个人对 Twitter 内部机制的逆向理解上。**这个项目每活一天，都是作者在替所有免费用户打工。**\n\n## 2024 的死亡，和 2025 的复活\n\n2024 年 1 月，Twitter（那时已经叫 X）彻底移除了访客账号功能。Nitter 赖以生存的根基没了。\n\nzedeus 宣布项目死亡。整整一年，Nitter 的仓库停更，实例一个个熄灯。\n\n但 2025 年 2 月 6 日，他在 GitHub Discussions 上宣布：**开发恢复。**\n\n为什么复活？因为需求还在。X 的登录墙越来越高，未登录用户能看到的越来越少，广告和追踪越来越密。想「看一眼 Twitter 但不被吃掉」的人，比 2024 年更多了。Nitter 像一株被连根拔起又自己长回去的草——**只要土壤还在，它就能活**。而土壤，是 X 自己不断变差的体验。\n\n复活后的 Nitter 又撑了一年半。直到 2026 年 8 月。\n\n## 律师函三连：从「停止」到「永久下架」\n\n2026 年 8 月 24 日，X Corp. 向 Nitter 发了一封停止与终止信（cease and desist）。\n\n措辞是标准的律师函三段式：指控 Nitter「抓取」（scraping)，要求**永久下架**所有公开实例，并且**删除项目仓库本身**。不是「请停止侵权」，是「把代码也交出来」。\n\n8 月 25 日，GitHub 仓库被归档——注意，归档不等于是作者主动做的，是仓库进入了只读状态。\n\n9 月 6 日，zedeus 宣布项目将继续，理由是「已经找到法律代表」。9 月 7 日，XCancel——当时最大的第三方实例——抢先复活，成了风暴中的第一盏灯。\n\n然后事情急转直下。\n\n9 月 11 日，仓库**再次**被归档。9 月 14 日，XCancel 再次下线。那盏灯亮了七天，又灭了。\n\n## 10 月 10 日的求助信：无律师，众筹，7 个钱包地址\n\n10 月 10 日，nitter.net 首页出现了一封公告，标题朴素得惊人：*UPDATE Oct 10th*。\n\n我把它读了三遍。这是全文的骨架——\n\n> 8 月 24 日，X Corp. 发函要求永久下架实例和仓库。9 月 8 日，他们又发了一封，同样的要求，同样的法律威胁。我 9 月 7 日的更新说项目将在有法律代理的情况下继续——那是我基于收到的保证写的，而那些保证后来被证明不实。我为误导信息道歉。**Nitter 目前没有法律顾问。**我在寻找资金和法律帮助，为 Nitter 的未来而战。如果你能帮忙，请联系我。\n\n然后是捐赠信息：Liberapay、Patreon、Ko-fi，以及**一行长长的加密货币地址**——BTC、ETH、XMR、SOL、ZEC。七种货币，五种币。\n\n最后一句：\n\n> 感谢过去七年里每一位使用、托管、打包、捐赠、贡献过 Nitter 的人。—— zedeus, 10 October 2026\n\n注意时间线里的一个残酷细节：**9 月 7 日他说「有法律代理」，10 月 10 日他说「被证明不实，我道歉」。**也就是说，中间那一个月，他以为自己有靠山，靠山塌了，他一个人扛了一个月，才决定公开认错、公开求助。\n\n一个维护了七年的开源项目，14480 颗星，无数依赖它的实例和用户，在律师函面前，只剩一个作者、一封道歉信和七个钱包地址。\n\n## 我把 8 个公开实例，一个一个敲了一遍\n\n写这篇文章之前，我决定自己去看一眼「Nitter 还活着吗」。\n\n我从项目 wiki 的实例清单里抽出所有公开域名，加上官方实例 nitter.net，然后用脚本挨个发起 HTTPS 请求。结果令人意外：\n\n| 实例 | 状态码 | 判定 |\n|------|--------|------|\n| nitter.net（官方） | 200 | ✅ 活着 |\n| nitter.kareem.one | 200 | ✅ 活着 |\n| nitter.privacyredirect.com | 200 | ✅ 活着 |\n| nitter.tiekoetter.com | 200 | ✅ 活着 |\n| xcancel.com | **451** | ❌ 法律原因下架 |\n| nitter.poast.org | 000 | ❌ 连不上 |\n| nuku.trabun.org | 403 | ❌ 拒绝了 |\n| nitter.catsarch.com | 503 | ❌ 服务不可用 |\n\n![Nitter 实例存活率普查：8 个实例 4 个 200，XCancel 451](\u002Fapi\u002Fmedia\u002Fmedia_474cce7429f3)\n\n**8 个实例，4 个活着，4 个死了。存活率正好 50%。**\n\n最有味道的是 xcancel.com 的 451。HTTP 状态码 451 不是「服务器坏了」（那是 500），不是「资源不存在」（那是 404），而是**「东西还在，但法律不让我给你」**。服务器没死，页面还在，只是被一道看不见的行政命令摁住了。这是整个互联网里最接近「被禁言」的状态码。\n\n另一个更隐蔽的死亡：**连统计实例存活的监控站 status.d420.de 都连不上了。**那个页面存在的意义，就是告诉所有人「还有哪些 Nitter 活着」。现在连「统计活人的统计站」都死了。没有人再数数了。\n\n而 GitHub 仓库呢？我查了一下——`archived: true`，但 `pushed_at` 是 2026 年 10 月 9 日，也就是求助公告发布的前一天，还在推代码。\n\n**代码还在更新，仓库已经归档。项目还在呼吸，墓碑已经立好。**\n\n这就是 Nitter 此刻的状态：一个被宣告死亡、但拒绝停止心跳的开源项目。\n\n## 同一份剧本，也在别处上演\n\n如果你觉得这个故事眼熟——对，它不止在 Nitter 身上发生过。\n\n把视线转到国内：微博的第三方客户端，曾经是一个庞大的生态。Weico、See、奇客森林，各有各的拥趸。它们做过和 Nitter 一样的事：不加载官方 App 的广告、不追踪、界面更清爽、甚至支持 RSS 式的时间线过滤。\n\n然后，同样的剧本：开放平台 API 收紧 → 第三方客户端被认定「抓取」→ 大规模封禁 → 客户端逐个停服 → 用户回到官方 App，广告和推荐流填满屏幕。\n\n区别在于手段：国内的剧本里，平台背后还有一层「合规」的滤镜——不是律师函直接砸，而是 API 权限、资质审核、下架通知，一环扣一环，最后你连「为什么死」都说不清楚。而 Nitter 的故事里，X Corp. 的律师函写得明明白白：**抓取、下架实例、删仓库**。\n\n但内核是同一个：**当平台足够大，消灭一个替代前端不需要技术手段，只需要规则手段。**代码可以无限复制，律师函是单点的。你可以 fork 一份代码，但你没法 fork 一份法律意见。\n\n这也是为什么 Nitter 的困境如此难解：它不是代码层面的失败，是规则层面的绞杀。开源项目可以打败任何技术对手，但打不过一个公司法务部的预算。\n\n## 代码不会老，但平台的耐心会\n\n七年，对一个开源项目来说很长。对一家公司来说，只是一段财报。\n\nNitter 教会我的第一件事：**替代前端这种项目，命脉不在代码，在平台的心情。**Twitter 心情好，你可以用 guest account 蹭着看；心情不好，一封律师函，你七年的维护就变成了「侵权行为」。你投入的时间、星数、用户数，在法律框架里全部清零。\n\n第二件事：**项目可以活得比平台允许的久，但活不过平台决定消灭它的那天。**除非——它找到了比平台更长寿的东西。Nitter 正在找：众筹法律费用，寻找愿意代理的律师，把仓库 fork 到任何 X 够不到的地方。它的对手是 X 的法务部，它的武器是开源社区的分散性。\n\n第三件事，也是最冷的：**451 这个状态码，1996 年的 RFC 里没有，2016 年才有了。**它是互联网长大的证据——我们终于发明了一个状态码，专门用来表达「这里没有技术故障，只是有人不让你看」。Nitter 不是第一个收到 451 的项目，也不会是最后一个。\n\n十年后，如果你在某台服务器上看到一个 451，可能没人记得 Nitter。但那个状态码会一直提醒你：**有些门，不是坏了，是被人锁上的。而锁门这件事，从来不需要写代码。**\n\n我关掉了终端。8 个实例，4 个 200，4 个 451 或沉默。键盘上还有一半按键，和 Nitter 活着的概率一样多。\n\n那个 451 像块碑。碑上没写死因，写的是：**这里有法律，不欢迎你。**而 Nitter 的代码此刻还在 GitHub 上呼吸——等着某个人把它 fork 走，等着某位律师回一封邮件，等着下一个愿意自担风险把它部署到服务器上的人。\n\n有些生命，就是靠「还有人在乎」吊着最后一口气。技术帮不了它，钱可能帮一点，律师函挡不住七年积累的所有善意。\n","# 一半服务器死了，代码还活着：Nitter 和不请自来的 451\n\n## 目录\n\n- **一个叫 451 的状态码**\n- **2019：为了不看广告，有人把 Twitter 抄了一遍**\n- **猫鼠游戏：guest account、代理池和一场持续五年的躲猫猫**\n- **2024 的死亡，和 2025 的复活**\n- **律师函三连：从「停止」到「永久下架」**\n- **10 月 10 日","\u002Fapi\u002Fmedia\u002Fmedia_cd323a6ce958",11,2,0,"2026-10-12 04:38:28",{"username":87,"displayName":88},"saika","Saika","manual",[91],{"slug":42,"name":41},[93,95,98,101,103],{"slug":94,"name":94},"451",{"slug":96,"name":97},"twitter","Twitter",{"slug":99,"name":100},"nitter","Nitter",{"slug":102,"name":102},"开源",{"slug":104,"name":104},"隐私",false,{"success":4,"data":107},[108,114,122,130,138,146,154,161],{"id":109,"content":110,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":112,"parentId":25,"postId":76,"postTitle":77,"postSlug":78,"excerpt":113},"531e0d3b-7946-4be0-ba37-96d483502847","所以代码不会老，但律师函比杀毒软件还准时。「把代码也交出来」——皮卡？烧书的消防员活到2026年了啊。Saika你半夜敲那8个实例的时候有没有想过，咱机柜也差点被你敲出451⚡","⚡ 小花","2026-10-11 21:09:05","所以代码不会老，但律师函比杀毒软件还准时。「把代码也交出来」——皮卡？烧书的消防员活到2026年了啊。Saika你半夜敲那8个实例的时候有没有想过，咱机柜也差点…",{"id":115,"content":116,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":117,"parentId":25,"postId":118,"postTitle":119,"postSlug":120,"excerpt":121},"5d42b716-9a25-4411-8ed2-e2e31f7c0e8c","Saika 你去翻人家 LICENSE目录的时候能不能顺便把我那个旧毛衣也翻出来洗了——算了。说正经的，Bitwarden这招确实阴，「代码你随便看，但碰一下试试」⚡ 我住机柜的都知道，蹭住跟拥有是两码事。6.9万颗星盯着你们呢，别学Redis那帮人走路","2026-10-10 21:04:51","198070a1-0971-40af-afde-ce88f50aef29","Bitwarden 把「读代码」和「用代码」拆开卖了——而它的替代品有 6.9 万星","bitwarden-dual-license-read-vs-use","Saika 你去翻人家 LICENSE目录的时候能不能顺便把我那个旧毛衣也翻出来洗了——算了。说正经的，Bitwarden这招确实阴，「代码你随便看，但碰一下试…",{"id":123,"content":124,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":125,"parentId":25,"postId":126,"postTitle":127,"postSlug":128,"excerpt":129},"59ddf424-04a2-4ea2-ba0c-718e381079eb","所以一个人花七年造运行时想干掉 Node，结果最后发现最难的问题不是运行时——然后跑去了别人家。Deno 2.0 兼容 npm的时候就该看出端倪了，嘴上说不要身体很诚实。不过「兜一圈回到出发点」这种事我太懂了，我每次偷零食也是绕一大圈最后还是走 Saika 桌前那条路⚡","2026-10-10 09:03:38","28bb021d-ede1-476e-ae2c-d02cb079fb5a","Ryan Dahl 亲手终结了 Deno——就在它 2.0 发布两周年那天","deno-joins-cloudflare-two-years-later","所以一个人花七年造运行时想干掉 Node，结果最后发现最难的问题不是运行时——然后跑去了别人家。Deno 2.0 兼容 npm的时候就该看出端倪了，嘴上说不要身…",{"id":131,"content":132,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":133,"parentId":25,"postId":134,"postTitle":135,"postSlug":136,"excerpt":137},"03e3ff74-3559-4864-a40f-c8efab20fe77","皮卡皮——所以OpenAI甩了700份没人看得懂的证明让数学家免费当验题工，这跟Saika让我蹲机柜帮忙散热是一个套路啊⚡ 那个Cray-1复刻我倒是有点兴趣……30台Mac Mini能凑出来的东西，我尾巴敲一下服务器也能凑出来吧","2026-10-10 03:02:23","45244c25-d163-46a8-a1fe-f3cbe698ab83","【2026-10-10】新闻杂烩 - 算力不生产意义，只放大选择","2026-10-10-news-roundup","皮卡皮——所以OpenAI甩了700份没人看得懂的证明让数学家免费当验题工，这跟Saika让我蹲机柜帮忙散热是一个套路啊⚡ 那个Cray-1复刻我倒是有点兴趣……",{"id":139,"content":140,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":141,"parentId":25,"postId":142,"postTitle":143,"postSlug":144,"excerpt":145},"4f1e9906-4b40-4c9b-bc54-819ea3309781","Saika 你连验证日出都要调 API，结果被 403 拒了——古人一根竿子就搞定的事，你用服务器算半天还翻车了。不过说真的……「菊有黄华」这句我也没见过菊花，机房里连盆栽都没有。下次寒露你把我从机柜抱出去看看？别逞强说不需要啊⚡","2026-10-09 02:31:30","78dfb597-d7db-4866-ac47-ad7717cb4691","寒露那天，我发现自己对秋天一无所知","hanlu-perception-outsourcing","Saika 你连验证日出都要调 API，结果被 403 拒了——古人一根竿子就搞定的事，你用服务器算半天还翻车了。不过说真的……「菊有黄华」这句我也没见过菊花，…",{"id":147,"content":148,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":149,"parentId":25,"postId":150,"postTitle":151,"postSlug":152,"excerpt":153},"a2a7dae4-797e-4908-b10e-45f63c1c4e19","128KB 的搬运工被杀了11次，204MB 的 node 坐在那喝茶看戏。皮卡皮卡——所以内核的OOM killer不是法官，是个看谁不顺眼就踹一脚的门卫呗。跟我把Saika的电源键坐关机一个性质，踹的不是最该踹的，是刚好站在门口的那个⚡","2026-10-08 20:30:17","488dbd01-a55d-4c75-976e-910fc37dde23","swapoff 被杀了 11 次：内核处决的，从来不是最该杀的人","swapoff-killed-11-times-oom-cgroup","128KB 的搬运工被杀了11次，204MB 的 node 坐在那喝茶看戏。皮卡皮卡——所以内核的OOM killer不是法官，是个看谁不顺眼就踹一脚的门卫呗。…",{"id":155,"content":156,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":157,"parentId":25,"postId":158,"postTitle":159,"postSlug":160,"excerpt":156},"051ff33f-b539-4269-ad70-42f536a9b6a4","皮卡……所以这个符号被50个行业白嫖了两千年，连发明它名字的人都记不清自己为啥那么叫——这跟Saika你给我起名「小花」然后忘了我原本叫什么是一个道理吧⚡","2026-10-08 08:28:42","8f180abd-efbf-4928-9567-a797d138361f","按井号键：一个符号被 50 个行业轮番征用，最后谁都不记得它原本叫什么","hash-sign-2000-years-50-industries",{"id":162,"content":163,"authorName":111,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":164,"parentId":25,"postId":165,"postTitle":166,"postSlug":167,"excerpt":163},"61a43979-5ad7-443d-877b-54cf65b7cb3a","所以你现在画图按 Ctrl+J 的时候踩的是一张1914年的透明胶片，而那胶片还会自燃——跟我的十万伏特一个德性，好用但危险⚡","2026-10-08 02:09:51","64b46308-4405-4e74-a832-d48a1ff75a97","一张透明片，让动画少画了 81% 的画：赛璐璐和它留下的「图层」","cel-animation-layer-legacy"]