多说评论一次导回 Typecho 本地数据库
一、追忆往昔
第一次接触社交化评论类产品大概是在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 自带的评论,默认的才是最好的!!!!!如果有和我一样需求的童鞋可以把代码拿去放心使用。
三、反思
不得不说,从产品角度讲,”多说“是一个非常优秀的产品,市场占有率非常高,但从商业角度讲,”多说“又是一个非常失败的案例,其成败都值得深思。
如果您看到了这篇文章,请留下您的思考!_