最近帮家属装修她的博客,我发现装修博客比写博客有意思多了,于是也动起了装修自己博客的念头。本文记录了我把博客的评论系统从 Disqus 更换为 Twikoo 的过程。

一、越来越烂的 Disqus

本博客的搭建工具/平台经历了三个阶段:

  • 2009 年~2010 年:搭建在 Blogger.com 上——当时 Blogger 已经被 Google 收购了;
  • 2010 年~2017 年:「自豪地由 WordPress 驱动」——迁移到自建平台的原因我记不清了,似乎是因为 Blogger 被墙了;
  • 2017 年~现在:使用 Lektor 静态生成。

静态博客相比 WordPress 虽然有诸多优点,但最大的问题在于评论系统很难做成静态的。我刚把博客做成静态的时候想着干脆不做评论系统了,读者如果想留言就寄送电子邮件。后来考察了一番,还是加了一个 Disqus 评论系统,但默认不加载,需要访客点击启用——我看到那一堆慢吞吞的 JavaScript 加载动画实在是心烦。

用了几年 Disqus 之后,这货逐渐走上了 enshittification 的道路。免费用户的网站将被 Disqus 强制插入广告,不仅占地面积很大,且内容多为猎奇 clickbait。请看友人的博客上被 Disqus 插入的巨幅猎奇广告:

rerox-com-disqus-ads

出于未知原因,我的 Disqus 继承了一个祖父计划,因此没有广告:

disqus-plus-plan

但我依然对 Disqus 不满。尤其是 2021 年时,有至少十个月,甚至可能长达一年的时间,Disqus 的邮件通知完全是坏的。现在想来,难道是因为 COVID-19 的影响,Disqus 的某些基础设施崩坏了而无人发现或无法修复?

在 2022 年初的时候 Disqus 的邮件系统修好了,我又能收到邮件了——但所有的邮件都会进 Spam!直到本文写作时为止,Disqus 给我发的邮件还是会被 Gmail 归到 Spam 里。哪怕我一遍一遍点 Not Spam 也没有用:

gmail-disqus-spam-1
gmail-disqus-spam-2

二、静态网站评论系统考察

因为 Disqus 越来越烂,我就想找替代品,但 Disqus 又没有烂到完全不能用(尤其是我有无广告祖父计划),所以我也没有太强的动力去折腾更换。两年前,家属使用 Hugo 重建博客,也面临了评论系统选择的难题。家属并没有无广告 Disqus 账号,也不想为了评论系统交 $12/mo 的天价保护费去广告,那就自建吧?

「家属重建博客」和上文提到的「友人发现他的博客被 Disqus 插入巨幅广告」这两件事是差不多时间发生的,当时我和友人也讨论了一下自建博客评论系统的选择。最终友人为自己的博客搭建了 Golang 写的 Remark42,我为家属的博客搭建了 Python 写的 Isso,我自己的博客则继续用 Disqus。

两年后的现在,我帮家属博客装修的时候发现:友人的 Remark42 不知何时挂了,家属博客的 Isso 虽然还在跑着但是有内存泄露问题,只有 Disqus 依然在苟活。这时候我突然想通了一件事:

静态博客的优点就是无状态、轻量,不需要操心操作系统和软件更新的问题,运维成本极低;如果再自己维护一个评论系统,就把这些优点全部抵消了!

如何解决这个问题呢?像 Disqus 这样的全托管平台也是有的,但是我是不敢用的。自建平台又往往需要在自己的服务器上跑一个 Python / Node.js / Golang 程序,怎么办呢?

在对比调研各种评论系统的过程中我发现了一个全新的视角:serverless 部署。仔细想想,评论系统的后台其实需要处理的事件并不多,无非就是发表评论、拉取评论列表、编辑或删除自己发的评论,最多就是再加个邮件通知功能。这些功能都是可以在一个 HTTP 请求里完成的,这不是正是 serverless computing 最擅长的赛道吗?用 serverless 的评论系统,我就不需要担心运维问题,也不需要占用自己服务器的 RAM,同时又维持了自己对数据的掌控。

经过一些对比,我最终选择了 Twikoo 评论系统。这一评论系统支持运行在多个 serverless 平台上,使用 MongoDB 作为存储,支持消息推送和邮件通知。根据 GitHub 上的信息,作者还是一个大学生,应该是 00 后吧。顺便,Twikoo 用的消息推送 SDK 也是同一作者写的。年轻有为啊!

