目录

  1. 多说关闭
  2. 选择disqus
  3. 数据迁移
    1. 迁移工具
    2. 踩坑记录
    3. 遗留问题
  4. disqus代理
    1. 代理方式
    2. 创建代理
    3. 解决问题

多说关闭

国内的博客评论服务就那么几家,做的最好的就是多说了。对第三方SNS帐号的整合,符合国人的操作习惯,以及免费特性等,多说在国内算是做的比较出色的。虽然多说的问题也很多,如垃圾评论,头像https,嵌套评论脏数据,其他各种bug等等…但是这些都不重要了。由于没有找到盈利模式,今年(2017)的6月1号多说将正式关停服务。

选择disqus

唏嘘过后,还是要解决问题。多说既然关了,迁移自然也就提上日程。选择性不多,最后还是选择了disqus。

disqus在综合各方面来看,其实都比多说要好,最大的问题是,disqus由于不可描述的原因,在国内是无法访问的。但是还是有解决方案的。

由于懒癌犯了,再加上最近确实没太多精力,一直拖到现在才开始折腾博客评论的迁移工作。

数据迁移

当初从wordpress迁移到hexo费了不少劲,迁移评论也差不多。果然该来的总会来的,这块的工作量也是逃不掉。

迁移工具

网上一堆版本,我就试了其中两个工具,将从多说后台导出数据转换为disqus支持的Generic (WXR)格式:

迁移工具的操作方式,上述作者的博客中都有了详细的叙述,这里就略去不提。

踩坑记录

  • threads里空url会导致导入时报错。这个是多说后台的脏数据,一些不存在的文章(或者草稿)虽然在后台里处理删除过了,但是在导出的json中仍然存在,甚至还有循环嵌套的上级评论id。多说的历史数据确实问题不小,导出的数据基本都要检查处理一下。
  • 换行符问题。转换为xml,导入disqus时,估计disqus导入逻辑有bug,一些文章的特殊情景的换行符\n无法正确识别,会报错XML syntax error并终止导入。折腾了一会,发现替换为\r可以避免这个bug,并且导入disqus后会被转换为<br>标签,对评论的换行没有影响。
  • disqus对域名需要精确匹配的,于是在脚本中添加匹配,对自己的域名做了匹配,统一https协议头和最后的/ (非必需,代码中已注释);

遗留问题

  • 导入到disqus的评论都是匿名评论,且没有头像。这个是由于disqus的机制决定的,disqus提供的api只能导入匿名评论,而且,哪怕是disqus自己导出的评论,也不支持再次重新导入。
  • 由于上面这个原因,连博主本人的评论也只能作为匿名评论导入。但是api是支持导入自己的信息的(见官方文档中的Format部分注释),翻了一圈文档,需要SSO登录才能带上自己的头像等信息。但是,SSO单点登录在disqus中需要Pro订阅才行,只能作罢。

disqus代理

代理方式

使用PHP的curl代理转发请求。利用disqus公开的api,获取文章信息和评论列表,使用其半公开的一个public的token,发表匿名评论。前端部分构造评论框,修改请求地址,实现查看和发布匿名评论的基本功能。如果用户能够访问disqus,或者需要更高级别的操作时(如登录发表评论),再加载原始的评论框。

创建代理

感谢fooleapdisqus-php-api,是现阶段比较完善的一个代理disqus的解决方案了。后端使用PHP,降低了搭建难度。毕竟相比于VPS,还有大量的php主机空间可供使用,能带来更多高速和低成本的选择。

解决问题

搭建过程还算顺利,遇到了几个问题记录一下备忘:

  • 由于是从Hexo的主题tranquilpeak移植魔改的,手动剔除了tranquilpeak的disqus代码,单独加载css和js。虽然css多了一个请求,但js使用简易评论框加载的东西还更少了。之前需要手动在Markdown中设置每篇文章的identifier作为唯一性标识ID,使用新的接口匹配的是url,解除了对identifierID的依赖,看起来更好了。但是要是换域名的话,可能会有麻烦。

  • curl相关函数CURLOPT_SSL_VERIFYPEER需要置为false。部分PHP空间支持HTTPS,但是不能很好的检查SSL证书,SSL certificate problem将导致curl结果为null;

  • 修改选择匹配,解决了当页面中有名为comment的class时的问题。不过目前评论框使用comment作为选择器id,不够灵活,毕竟每个人的博客都不一样,其他地方要是也有一样的id会出问题。

  • 修改comment-header的兼容问题,不确定是否通用;移动端貌似也有点问题,但是移动端涉及的设备太多了,没法兼顾。