重构英语:第20个月
一句话总结
在与爬虫机器人斗争的同时,图书销量增长了两倍。
刚来这里?
你好,我是 Michael(迈克尔)。我是一名软件开发者,也是几家小型独立科技企业的创始人。目前,我正在写一本名为 Refactoring English(《重构英语:面向软件开发者的高效写作》)的书。
我每个月都会像这篇文章一样写一篇回顾,分享这本书以及我的整体职业生活进展如何。
亮点
- 7月的图书销量是6月原本就很强劲的销量的三倍。
- 我正在与世界上最愚蠢的 scraper bot(爬虫机器人)斗争。
- 我正在使用 AI 制作一款多人浏览器游戏。
目标评分
每个月开始时,我都会宣布自己希望完成的事情。以下是我相对于这些目标的完成情况:
联系5档播客,谈谈《重构英语》
- 结果:只联系了一档播客
- 评分:D
我花了很多时间为 Talking Postgres 准备推介,但后来发现主持人除了 LinkedIn 之外没有任何联系方式。所以我给她发了一条 LinkedIn 消息,但一直没有收到回复。不过,我曾经做客 The TMPDIR Podcast,只是他们在我联系他们之前就已经邀请了我,因此不能算在这里。
为《重构英语》网站吸引3万名独立读者
- 结果:网站有2.38万名独立读者
- 评分:B
我私下里其实把这个目标想成“让一篇文章登上 Hacker News 首页”,但即使做到了,读者数量仍然没有达到3万。
结束 early access,并宣布我的书正式发布1.0版本
- 结果:仍未发布1.0版本
- 评分:D
最后,我花在回复用户反馈上的时间比预想的多。我制作的反馈应用运行良好,但它也会带来难以预测的新工作。
《重构英语》数据
| 指标 | 2026年6月 | 2026年7月 | 变化 |
|---|---|---|---|
| 独立访客 | 17,523 | 23,817 | +6,294(+36%) |
| 预购收入 | $1,441.86 | $3,908.80 | +$2,466.94(+171%) |
6月是 Kickstarter 众筹结束后我的书销量第二好的月份,但7月的销量又是6月的三倍。
销量跃升的主要原因是我结束了 early access 折扣。我在7月13日宣布,early access 定价将于7月20日结束,价格会从30美元上涨到49美元。
促销的最后一天,我发布了一篇名为《为什么我停止“创作内容”》的博客文章,登上了 Hacker News 首页。随后,它又成为了bubbles.town 当天的热门帖子。bubbles.town 是一个类似 Hacker News、但更偏独立社区、没那么以科技为中心的网站。
促销最后一天的销量大幅飙升,光那一天的销售额就超过了1,000美元。
我把价格提高到49美元后,销量很快暴跌,这在我的预料之中。等这本书正式发布1.0版本后,我打算进一步试验定价。
我正在与世界上最愚蠢的爬虫机器人斗争
我在周一发布博客文章后,访客数量大幅增加。到了周二,又出现了一次巨大的流量激增:

