前言
我是個略有些強迫症的人,希望很多東西可以統一。例如,幾個月前我才在RSS訂閱裡 輸出了全文——那是因為博客園終於提供這個統一設置的選項了。其實在此之前就有很多 朋友建議我開放全文,但我一直沒有做。不是我追求PV,而是我只能做到所有的新文章輸 出全文,對於舊文章則必須一篇一篇地去修改——如果不修改,不就不統一了嗎?但手動 修改實在太繁瑣,於是便一直沒有去做。
同樣的,在我以前的文章中,每段段首都是空兩格的,但是現在感覺沒有什麼必要, 於是最近的幾十篇文章都頂格寫了。這個“不統一”我便“容忍”了,因為我知道博客園 提供了MetaWeblog API,這樣我理論上可以寫一段程序來批量修改之前的文章內容。只可 惜,直到現在我才下決心這麼做。
整個過程分幾步完成,在此一一記錄一下。
XML RPC與MetaWeblog
MetaWeblog是一個通用的博客內容修改接口,許多博客都實現了協議,因此我們可以 使用Windows Live Writer這樣的工具來寫文章。網上關於這個協議最好的描述文檔我認 為是MSDN上的MetaWeblog API Reference——這其實是Windows Live Space服務所公開的 接口。從理論上來說,博客園也應該實現完全相同的功能,但是實際使用上來看,還是有 一些區別。由於任務的性質,這裡我們自然以博客園為准,我也不再去追究到底誰是真正 符合標准的做法了。
MetaWeblog API使用了基於XML RPC的調用方式。XML RPC使用HTTP來傳輸一段XML來表 示一個遠程調用,與SOAP不同,XML RPC非常簡單,他的傳輸內容您一看就懂。我只是在 開發過程中使用Fiddler簡單查看了一下Windows Live Writer與博客園的通信,如果您感 興趣的話也可以仔細研究一下XML RPC。
在.NET上調用XML RPC服務可以利用開源的XML-RPC.NET類庫來簡化操作。雖然MSDN上 提供了一段基於XML-RPC.NET的演示代碼,但是您也可以看出其實這段代碼無比粗略,而 且我根本沒跑通,差點讓我認為XML-RPC.NET非常不成熟。但我看了XML-RPC.NET的文檔之 後才意識到,其實這個類庫使用起來非常簡單。因此,我在這裡建議您忽略MSDN上的示例 代碼,而以XML-RPC.NET為准——甚至只要首頁上的幾行代碼您就可以明白了。
當然,您也可以繼續閱讀這篇文章,用於完成簡單的工作已經足夠了。
使用MetaWeblog API修改博客園文章
使用XML-RPC.NET調用MetaWeblog API非常容易,我們只要根據API的樣式來定義“類 型”和“接口”就可以了。例如:
public class Post
{
[XmlRpcMember("postid")]
public int PostID;
[XmlRpcMember("dateCreated")]
public DateTime CreateTime;
[XmlRpcMember("title")]
public string Title;
[XmlRpcMember("description")]
public string Content;
[XmlRpcMember("categories")]
public string[] Categories;
}
public interface IMetaWeblogProxy : IXmlRpcProxy
{
[XmlRpcMethod("metaWeblog.getPost")]
Post GetPost(string postId, string userName, string password);
[XmlRpcMethod("metaWeblog.editPost")]
bool UpdatePost(string postId, string userName, string password, Post post, bool publish);
}