点点轻博客搬家到WordPress

Published: 2014-01-29

Tags: Shell

本文总阅读量

摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家到WordPress博客

本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不能直接导入到wordpress博客中的烦恼

当时也没什么办法,只能指望官方良心,别莫名其妙的关闭博客,最近接触shell,研究了大概两三天的时间,最浪费时间的就是精简wordpress的XML文件,因为导出的XML文档很多标签,而有些标签去掉,则会导致导入时失败,所以很消耗时间,不过最终还是搞定了搬家的问题

首先说一下这个shell脚本的特点,因为是一个shell尝试,所以转化仅仅是最基本的,大神路过轻吐槽

  • 可以把点点“文字”导入(其它类型暂时不可)
  • 可以保留标签
  • 可以保留文章日期(精确到天,但发布时间都为20:00:00)
  • 图片可以正确显示(依然保存在点点,不过生成ImagsURL列表可批量下载保存到本地)
  • 文章ID不可保存(无损搬家看来有点难)
  • 后面会解释为什么有些没有实现

如果你需要解决眼下的燃眉之急,可以直接到文章后面复制脚本并使用,不过建议看看博主的探索过程,以便今后遇到同类问题能快速解决

首先介绍下基础知识

(1)XML文件

简单来说,就是一种“可视话”的数据保存文档,没有样式,通过嵌套的标签来存储数据,你可以使用任何文本编辑器来查看它的内容,各种程序也可方便的使用其中的数据。你可以花十多分钟来看看教程(W3school),看看前面的基础就足以应付后来的工作了

点点备份的XML文件标签及数据结构和Wordpress博客备份的不一样,所以互相的不能识别,不能导入,我们做的工作很简单,就是把标签进行转换,然后就能成功导入Wordpress博客

(2)SHELL脚本

本文假设你知道shell脚本并且已经会执行脚本

那么多的标签,如果手工改动,相信是件可怕的事情,即使是使用编辑器的全局替换,相信也是件浪费时间的事儿

那么作为批处理,SHELL的强大就无与伦比了。

(3)点点和wordpress的XML备份文件结构

点点博客XML文件Tag和结构

DianDianxml

WordPress博客XML文件Tag和结构

WordpressXML

简单的说明下特点,点点博客的Post标签中保存文章,而Wordpress是item标签,类似的还需要替换一些标签,结构不同的地方体现在图片的保存,点点博客的图片单独保存在Images中,文中的图片保存的是ID,而后根据ID到images里找对应的URL,转化得到图片地址,而wordpress中的文章直接保存的就是图片URL。由于博主刚接触shell,了解的也是最基本的,但是感觉应该可以通过脚本自动转化,所以尝试探索。

解释下未实现的功能

博主的shell水平,简单的说,连简单的替换都需要通过搜索引擎才能写的出来。有两句话关于shell的话,很有意思。

  • Where there is a shell, there is a way
  • 一句shell代码等同于百句C语言代码

有点夸张,不过确实说明了shell的强大。说这么多关于shell的,其实没别的意思,因为后面的脚本是四处拼凑,请教他人才整理出来的,所以懂shell的人看见一定会受不了一些实现方式,编码风格等等,现在我也没那实力更改,所以就只能这样了

之所以分享出来,一是可以给需要的人使用,二是因为这是自己第一次用shell解决实际问题,很高兴,值得纪念

而文章的标题“(一)”也代表博主会通过不断的探索,后续写出高效的代码,实现更多的功能。

在此解释一下几个功能无法实现的原因:

  • 由于时间精力有限,没能对比“图片”,“声音”的格式,后续更新会补上的
  • 时间无法显示发布时间是因为点点保存时间用的是一串数字“1390136672987”分析了一阵,才弄明白前十位“1390136672”是从1970-01-01年开始到日志发布的秒数,经过转化是2014-01-19后面的三位一定是表示小时和分钟了,但是由于当时的主要精力没放在这,而且算了半天也没搞懂后三位是怎么表示的,所以只得把时间缺省为20:00:00,这也是无奈之举
  • 运行脚本可以生成图片链接表,可供下载,不过下载回来的图片是经过点点压缩的尺寸。不是原图,以后会添加原图下载的
  • 点点文章的格式是http://域名/post/2014-01-28/40060879713,后边的“40060879713”就是文章ID,wordpress默认的链接是/?p=ID所以最开始我是打算把ID信息也转化,搬到wordpress不会出现搜索引擎收录访问不了的情况,但是由于点点的ID数字过大,导致导入到数据库中的话,会溢出,破坏数据库。所以我不知道如何处理。知道的朋友一定要相告哦! 该交代的都交代了,下面是脚本

关于脚本的使用和说明

DiandianToWordpress-beta.sh文件保存的是shell程序

#!/bin/bash

cp diandian_backup.xml diandian.xml
#分割原始文件
sed -n '/<Images>/,/<\/Images>/p' diandian.xml > IDtoSrc.txt
cp IDtoSrc.txt ImagesURL.txt
sed -i '/<Images>/,/<\/Images>/d' diandian.xml

#处理IDtoSrc.txt格式
sed -i '1d;$d' IDtoSrc.txt
sed -i '/<Image>/d' IDtoSrc.txt
sed -i '/<\/Image>/d' IDtoSrc.txt
sed -i 's/\s\s\s\s\s\s\s\s\s\s\s\s//' IDtoSrc.txt
sed -i ':label;N;s/\n/=/;t label' IDtoSrc.txt
sed -i 's/<Id>//;s/<\/Id>=<Url>/=/g;s/<\/Url>=<Id>/\n/g' IDtoSrc.txt
sed -i 's/<\/Url>//g' IDtoSrc.txt