看到访客数量大幅增加时,我以为是某个热门博主链接了我的文章,后来才意识到肯定是机器人。
所有访客都去了Hacker News 热度竞赛。以前也发生过这种事:某个博主谈到自己在竞赛中的排名,并链接到我的工具,我就会看到访客数量大幅增加,但从来没有像这次这样,也从来没有出现过如此持续的访客浪潮。
看到第二次流量峰值时,我想:“哇,我这周势头真不错!”我正把这件事告诉妻子,突然意识到:
我今天又多了5万名访客!我甚至不太确定他们是从哪里来的。我猜是有人在 Twitter 上发了链接。
等等,如果有人在 Twitter 上发了链接,我应该能看到 Twitter 是引荐来源。
哦……是机器人。
我查看日志后发现,所有请求使用的浏览器 user agent 都完全相同:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36这是 Chrome 125,也就是一个已经过时两年多的浏览器版本。浏览器版本让识别这些机器人变得很容易,因为我的博客读者中不太可能还有人使用这么老的浏览器。
这个爬虫似乎只是在反复加载竞赛根页面,然后一遍又一遍地点击每个链接,所以我试着和它玩点心眼。我在 Bunny 上放了一个重写脚本,检查 user agent,如果发现是这个爬虫,就返回一个伪造的响应。这样,它得到的就不是包含3,000多个链接的页面,而是只有三个链接的页面。
不知为什么,我的伪造响应没有奏效。我怀疑爬虫已经把完整的 URL 集合添加到了数据库中,因此把这些链接从首页隐藏起来并没有作用。
我尝试了限速,但 Bunny 支持的最低速率限制是1 KB/s,而这个应用的大部分数据都存放在每个只有几 KB 的文件中。这个爬虫在大约100个不同的 IP 地址段之间轮换,所以我无法按 IP 限制流量。
最后,我干脆按 IP 地址段进行封锁。我用 vibecoded(凭感觉编程)的方式制作了一个工具,从 Bunny 日志中筛选出特定的 user agent,并收集与这次攻击相关的所有 IP。这一招奏效了,但一周后攻击又从新的 IP 和一个更新程度略高的新 user agent 发起了。于是我重新运行脚本,更新了要封锁的 IP 列表,目前看来这样做有效。
这次攻击最奇怪的地方是,这些机器人根本不在乎自己被封锁了。它们还是不停地轰击服务器。我本以为它们会说:“哦,过去两周这些请求在 TCP 层面已经被100%拦截,没必要继续浪费计算资源和带宽了。”但显然它们完全不介意。

