menu search

Disqus 评论导入 WordPress

Jan 7, 2018

前几天在硬盘里面翻出了几年前的 Disqus 评论备份,发现有些评论还是不错的,值得导入数据库。

题外:这也是为什么我最终还是决定跑回WordPress,因为Firestore还没有导出/导入的功能(但可以写脚本一个一个拉下来),我都不敢作死。

Disqus 后台有一个导出功能,可以以XML格式获取到站点下所有的评论和文章信息(标题,地址…)。不过这功能大部分人应该都没用过,毕竟导出后根本就不能再次导入 Disqus。

对XML格式不太了解,所以在网上随便找了个 XML to JSON Converter 来减少我的工作。

转换后的格式大概如下:

{
   "thread":[
      {
         "id":"10",
         "forum":"jimmycai",
         "link":"https://jimmycai.org/about/",
         "title":"关于",
         "_dsq:id":"3827045149"
      }
   ],
   "post":[
      {
         "message":"<p>连博客都没有的只能干瞪</p>",
         "createdAt":"2015-08-21T03:28:18Z",
         "isDeleted":"false",
         "isSpam":"false",
         "author":{
            "email":"{{# Email Address}}",
            "name":"Wair Chan",
            "isAnonymous":"false",
            "username":"wairchan"
         },
         "ipAddress":"{{# IP Address}}",
         "thread":{
            "_dsq:id":"3827045149"
         },
         "parent":{
            "_dsq:id":"2282076939"
         },
         "_dsq:id":"2206176180"
      }
   ],
   "_xmlns":"http://disqus.com",
   "_xmlns:dsq":"http://disqus.com/disqus-internals",
   "_xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
   "_xsi:schemaLocation":"http://disqus.com/api/schemas/1.0/disqus.xsd http://disqus.com/api/schemas/1.0/disqus-internals.xsd"
}

一点一点的来解析下:

  • thread[]下存放着站点下所有用过 Disqus 的文章信息
    • _dsq:id:文章ID
  • post[]下是站点所有的评论,已经按从旧到新的顺序排列好了
    • author.name:名字
    • author.email:邮箱
    • ipAddress:IP地址
    • message:评论内容
    • createdAt:评论时间,ISO 8601 格式
    • _dsq:id:评论ID
    • thread['_dsq:id']:评论对应的文章ID
    • parent['_dsq:id']:父级评论ID

和WordPress评论格式相比缺了User agent 和 网站的字段,不过这两样其实无所谓。

为了不浪费时间找Node.js的Mysql适配库,决定直接合成SQL语句并使用phpMyAdmin 导入。

WordPress 每条评论的SQL格式是这样的:

(1001,'303','Jimmy','[email protected]','','192.168.1.1','2015-08-27 22:45:12','2015-08-27 22:45:12',"应该是因为hover触发的原因,明天改成点击加class",0,1,'','',1000,0)

导出成JSON是这样子的:

{
    "comment_ID": "1001",
    "comment_post_ID": "303",
    "comment_author": "Jimmy",
    "comment_author_email": "[email protected]",
    "comment_author_url": "",
    "comment_author_IP": "192.168.1.1",
    "comment_date": "2015-08-27 22:45:12",
    "comment_date_gmt": "2015-08-27 22:45:12",
    "comment_content": "应该是因为hover触发的原因,明天改成点击加class",
    "comment_karma": "0",
    "comment_approved": "1",
    "comment_agent": "",
    "comment_type": "",
    "comment_parent": "1000",
    "user_id": "0"
}

值得注意的是在SQL语句里面数字是不带""的,不知道为什么导成JSON会带。

转换脚本

用Node写了个非常乱的脚本,凑合能用。其实也可以用浏览器来执行,可我数据太多,粘贴到控制台就卡住了。

使用指南

  • 到Disqus后台导出评论
  • 使用  XML to JSON Converter 把XML格式的导出文件转换成JSON格式 (Prefix attributes with: _dsq:
  • 随便创建个文件夹,并在里面放上我提供的文件
  • disqus.json里面粘贴上转换好的数据
  • postIDs.json里面需要存放新旧ID的关系数据
    • 格式:"OLD_DISQUS_ID": "NEW_WORDPRESS_ID"
  • 执行 npm install turndown  ,用来把HTML转换为Markdown格式
    • 如果不需要转换请删除相关的调用

我并没有打算转移所有的评论,在index.js 67行处我使用了.filter()来过滤出我想要的评论。(筛选出所有处于该文章下的评论)

AUTO_INCREMENT值的意义和MYSQL数据库中的一样,都是为了提供一个独一的数字ID(从哪里开始),请自行调整。

准备好了之后就可以执行 node index.js了,如果没有问题的话会在同一个文件夹下生成一个 importDisqus.sql文件。

把里面的内容复制出来,并粘贴到import.sql的最下方。然后就可以把这个文件通过phpMyAdmin 导入数据库了。

测试环境:Node 8.9.1 & phpMyAdmin 4.6.6


一共导入了几百条旧评论。这些评论还是躺在自己的数据库里面安心。同时希望以后不要再干这事情了,数据转换来转换去特别费精力。

另外还发现了博客 2013 - 14 年时期的数据库备份,不过那都是满满的黑历史,还是不转移好了。

Photo by Brandon Lopez on Unsplash

Comments

edit x send markdown image
paragraph comment heart