#根据IDtoSrc.txt内容替换图片正确地址
awk 'NR==FNR{split($0,a,"=");b[a[1]]=a[2];next}{for(i in b){gsub(i,b[i],$0)};print $0}' IDtoSrc.txt diandian.xml > tmp.txt
sed -i 's/libdd/papaapp/g' tmp.txt
sed -i 's/id=/src=/g' tmp.txt

#保存图片链接到ImagesURL.txt
cat ImagesURL.txt | grep "<Url>" > I.txt
sed -i 's/\s\s\s\s\s\s\s\s\s\s\s\s//' I.txt
mv I.txt ImagesURL.txt
sed -i 's/<Url>//g;s/<\/Url>//g' ImagesURL.txt

#复制点点博客中的有用数据到f.txt中
#复制wordpress头到点点XML中
cat WP-head.txt  > f.txt
echo "<channel>" >> f.txt
#复制<BlogInfo>并修改
sed -n '/<BlogInfo>/,/<\/BlogInfo>/p' tmp.txt >> f.txt
sed -i '/<BlogInfo>/d;/\/BlogInfo/d' f.txt
sed -i 's/BlogName/title/g' f.txt
sed -i '/<BlogUrl>/d' f.txt
sed -i 's/BlogDesc/description/g' f.txt
sed -i '/<BlogPic>/d' f.txt
echo "<wp:wxr_version>1.2</wp:wxr_version>" >> f.txt

sed -n '/<Posts>/,/<\/Posts>/p' tmp.txt >> f.txt
sed -i '/<Posts>/d;/\/Posts/d' f.txt
sed -i 's/<Post>/<item>/g;s/<\/Post>/<\/item>/g' f.txt

#处理item内数据
sed -i '/<Author>/a\<dc:creator>admin<\/dc:creator>' f.txt #查找并在下行添加数据
sed -i '/<Author>/d' f.txt
awk -F'[<>]' '/<CreateTime>/{$0=sprintf("<%s>%s<%s>",$2,strftime("%F",substr($3,1,10)),$4)}1' f.txt > f.xml
mv f.xml f.txt
sed -i 's/<CreateTime>/<wp:post_date>/g' f.txt
sed -i 's/<\/CreateTime>/\ 20:00:00<\/wp:post_date>/g' f.txt
sed -i '/<ModifiedCreateTime>/d' f.txt
sed -i '/<Id>/d' f.txt
sed -i '/<PostType>/a\<wp:post_type>post<\/wp:post_type>' f.txt
sed -i '/<PostType>/d' f.txt
sed -i '/<PostId>/d' f.txt
sed -i '/<wp:post_type>/a\<wp:status>publish<\/wp:status>' f.txt
sed -i '/<Privacy>/d' f.txt
sed -i '/<Source>/d' f.txt
awk -F'[<>]' '/<Tag>/{"echo -n \042"$3"\042 | od -An -tx1 -w30 | tr \047 \047 %" | getline s;printf "<category domain=\"post_tag\" nicename=\"%s\"><![CDATA[%s]]></category>",s,$3}1' f.txt > f.xml
mv f.xml f.txt

#Tag标签更改后原标签不能删除,不知为何,就现这样吧,不影响导入
sed -i '/<Tags>/d;/<\/Tags>/d' f.txt
sed -i '/<CreativeCommonsSetting>/,/<\/CreativeCommonsSetting>/d' f.txt
sed -i 's/Title/title/g' f.txt
sed -i 's/<Text>/<content:encoded><\!\[CDATA\[/g' f.txt
sed -i 's/<\/Text>/\]\]><\/content:encoded>/g' f.txt

#替换符号
#sed -i '/<content:encoded>/s/&gt\;/\>/g' f.txt
#sed -i '/<content:encoded>/s/&lt\;/\</g' f.txt

echo "</channel>" >> f.txt
echo "</rss>" >> f.txt

mv tmp.txt c.xml
mv f.txt finish.xml

WP-head.txt保存的是wordpress的XML文件相关说明,没有则会保存

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.2/"
>

使用方法:你需要在linux下操作,把主shell和WP-head.txt(名称不可变)内容复制并保存在本地

然后把点点的XML备份文件改名为diandian_backup.xml放在同一文件夹

运行主shell,会自动生成三个文件,IDtoSrc.txt,ImagesURL.txt,finish.xml

  • IDtoSrc.txt 的内容是点点文章图片ID对应的URL转化
  • ImagesURL.txt 的内容是点点文章图片的URL,可方便批量下载,再次提示(是经点点压缩后的)
  • finish.xml 就是转化后的文件了,快导入到博客看看效果吧~^_^

这就是前些天的探索和实践了,一不小心就写了这么多,有些复杂的内容转换,一条命令就可以搞定,不尽感叹shell的强大。

SHELL!I COME!


2016-03-27 后记

两年后的如今,经过一系列折腾后,最终选择了Hexo+Github的方案来写博客,免费且安全,此次回来手动搬运即将过期的虚拟主机Wordpress下的文章,有些文章不舍得扔掉...

两年前就觉得点点网药丸,如今...不少用点点网当图床的人应该要哭死了...忠实用户也估计心碎。

点点做的很不对,即使要关停服务,也应该提前告知用户,而不是莫名其妙就登陆不了了,应当提供完备的备份及迁移方案,不然多伤用户的心,要只要,文章/日志/摄影,在你们看来只是占用磁盘的数据,但是对于每个个体来讲,却是代表着回忆与青春...