即使我封锁了攻击者的 IP,他们仍然不停地发起请求。
攻击开始当天,我联系了 Netlify 支持,但他们毫无用处。每次回复我都要等一周。我觉得第一封回复是 AI 生成的,因为它让我修改一些根本不存在的设置。第二封回复看起来更像是人写的,但基本上是在说:“看起来你已经在我花两周回复你的时间里解决了这个问题,所以我也没什么可做的了!”幸好,我提出要求后,他们退还了多收的55美元费用。
静态网站应该托管在哪里?
我的所有静态网站都托管在 Netlify 上,而他们的服务一直在变得越来越差。不过,他们对这次爬虫机器人攻击完全漠不关心,这促使我去寻找一家能更主动地处理爬虫机器人的供应商。
显而易见的答案是“Cloudflare”,但互联网基础设施有太多部分集中到了 Cloudflare,这让我感到担忧,所以我不想进一步加剧这种集中。
我也考虑过直接托管在 VPS 上,或者使用 VPS 加 Bunny 作为 CDN,但我不希望自己登上 Hacker News 首页的那天,因为 VPS 崩溃或我错误配置了 Bunny 的缓存,导致网站下线。我希望找到一种解决方案,只需要付钱让别人负责保持网站在线。
- Surge
- 优点
- 专门做静态托管,这正是我想要的
- 带宽不限,因此他们会承担爬虫机器人攻击的费用
- 缺点
- 似乎由一个人运营,因此宕机风险更高
- 所有管理操作都通过他们的终端应用完成,没有 Web 应用
- 看起来不支持多因素身份验证,不过他们似乎正在开发该功能
- 上传过程会无条件上传每个文件,而不是像 rsync 那样只同步发生变化的文件;对于只进行增量修改的大型网站来说,这很麻烦
- 优点
- statichost
- 优点
- 由一个人运营,因此客户服务响应迅速且全面
- 主要专注于静态托管,没有额外的复杂功能
- 缺点
- 由一个人运营,因此宕机风险更高
- 上传过程会无条件上传每个文件,而不是像 rsync 那样只同步发生变化的文件;对于只进行增量修改的大型网站来说,这很麻烦
- 不包含爬虫机器人防护
- 把网站构建和托管捆绑在一起,但我只想要托管
- 主要卖点是以欧盟为中心,但我人在美国
- 优点
- Vercel
- 优点
- 声称可以防止 DDoS / 爬虫机器人攻击
- 我认为他们支持 rsync 风格的上传
- 缺点
- 庞大而复杂的服务
- 我没有理由相信 Vercel 会比 Netlify 更好地对待我
- 优点
- 在 Bunny CDN 之上自行构建解决方案
- 我考虑过这个方案,但要在 Bunny 上实现增量上传和原子部署,本身就会成为一个复杂的项目
Mikeville:我那款尚未完成的多人浏览器游戏
我一直在试用一台托管在云上的小型服务器,但它有4个 CPU 和8 GB 内存,而且大部分时间都处于闲置状态。如果我有一台性能不错、还有富余容量的服务器,托管点什么供朋友们玩会比较有趣?
游戏怎么样?我见过 Valheim 和 ARK 这类可以自行托管的游戏,但似乎对这些游戏来说,必须同时有其他玩家在线才好玩。
我每隔几个月才玩一次电脑游戏,所以我想要的是这样一种游戏:如果同时有其他人在场,我可以随时上线玩得开心;即使我不在,也能回来看看发生了什么。我心中的感觉,就像我和朋友共同拥有一栋海滨别墅,偶尔一起去度假;如果各自单独来过,还会给彼此留下便条和礼物。
问题是,我想不出该如何把这种“海滨别墅”的感觉转化为具体的游戏概念。
目前,我正在探索 vibecoded 游戏开发(氛围编程游戏开发)是什么样的,并看看哪些东西能带来乐趣。我为这个原型设计时想到的两款游戏是 Stardew Valley 和 Ultima Online,这两款游戏我都玩过很多个小时。
如果你想玩,可以直接在浏览器中体验这款游戏:
如果你想来参观,我今天会在线一小会儿。源代码目前放在 GitLab 上,直到我找到更好的 Git forge。
我喜欢的博客文章
- Stripe 只想要一个数字
- 我喜欢 exe.dev 的博客,也觉得他们思考问题的方式很有意思,尤其是对于会影响小型软件供应商的软件问题。我没有复杂到能从这种方法中受益的计费逻辑,但原则上我觉得这个想法很不错。
- 我网站99%的流量都是机器人
- 结合我这个月与爬虫机器人的经历,我觉得这篇文章很有共鸣,也很有帮助。我还很喜欢其中定制的插图。
- 我后悔迁移到了 Codeberg
- 过去一年里,我一直在把项目从 GitHub 迁移到 Codeberg,而且还是付费会员,但现在我后悔在这个平台上投入了时间。它经常发生故障,服务器也常常会过载好几天。最后让我下定决心的是 Codeberg 禁止使用 AI 的项目这一决定。我可能还没达到“过度”使用 AI 的武断标准,但我仍然打算迁往别处。
- 超级马里奥推导
- 这是一种很巧妙的 Nix 技巧:作者使用 Nix 属性,在模拟器中编码《超级马里奥3》的游玩状态。例如,
nix build '.#level1.rightb.rightb.rightab.rightb'表示从第1关开始,依次按下 Right + B(向右奔跑)两次、Right + A + B(奔跑并跳跃),以及再次按下 Right + B(向右奔跑)。Nix 会缓存所有游戏状态,因此你改变一次按键操作后,只需重新计算与之前运行结果不同的部分。
- 这是一种很巧妙的 Nix 技巧:作者使用 Nix 属性,在模拟器中编码《超级马里奥3》的游玩状态。例如,
总结
下个月的目标
- 联系5档播客,谈谈《重构英语》。
- 为《重构英语》网站吸引3万名独立读者。
- 宣布我的书正式发布1.0版本。
求助
- 如果你有静态网站托管方面的推荐,请告诉我。
- 如果你认识 Claire Giordano(克莱尔·乔达诺),请告诉她,我会是 Talking Postgres 的合适嘉宾(聊技术写作,不是聊 Postgres)。
随机一篇博客
