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

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

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

博客园的metaweblog的访问接口可以访问:http://www.cnblogs.com/speeding/services/metaweblog.aspx,从而获得详细的描述信息。实际上在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 cnblogspublic 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标记的百科知识见这里。

这里要用到著名的pandoc了,这个神奇的工具竟然是用haskell写成了,以前学习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博客的文本格式说明文档可以看这里: https://movabletype.org/documentation/appendices/import-export-format.html#example

简单说明一下:文件用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……

转载于:https://www.cnblogs.com/speeding/p/cnblogs-export-to-movabletype.html

把博客园的博客导出为MovableType的文本格式相关推荐

  1. 谁来代替博客园——寄生博客

    这系列文章成文是在几天前,当时是一篇,后来,为了不致给读者太大压力,所以分成了三篇,一个系列发布.发到最后一篇的时候,觉得,确实不太适合发布在首页了.毕竟搞技术没几个人关心这一篇的内容了.所以发布在自 ...

  2. 博客园的博客积分与排名查看方法

    我是今天才知道,out.因为这东东默认是不显示的,因此找不到. 注意:只是你在博客园的博客的积分排名,而不是你的在博客园的排名. 设置-博客设置(博客后台管理)-选项-积分与排名打勾.刷新你的博客页面 ...

  3. 聊聊在博客园写博客的这两年《Unity 3D脚本编程:使用C#语言开发跨平台游戏》正式出版...

    版本状态: 2016.9 第一次印刷 (2016.11 输出到台湾) 2017.1 第二次印刷 2017.5 第三次印刷 2017.5 电子书上线:Unity 3D脚本编程--使用C#语言开发跨平台游 ...

  4. 用 Windows Live Writer 2009 为我们的博客园写博客(图)

    在此之前没有使用过Windows Live Writer 写过博客,看到dudu推荐用Windows Live Writer ,今天也尝试用了一下,并把过程记录下来供大家分享讨论. Windows L ...

  5. 突然发现我还有博客园的博客呢哈哈哈哈

    突然发现我还有博客园的博客呢哈哈哈哈 突然发现我还有博客园的博客呢哈哈哈哈,很久没来,差点都忘了. posted on 2018-01-24 10:30 七侠镇莫尛貝 阅读(...) 评论(...) ...

  6. 用为知发布博客到博客园、使用Wiz编写和发布博客园(cnblogs)博客

    wiz不但可以做笔记,收藏网络上的文摘.还可以作为一个离线写博客的客户端,于是去网上搜了下配置过程.搜到wiz官方boss老魏写的一个教程:http://weishijun.com/p/906 ::: ...

  7. 2008年12月31日,博客园开博

    今天是美好的一天,天气晴朗,鸟语花香.呃..好像没鸟也没花..大冬天的..好冷哦! 今天是08年的最后一天,08年发生了很多震惊世界的事情. 所以我打算保留对08年的记忆. 去感谢一些人,去忘掉一些人 ...

  8. 网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题...

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  9. CSDN/博客园等博客的文章搬家到wordpress网站

    第一章.简介 由于自己建立了博客学习网站,因此想把比较典型文章,搬家到自己的网站.于是,整理了几种常用的搬家手段: 插件形式搬家 CSDN的博客先转到了博客园,然后博客园备份成.xml文件,最后wor ...

  10. Python爬虫入门教程 54-100 博客园等博客网站自动评论器

    爬虫背景 爬虫最核心的问题就是解决重复操作,当一件事情可以重复的进行的时候,就可以用爬虫来解决这个问题,今天要实现的一个基本需求是完成"博客园" 博客的自动评论,其实原理是非常简单 ...

最新文章

  1. JavaWeb学习笔记——jsp内置对象
  2. UI培训教程分享:APP图标设计的6种风格都有哪些?
  3. 用Python解“两个数的简单计算器”题
  4. python学习--DAY2
  5. Linux下安装Foxit Reader
  6. Quartz 2d绘图
  7. vue 获取元素在浏览器的位置_前端开发JS获取页面元素的位置
  8. npm、webpack、vue-cli 快速上手版
  9. cmder 神器 +curl
  10. field list什么意思_什么是生物信息学?
  11. poj 2385 Apple Catching 经典dp
  12. linux 磁带机备份是否完成,Linux环境下磁带机的直接备份操作
  13. 【前端教程】如何监控网页的卡顿?
  14. Java 拆分Word文档
  15. 机器阅读理解 | (1) 智能问答概述
  16. 微信小程序在线知识答题有奖多开版源码
  17. python人工智能入门纳米学位_最近看到udacity的纳米学位很火,号称学完可以找到工作了,这是真的吗?...
  18. zabbix 5.0中自定义监控单个IP的最大流量
  19. m8 windows android,HTC M8 WP版正式发布 通刷Android和WP8.1
  20. m车载自组织网络(Vehicular Ad-hoc Network,VANET)通信系统的matlab仿真

热门文章

  1. 大前端-全栈-node+easyui+express+vue+es6+webpack+react
  2. C# 数组比较--取得两个集合的交集,差集,并集的方法
  3. iTextSharp 生成pdf Form 实例
  4. 子盒子width为父盒子width的百分比注意
  5. 北京市城六区内严禁新建扩建数据中心
  6. dojo/dom-class源码学习
  7. jpGraph学习——绘制3D饼形图
  8. ORACLE11.2.0.1升级到11.2.0.3
  9. SQLserver2008全文检索使用方法
  10. 思科CCNA考试命令集总结