一、追忆往昔

第一次接触社交化评论类产品大概是在2012年左右,当时国内知名度较高的有多说、友言等,国际上比较有名的有Disqus,这类产品的优点在此就不多说了。

用过几款产品后,被多说漂亮的页面和体验所吸引,最终爱上了多说。开源的内容管理和博客系统换过很多,但评论只要能用多说,就一定用它。

后来被 typecho 的精简吸引,本人的个人博客系统也从 wp 换到 typecho,评论也一直用的多说。但 typecho 没有像 wp 那样完善的插件管理系统,看不到数据,加上对第三方的不信任(随时停更),所以也没有安装第三方插件;再加上是多说的死忠粉,实不实时同步到本地数据库也没什么大问题。

2017年3月21日,多说官方发布了一条重要通知:“多说即将关闭,将于2017年6月1日正式关停服务”。当时内心感慨万千,本想来个长篇大论感慨一下,奈何文采有限,最后发了一条朋友圈:

”多说“国内社交化评论”No.1“,如今竟然也落得如此下场!不能变现的项目,即使再优秀也难得长久,愿在新的领域里再创辉煌,前程似锦!”

感慨完了,数据还是要拿回来,既然是6月1日正式停止服务,那还是有大把时间可以挥霍的,所以一直也没上心。正好这个五一小长假来临前一天,感冒+高烧找上了门,只能在家闭门养病了(平时也不知道在瞎忙什么...)。

二、主要步骤

关于多说的数据格式和 typecho 表结构在这里就不分析了,主要说说主要步骤。这里是把多说json格式的数据转换成符合 typecho 表关系的 insert 语句,并写入到insert.sql文件中,有了这个文件相信聪明的你就知道该怎么做了!

1. 将多说数据导出

进入多说开发者后台=>工具=>导出数据,选中”包含文章数据“、”包含评论数据“,务必选中两项,然后导出数据,解压后拿到export.json文件备用。

2. PHP 代码如下:

在 export.json 同级目录新建import.php文件,代码如下:

<?php

// 读取 json 文件并转换成 php 数组
$json = file_get_contents("./export.json");
$data = json_decode($json, true); // 文章数据
$threads = $data['threads'];
// 评论数据
$posts = $data['posts']; // 多说的文章ID(thread_id)与 typecho 的文章ID(cid) 对应关系
$threadIdRelationCid = [];
foreach ($threads as $item) {
$threadIdRelationCid[$item['thread_id']] = $item['thread_key'];
} // 假设评论表 coid 小于10001,此处从10001开始自增,请根据实际最大值修改
$coid = 10001;
// 多说的评论ID(post_id) 与 typecho 的评论ID(coid) 对应关系
$postIdRelationCoid = [];
foreach ($posts as $item) {
$postIdRelationCoid[$item['post_id']] = $coid++;
} // 拼成多条 insert sql语句
$sql = '';
foreach ($posts as $item) {
$coid = $postIdRelationCoid[$item['post_id']];
$cid = $threadIdRelationCid[$item['thread_id']];
$created = strtotime($item['created_at']);
$author = $item['author_name'] ?: '';
$mail = $item['author_email'] ?: '';
$url = $item['author_url'] ?: '';
$ip = $item['ip'];
$text = $item['message'];
$parent = 0;
if (is_array($item['parents'])) {
$parent = $postIdRelationCoid[$item['parents'][0]];
} $sql .= "INSERT INTO `typecho_comments`
(`coid`, `cid`, `created`, `author`, `authorId`, `ownerId`, `mail`, `url`, `ip`, `agent`, `text`, `type`, `status`, `parent`) VALUES
({$coid}, {$cid}, {$created}, '{$author}', 0, 1, '{$mail}', '{$url}', '{$ip}', NULL, '{$text}', 'comment', 'approved', $parent);\n";
} // 将 sql 写入文件中
file_put_contents("./insert.sql", $sql); echo "end \n";

在命令行执行php import.php 或在浏览器中访问import.php文件(推荐使用命令行方式),就会在该文件所在的目录生成一个insert.sql文件。【下载代码

3. 小问题

部分评论数据里面可能会有 emoji 表情,但是 typecho 表的字符集是 utf8,如果需要保留 emoji 的童鞋把 pre_comments 表的字符集改成 utf8mb4 即可,不需要保留 emoji 表情的将 emoji 表情删掉重导即可。

