博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
把博客园的博客导出为MovableType的文本格式
阅读量:7060 次
发布时间:2019-06-28

本文共 4328 字,大约阅读时间需要 14 分钟。

最近把以前的wordpress建的博客删了,用textpattern重新建了一个独立博客,,可以把它当成博客园上内容的备份,但导入非常有难度。经过一番折腾,终于把博客园的内容导出为文本,再导入到textpattern中了。

第一步:C#编程把博客园内容读取出来

博客园的管理端提供了博客备份功能,可以生成一个xml文件,但只能备份博客的主要内容,并不包含博客的摘要信息和关键词信息,需要用metaweblogAPI进行访问才能获得详细的信息。快速学习了metaweblog编程知识,内部采用了XML-RPC调用,从网上搜索相关资料和类库。很多地方都引用了XML-RPC.NET项目的类库(名字空间以CookComputing开头),并修改了相关代码,可惜下载网址被伟大的墙挡住了,通过VPN才好不容易把xml-rpc.net.2.5.0.zip(.NET framework 2.0)下载下来。原始地址在这里:。大CC有一篇文章,另外介绍了调用方法,只需要稍微修改一点,就可以获取博客园上的博客内容了。

博客园的metaweblog的访问接口可以访问:,从而获得详细的描述信息。实际上在xml-rpc.net2.5.0压缩包中的interfaces/MetaWeblogAPI.cs文件中可以找到主要类或结构的定义,稍微添加或修改即可。

[XmlRpcMissingMapping(MappingAction.Ignore)]    public struct Post    {        [XmlRpcMissingMapping(MappingAction.Error)]        [XmlRpcMember(Description = "Required when posting.")]        public DateTime dateCreated;        [XmlRpcMissingMapping(MappingAction.Error)]        [XmlRpcMember(Description = "Required when posting.")]        public string description;        [XmlRpcMissingMapping(MappingAction.Error)]        [XmlRpcMember(Description = "Required when posting.")]        public string title;        public string[] categories;        public Enclosure enclosure;        public string link;        public string permalink;        [XmlRpcMember(           Description = "Not required when posting. Depending on server may "           + "be either string or integer. "           + "Use Convert.ToInt32(postid) to treat as integer or "           + "Convert.ToString(postid) to treat as string")]        public object postid;        public Source source;        public string userid;        public object mt_allow_comments;        public object mt_allow_pings;        public object mt_convert_breaks;        public string mt_text_more;        public string mt_excerpt;        public string mt_keywords; // add by shenlb, for cnblogs        public string wp_slug;     // add by shenlb, for cnblogs;    }

 

我们单位访问互联网要用到代理,还要密码验证,所以关键代码得添加几行:

MetaWeblogCnblogs blog = new MetaWeblogCnblogs();blog.Url = "http://www.cnblogs.com/speeding/services/metaweblog.aspx";Uri proxyURI = new Uri("http://myproxyhost.myproxydomain.com:80");System.Net.WebProxy proxyObject = new System.Net.WebProxy(proxyURI, false);proxyObject.Credentials = new System.Net.NetworkCredential("proxy_username", "proxy_password");blog.Proxy = proxyObject;Post[] posts = blog.getRecentPosts("speeding", "speeding", "my_blog_admin_password", 50);

这样就可以获得博客内容了,但需要再调用getPost才能获得详细的信息,这里就可以看到摘要和关键词了。

Post detail = blog.getPost(post.postid.ToString(), "speeding", "my_blog_admin_password");

第二步:利用pandoc把html内容转换为textile标记

Post中的description中都是html标记,而textpattern默认的标记语言是textile,所以需要将其转换为textile,关于textile标记的百科知识。

这里要用到著名的了,这个神奇的工具竟然是用写成了,以前学习haskell语言的时候以为只是一种教学语言,真有人写出了实用程序!

把博客中内容写入temp.html文件中,再用下面的命令行就可以转换了。

pandoc.exe -t textile -o textile.txt temp.html

主要代码:

ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.CreateNoWindow = false;startInfo.UseShellExecute = false;startInfo.FileName = "..\\..\\pandoc.exe";startInfo.WindowStyle = ProcessWindowStyle.Hidden;startInfo.Arguments = "-t textile -o textile.txt temp.html";using (Process exeProcess = Process.Start(startInfo))            {     exeProcess.WaitForExit(); }    return File.ReadAllText("textile.txt");

第三步:生成import.txt文件

对几百篇博客文章循环处理,追加到import.txt文件即可,最后的文件用UTF8保存。

Movable Type博客的文本格式说明文档可以看这里:

简单说明一下:文件用UTF8编码存储,前面几行是单行文本信息,后面的BODY、KEYWORDS和EXCERPT是多行文本,多行文本需要用5个短横分开,每篇文章用8个短横分开,最简单的一个例子:

TITLE: A dummy title

AUTHOR: shenlongbin

DATE: 01/31/2012 03:31:05 PM

PRIMARY CATEGORY: reading

CATEGORY: reading

-----

BODY:

This is the body.

Another paragraph here.

Another paragraph here.

-----

EXCERPT:

See, this entry does not have an extended piece; but it does have an excerpt. It is special.

-----

--------

里面的日期格式有要格要求,关键代码:

IFormatProvider culture = new CultureInfo("en-US", true);

string date = post.dateCreated.ToString("dd/MM/yyyy hh:mm:ss tt", culture); // 08/05/2002 04:05:23 PM  

第四步:上传import.txt文件,导入

文件必须放在public_html/textpattern/include/import目录下,并且文件名一定是import.txt。实际上textpattern的管理端可以导入Movable Type(File/MySQL)、Blogger、b2、WordPress等格式的博客,但支持文本文件导入的只有Movable Type和Blogger。

在textpattern的管理界面上执行import操作,导入成功时会出现博客文章的列表。

其它

以前都是用blog_backup这个小程序来备份我的博客,现在发现自己写的这个小程序可以备份得更为彻底,还可以稍微修改导出到wordpress。一番折腾,学到了这些知识点:movableType, metaweblog, xml-rpc, textile, pandoc, c# culture in date.ToString(), WebProxy……

你可能感兴趣的文章
杭电2003
查看>>
Java泛型二:泛型类 泛型接口 泛型方法详解
查看>>
RabbitMQ Queue中Arguments属性参数过期队列,过期消息,超时队列的声明
查看>>
kettle API - Scala 调用示例
查看>>
HTML+CSS+JS面试题
查看>>
MongoDb 备份实践一下
查看>>
win7 蓝屏 0x000000c5
查看>>
HashMap
查看>>
IOS友盟统计Bug追踪
查看>>
利用spring session解决共享Session问题
查看>>
Haskell抽象概念Functor剖析
查看>>
JavaFX学习之道:JavaFX之TableView
查看>>
C++小记
查看>>
三大框架的整合struts2.2+hibernate3.2+spring2.5
查看>>
FR表单式主子报表的制作问题解决方案
查看>>
java使用post方式发送JSON数据乱码问题
查看>>
pring配置SessionFactory
查看>>
清除浮动
查看>>
WCF学习之旅----正式篇之基础框架
查看>>
最近研究如何加速UI界面开发,有点感觉了
查看>>