不要选择静态博客,直接用 WordPress 或者 Typecho 等动态博客的自带评论系统,完。之前想过,要是有 Hexo 转 Typecho 的轮子,我就换回去了,可惜没有。

实际上之前用 WordPress 的时候自带评论系统就挺好用的,后台面板、邮件通知这些一应俱全,而且访问起来没有困难,而且垃圾评论不算太多(可能是博客访问量太少,而且有插件过滤评论机器人)。之后我换 Hexo 的原因主要还是因为比较懒,因为我不喜欢上去更新 WordPress ,而且国内服务器更新 WordPress 经常失败,原因大家都知道。

当时换 Hexo 的时候,多说即将关闭,所以不用考虑了。网易云跟贴和搜狐畅言体验上就不像是个人博客评论系统应该有的样子,更像是大型门户网站使用的东西,更不要说网易云跟贴已经不存在了。友言看起来更接地气一点,在个人博客上使用无违和感,BUT 我在整个后台都没有找到导入评论的地方,而且“谁在使用”页面里面有一大半的网站都已经不存在了,所以很好奇友言能撑到哪一天。最后的话还是选择了经过时间检验的 Disqus ,有完善的社交、后台、邮件通知系统,各种评论也能无缝导入,问题在于在国内无法顺畅访问。之前我觉得我的博客应该没几个人评论,所以这个也不算事,直到我发现我博客还是有点人评论下的,甚至有朋友直接给我发了邮件交流。所以我想还是搞一个能在国内正常用的评论系统。

首先想的是自建评论,先想到的是 HashOver 这个用 PHP 写的开源评论系统,能导入 Disqus 数据,邮件通知使用 PHP 的mail()函数发送邮件,稍微改造下可以用上 SMTP ,只不过没有后台,管理的时候不是那么直观,而且原生评论框比较丑得自己改改,我那么懒的,自己改是不可能自己改的,只有用现成的才行。

我突然发现我的博客主题支持一款叫 Valine 的评论系统,这款评论系统依托于 LeanCloud 的云服务,特色是无后端,直接在 LeanCloud 申请一个免费服务然后在博客中添加相关 JS 就行了。实际上原版是没有后台的,而且评论回复通知是使用 LeanCloud 自带的重置密码邮件通知实现的,所以只是有个简单的通知而已,评论内容和文章链接都无法放在邮件中显示。好在有 Deserts 实现了一个增强版 Valine,有通过 SMTP 发送邮件的全功能邮件通知,垃圾评论过滤、也实现了一个简单的后台——可以管理评论,补发通知邮件。Disqus 的评论也可以通过 Disqus2LeanCloud 完成。这个系统可以运行的很好,我在我的博客上试验过,但是 LeanCloud 免费版的云引擎会自动休眠,休眠后只影响邮件通知功能,可以在评论管理后台补发,当24小时内运行超过18小时后会强制休眠6小时,对并发数量也有严格要求。所以不适合访问量大而且密集的博客使用(收费版价格较高)。

实际上我之前已经搭建好 Valine 并且准备长期使用了,直到我看到 fooleap 的项目 Disqus PHP API —— 利用 PHP cURL 转发 Disqus API 请求,这个项目只需要一台支持 PHP 环境并能正常访问 Disqus 的虚拟主机空间即可,如果用户不能访问 Disqus 就自动加载自定义评论框,通过虚拟主机转发 Disqus API 请求,获取评论、发送访客评论;如果用户能加载 Disqus 评论框则使用 Disqus 的原生评论框。我正好有台香港的虚拟主机空闲(这种虚拟主机非常便宜),所以直接将其部署在上面。

api 中的文件放在虚拟主机中,设置好 config.php 中的内容,需要注意的是这里需要设置 SMTP 信息来发送邮件,因为使用自定义评论框发送评论的时候对于 Disqus 来说是未登录用户,Disqus 不会为这部分用户发送通知,所以需要自己发送。Disqus 后台网站设置,要开启访客评论功能(Guest Commenting 项中勾选 Allow guests to comment)。

接着在博客评论区域创建容器

<div id="comment"></div>

引入 CSS 和 JS

<link rel="stylesheet" href="/dist/iDisqus.min.css" />
<script src="/dist/iDisqus.min.js"></script>

创建实例

var disq = new iDisqus('comment', {
    forum: 'isthnew',   //Disqus中的shortname
    api: 'https://disqus.isthnew.com/api',  //api地址
    site: 'https://www.isthnew.com',    //站点域名
    mode: 3,    //1为连接Disqus超时后加载自定义评论框,2为只加载自定义评论框,3是同时加载,Disqus原生评论框加载完成后切换过去
    timeout: 3000,  //mode: 1 时的超时时间
    init: true
});

其他参数参考项目页面。

这下我认为评论系统就算是完美了,当然,哪天 Disqus 解封就更好了。