本博客已切换到 typecho 自带的评论,默认的才是最好的!!!!!如果有和我一样需求的童鞋可以把代码拿去放心使用。

三、反思

不得不说,从产品角度讲,”多说“是一个非常优秀的产品,市场占有率非常高,但从商业角度讲,”多说“又是一个非常失败的案例,其成败都值得深思。

如果您看到了这篇文章,请留下您的思考!_

多说评论一次导回 Typecho 本地数据库的更多相关文章

  1. 请问Typecho Mysql 数据库和Sqlite数据库我该如何选择。

    纠结如我,又纠结了,请大家帮忙看一下我该如何选择.就一个没有文章的博客.一直用VPS太浪费,现在换成了虚拟主机.但是虚拟主机的MYSQL数据库限制连接数30个,我不懂这是个什么概念,但是我觉得30太少 ...

  2. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  3. 除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)

    利用binlog日志恢复数据库误操作数据 在人工手动进行一些数据库写操作的时候(比方说数据修改),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线 ...

  4. GIT回推本地commit近期版本

    一次意外吧,本地add并且commit之后拉了别人错误的代码下来,后来本地又需要进行编写测试,无奈只能回推到自己刚刚commit过的代码,但是git命令除了拉去提交等其他的不是很熟悉,在度娘之后也遇到 ...

  5. phonegap(cordova)从手机app跳转到web页面在跳转回APP本地页面思路

    项目中需要用到 WAP支付宝支付. 但是 使用PHONEGAP开发 跳转到支付宝支付,然后跳转回来 就回不到APP的本地页面, 就是使用WAP的第三方登录也是一样的.很难从WAP页面在跳转到 app本 ...

  6. Win10微软帐户切换不回Administrator本地帐户的解决方法【亲测】

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  7. Oracle权限一览表

    权限 所能实现的操作 分析 ANALYZE ANY  分析数据库中的任何表.簇或索引 审计 AUDIT ANY  审计数据库中的任何模式对象 AUDIT SYSTEM  启用与停用语句和特权的审计选项 ...

  8. 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 分类: JavaScript 2014-09-23 10:41 218人阅读 评论(1) 收藏

    前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Sock ...

  9. git回滚

    Git回滚的常用手法 07net01.com 发布于 4小时前 评论 传统VCS的回滚操作 对于版本控制系统VCS来说,回滚这个操作应该是个很普通也是很重要的需求. 如果你是传统VCS,比如SVN或者 ...

随机推荐

  1. TOJ3136

                                                          3136: Ubiquitous Religions 时间限制(普通/Java):2000M ...

  2. HDOJ 2063 过山车

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. (转)@SuppressWarnings的使用、作用、用法

    在java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings(“XXXX”) 来解决 例如:@S ...

  4. XML到底是什么

    http://www.w3school.com.cn/xml/xml_intro.asp w3school介绍 XML  XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 应该掌握的 ...

  5. java中内存结构及堆栈详解

    一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...

  6. javascript中对变量类型的推断

    本文正式地址:http://www.xiabingbao.com/javascript/2015/07/04/javascript-type 在JavaScript中,有5种基本数据类型和1种复杂数据 ...

  7. POJ 1061 青蛙的约会(欧几里得扩展)

    题意:已知青蛙1位置x,速度m,青蛙2位置y,速度n,纬线长度为l,求他们相遇时最少跳跃次数. 思路:设最小跳跃次数为k,则(x + k*m) - (y + k*n) = q*l:经过整理得到k*(n ...

  8. 在Ubuntu下永久修改主机名

    一. deb/ubuntu上永久修改 : 查看主机名: 修改主机名: 重启后生效 ---------------------------------------------------------- ...

  9. Eclipse安装svn插件的几种方式 转帖....

    Eclipse安装svn插件的几种方式 1.在线安装: (1).点击 Help --> Install New Software... (2).在弹出的窗口中点击add按钮,输入Name(任意) ...

  10. c#: Label控件加入AutoHeight属性

    此功能在界面布局中颇为实用,录代码以记之: public class LabelEx : Label { private bool autoHeight = true; [DefaultValue(t ...