disqus已卸载,手搓了套blog评论系统 - req4cmt

一直用 disqus 主要是觉得方便(懒)。但是自从被墙了就很不方便了。加上近期开始强制插入广告,就更讨厌了

想找个替代品,很多基于 github 的,在 issue 盖楼,我觉得不方便备份,希望是能直接写入 repo的。这样一个 git clone 就搬家了。更不用说几乎都是基于 OAuth 的 github 登录实际上能拿到你所有 repo 的 scope,也就是能读写你所有公开(甚至私有)仓库内容。我一般都不点

于是决定手搓一个。

首先考虑的就是如何把内容写入 git repo。这个在做 gitweets 已经调研尝试过了。

本着在 cloudflare worker 白嫖的心态,这种 serverless 的环境肯定不允许装 git 命令行或者 libgit 这种 .so,所以考虑 pure python 的 dulwich。折腾了一下 python binding 发现CF居然是个WASM转译。那还不如js。还好nodejs生态也很丰富,有个纯js的实现 isomorphic-git

然后手搓了一下发现需要个 memfs 在内存里模拟文件IO。

其次是如何读取内容,评论列表以 域名/路径.jsonl 格式保存为纯文本,一行一条评论JSON,方便diff。将来可以做成 pull request 当成 moderation

本来想通过 git-http 来读文件,发现太慢了。干脆走捷径直接反代 https://raw.githubusercontent.com/ 就行。本来也不用反代,一是这个域名被DNS屏蔽,二是加一个该死的CORS头才能跨域。

跑通之后接着就模仿disqus实现页面一段.js嵌入,渲染表单,展示评论列表等等,我的 js/css 实在捉急就搓了套最基础的。

能用就行!

防止spam这方面也没多想,看很多人说做 hidden input 就能拦住绝大部分,那就先这样跑着。除了评论框这个 textarea 甚至名字都是选填

尽可能做兼容,让在没有 .js 的情况下也能提交表单。当然得在嵌入页面的时候弄 <noscript>

该项目严重依赖 cloudflare 和 github 两位赛博菩萨的免费额度,所以请求过多会被控频。实在不行弄个KV队列之类的。但是我这博客这么冷清,多虑了?

最后,把 disqus 老的评论都导出来了。毕竟是多年的回忆。

项目放在 https://github.com/est/req4cmt 欢迎点评。

Comments