再见,多说
目录
多说关闭
国内的博客评论服务就那么几家,做的最好的就是多说了。对第三方SNS帐号的整合,符合国人的操作习惯,以及免费特性等,多说在国内算是做的比较出色的。虽然多说的问题也很多,如垃圾评论,头像https,嵌套评论脏数据,其他各种bug等等…但是这些都不重要了。由于没有找到盈利模式,今年(2017)的6月1号多说将正式关停服务。
选择disqus
唏嘘过后,还是要解决问题。多说既然关了,迁移自然也就提上日程。选择性不多,最后还是选择了disqus。
disqus在综合各方面来看,其实都比多说要好,最大的问题是,disqus由于不可描述的原因,在国内是无法访问的。但是还是有解决方案的。
由于懒癌犯了,再加上最近确实没太多精力,一直拖到现在才开始折腾博客评论的迁移工作。
数据迁移
当初从wordpress迁移到hexo费了不少劲,迁移评论也差不多。果然该来的总会来的,这块的工作量也是逃不掉。
迁移工具
网上一堆版本,我就试了其中两个工具,将从多说后台导出数据转换为disqus支持的Generic (WXR)格式:
- JamesPan/duoshuo-migrator :python版转换工具, JamesPan的博客 中对迁移过程描述的比较细致,可惜工具导入时报错,而且似乎也疏于维护了,便换用下面的PHP版迁移工具;
- duoshuo-migrate-to-disqus :取自 Urouge的博客 中的PHP版本迁移工具 ,在迁移时遇到点问题,PHP的改起来比较快捷,便修改了一下整到gist中;
迁移工具的操作方式,上述作者的博客中都有了详细的叙述,这里就略去不提。
踩坑记录
- 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,或者需要更高级别的操作时(如登录发表评论),再加载原始的评论框。
创建代理
感谢fooleap的disqus-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的兼容问题,不确定是否通用;移动端貌似也有点问题,但是移动端涉及的设备太多了,没法兼顾。