博客评论系统迁至 Remark42
静态博客本身是无法支持评论的,因为没有服务端程序接收请求,只能求助于系统外的服务。
目前虽然评论系统很多,但综合考虑能够真正用起来并且很稳定的很少。
最初搭建博客的时候,我使用的是多说,但随着多说的关闭,静态博主们一直都处于比较难受的状态。
虽然后来大家把 Serverless、GitHub issues 用得淋漓至尽,但这样使用基本都存在安全隐患。
试想如果你的评论系统让访客感觉不安全,你的文章内容有那么大的价值让访客冒着风险去评论吗?
我怕是没有的。这样即使再优秀好看的评论系统也仅是摆设罢了。
所以长时间以来,我还是一直停留在了 Disqus。
直到前段时间无意中发现了 Remark42,决定换来试试。
特别说明:Remark42 并不是开箱即用,需要自己搭建服务甚至修改主题,如果你自己没有服务器来部署或者没有能力修改主题,Remark42 并不适合你。
既然 Remark42 这么麻烦,为什么我还要选择它呢?
那么我就来说说之前我在用的 Disqus 和尝试过使用的一些评论系统,大致分为以下几类:
- 基于第三方:Disqus/Livere/Valine.js
- 基于 Github issues:Gitment/Gitalk/utterances/Vssue
- 纯静态:Staticman
- 自建:ISSO/HashOver/Remark42
Disqus
作为业界的龙头老大,相信大家都已经很熟悉了。
舍弃的原因主要是不通过技术手段无法正常访问。
虽然我博客的受众基本都是技术人员,技术手段也都多得是,但还是挺不方便的。
另外 DisqusJS 虽然可以使用,但只能浏览,不能评论。
Livere
韩国的一家评论系统,支持中文,使用邮箱注册。支持国内多家社交平台登录。
目前可以正常访问,但速度感人。
另外参考“前车之鉴”,从长远来看也“不保险”。
Valine.js
一款基于 LeanCloud 的评论系统。
这是一个很轻量的评论系统,就功能性方面来说,Valine.js 几乎是满分。
但是 Valine.js 是有隐私泄露风险的,详见 issue #336
另外这种只能让自己填昵称、邮箱、网址的原始评论方式,我真的有些接受不了。
还有就是从 1.4.0 之后它再不开源了
由于某些原因,src目录将从 v1.4.0 后暂停更新.
Gitment/Gitalk/Vssue
这些都是基于 GitHub issues 的评论系统。
- Gitment 只支持 GitHub 登录,基于原生 JS 开发,已经长期不维护了。
- Gitalk 也是只支持 GitHub 登录,基于 Preact 开发。
- Vssue 的灵感来自于 Gitment 和 Gitalk,但是和它们有些区别:
- Vssue 支持 Github、Gitlab、Bitbucket、Gitee 和 Gitea
- Vssue 可以发表、编辑、删除评论(Gitment 和 Gitalk 仅能发表评论)
- Vssue 是基于 Vue.js 开发的,可以集成到 Vue 项目中,并且提供了一个 VuePress 插件
这里边界面和功能上我是比较喜欢 Gitalk 和 Vssue 的,但是当在 demo 站上登录授权的时候,我犹豫了
下面两张截图是我截取的 Gitalk 和 Vssue 的权限列表。它们能够 读写 授权者 所有的公共仓库 ,也就是说拿到你的授权 Token 的人,可以将你的 GitHub 公共仓库删空
utterances
这时就不得不说 utterances 了,它是个 GitHub App,它的权限仅限于某个仓库,要安全许多
虽然安全隐患不用那么担心了,但是这丫的设计真是有问题——它的评论框在评论列表的下方!
要发一条评论,我还得先看完整个评论列表?
另外它的评论列表的顺序是按时间顺序排列的,有人在 14 Nov 2019 提了个时间倒序排列的 PR #222,然而至今都没被接受。
Staticman
Staticman 的原理是提供一个 API,将用户提交的评论内容转换成格式化文本(yaml、json),然后以文件方式上传到指定 GitHub 仓库中。
这可能是最符合静态博客理念的一个三方评论应用,它只提供接口服务,你可以自由设计表单项、表单样式和数据存储结构。即便有一天接口挂掉了(最近就是挂掉了的状态),你的评论依旧会和你的博客在一起,同生共死。
它的最大缺点则是不稳定:它的使用者众多(国外居多,国内似乎没什么人用),而作者明显不具备无偿奉献精神,应用部署在免费的三方平台上,所以当请求量过大时,它就会挂掉。
当然你可以把它的开源源码拉到服务器上部署了,或者使用 Serverless。
但还有个问题,由于它的发布流程挺长的(接收请求后,创建一个 yaml/json 文件,写入 GitHub 仓库,GitHub 接收到 push 请求后会通知我的服务器,我的服务器收到通知后就把 repo 拉取过去 build,生成静态页面后部署),这期间要经过多次网络传输,从访客发布评论到刷出评论,要经过挺长一段时间的,使用体验欠佳。
ISSO/HashOver
ISSO 是基于 Python 开发的,其 demo 看起来比较简陋,不符合我的审美。
HashOver 是基于 PHP 开发的,即使它现在已经开始 2.0 的开发了(hashover-next),但是给我的感觉还是像回到了上个世纪逛 BBS 的感觉。
Remark42
Remark42 是一个基于 golang 的评论系统,它使用 boltdb 存储用户的评论信息。
功能上也挺丰富的,支持 Markdown、emoji,支持 GitHub、Google、Facebook、Twitter、Yandex、邮箱、匿名登录,颜值也还算可以,支持浅色和深色模式。
如下是它在使用 GitHub 登录时所需的权限
虽说需要部署,但是因为文档写得不错,并且提供了基于 Docker 的部署方式,部署起来很 easy。
当然有一点:如果你部署的机器是位于国内,就不要去折腾 Google、Facebook、Twitter 这些的登录了,徒劳的。
Telegram notifications
Remark42 在收到新评论时可以通过 Email 或者 Telegram 来发送通知消息,邮件试了好几个没找到既免费又好使的,就用 Telegram 了
配置步骤如下:
- 在 Telegram 里搜索
BotFather
- 给
BotFather
发/newbot
以创建一个新 bot - 按提示给 bot 设置昵称和 username(注意 username 必须以
_bot
结尾) - 创建完 bot 后就会得到一个 token,以配置 Remark42
1
2- NOTIFY_TYPE=telegram
- NOTIFY_TELEGRAM_TOKEN=12345678:xy778Iltzsdr45tg - 创建一个 private 的 channel,并将刚刚创建那个 bot 添加为这个 channel 的 administrator
- 给 bot 发送一条消息,例如
/my_id @your_bot_username
- 访问
https://api.telegram.org/botXXX:YYYY/getUpdates
,将XXX:YYYY
换为你的 bot token - 找到
"chat":{"id":-zzzzzzzzzz,
,-zzzzzzzzzz
就是这个 channel 的 chat_id - 然后将这个 chat_id 添加到 Remark42 的配置
1
- NOTIFY_TELEGRAM_CHAN=-1001055587116
- 重启 Remark42 服务即可
目前这个博客的评论系统已经换成 Remark42 了,大家可以试试看。 😁