三、搭建 Twikoo

Twikoo 被许多简体中文独立博客所采用,搭建教程一大把。不少 serverless 平台提供一定的免费额度,足够运行 Twikoo 了,照着官方教程很快就能搭一个出来。我又写了一个脚本,把 Isso 的 SQLite 里的评论转成 Twikoo 的 JSON 格式再导入——家属的博客就这样从 Isso 迁移到了 Twikoo 评论系统。

发现了 Twikoo 的好,我也想给自己的博客换上。但作为一个 System Reboot Engineer,我对 serverless 平台的要求更高一些,我想要 IaC。家属的 Twikoo 是搭建在 Netlify 上的,而我一直在用 AWS 全家桶,为什么不试试在 AWS Lambda 上跑呢?尤其是两年前 AWS Lambda 增加了 Function URL 功能,不需要配置 API Gateway 了,使用起来更方便了。

Twikoo 本来没有专门对 AWS Lambda 做适配,于是我根据 AWS Lambda Function URL 的文档给上游贡献了一些代码,使它成功地在 AWS Lambda 上跑起来了。

AWS Lambda Function URL 的地址形如 https://axtoiiithbc3vetyqfgq7ozalu0cnkii.lambda-url.us-west-2.on.aws/,真的太长太丑了!反正我的博客本来就在用 AWS CloudFront,干脆加到博客的 wzyboy.im 域名下,这样还能减少一次 CORS preflight 请求

四、导入 WordPress 及 Disqus 里的评论

七年前我从 WordPress 迁移到静态博客的时候,没有迁移评论。后来用上了 Disqus 评论,我也没把 WordPress 评论导入进去。但是现在既然用上了一个数据操作更加方便的平台(指可以直连 MongoDB 进行操作),我就想把 WordPress 和 Disqus 的评论都导入到 Twikoo 里。

Twikoo 支持导入 WordPress 的评论,然而我的 WordPress 早在七年前就已经停服了。我一直留着数据库备份,与其把整个 WordPress 复活再用插件把评论导出,不如直接对数据库进行操作,导出成 Twikoo 的格式而不是 WordPress 的格式。于是我把七年前的数据库备份导入 MariaDB,再快速糊了一个 Python 脚本wp_comments 表里评论导出成 Twikoo 使用的 JSON 格式,然后在 Twikoo 的管理界面导入进去。

Twikoo 也支持导入 Disqus 的评论。我从 Spam 里捞出 Disqus 给我发的评论导入邮件之后,一键导入 Twikoo,才发现这里面居然还有不少垃圾评论(在 Twikoo 里显示为隐藏评论,只有管理员能看到)。这里面有些是真的垃圾评论,有些是 Disqus 误报的。我在 Twikoo 里对这些垃圾评论进行了处理。另外 Disqus 导出的 XML 里不包含 email 字段,无法从 Gravatar 拉取头像。别人的评论没办法,我自己的评论还是可以二次处理一下的。于是把刚刚清理过后的评论再次导出,把我发表的评论都加上我自己的邮箱等信息,然后清空 MongoDB 重新导入,这样就有头像了。

至此,旧评论全部导入到了 Twikoo 里。一共从 WordPress 导入了 1734 条评论,从 Disqus 导入了 211 条评论。其中 WordPress 的评论也包括了 2009 年从 Blogger 导出的评论。

五、尾声

Twikoo 默认打开了展示 User-Agent 的功能,会显示评论者的操作系统和浏览器信息。翻看一下老评论,看到各种 Windows XP、Google Chrome 5.x、Android 1.2 啥的,感觉好怀念!仿佛回到了十几年前,一大批 WordPress 独立博客如雨后春笋遍地蓬勃生长的时代,那时候不少博客都装了一个显示评论者操作系统和浏览器信息的插件。

在我写作本文的时候我刚好读到一篇文章,讲因为中国大陆独特网络环境——内容审查、封闭花园、移动互联网兴起导致传统网页衰落——简体中文互联网上公开的内容,尤其是较旧的内容,正在快速消亡。本博客虽然近年来更新不多,但也已经存续了 15 年,我将尽我所能让它继续存在下去,不要轻易消亡。通过复活 2009 至 2017 年间的旧评论,我也希望能为对抗 link rot尽一份绵薄之力。

那么,欢迎在全新的评论系统里留下评论。《隐私声明》也已更新。


欢迎留下评论。评论前,请先阅读《隐私声明》。