1. 程式人生 > 其它 >把部落格園的部落格匯出為MovableType的文字格式

把部落格園的部落格匯出為MovableType的文字格式

技術標籤:pythonjavalinuxmysqlandroid

最近把以前的wordpress建的部落格刪了,用textpattern重新建了一個獨立部落格,http://www.shenlongbin.com,可以把它當成部落格園上內容的備份,但匯入我以前的一大堆文章非常有難度。經過一番折騰,終於把部落格園的內容匯出為文字,再匯入到textpattern中了。

第一步:C#程式設計把部落格園內容讀取出來

部落格園的管理端提供了部落格備份功能,可以生成一個xml檔案,但只能備份部落格的主要內容,並不包含部落格的摘要資訊和關鍵詞資訊,需要用metaweblogAPI進行訪問才能獲得詳細的資訊。快速學習了metaweblog程式設計知識,內部採用了XML-RPC呼叫,從網上搜索相關資料和類庫。很多地方都引用了XML-RPC.NET專案的類庫(名字空間以CookComputing開頭),並修改了相關程式碼,可惜下載網址被偉大的牆擋住了,通過v*n才好不容易把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 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標記的百科知識見這裡

這裡要用到著名的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操作,匯入成功時會出現部落格文章的列表。

3787-20151225081538812-115235259

其它

以前都是用blog_backup這個小程式來備份我的部落格,現在發現自己寫的這個小程式可以備份得更為徹底,還可以稍微修改匯出到wordpress。一番折騰,學到了這些知識點:movableType, metaweblog, xml-rpc, textile, pandoc, c# culture in date.ToString(), WebProxy……