How to use MetaWeblogSharp


簡單紀錄一下怎樣使用MetaWeblogSharp去操控支援MetaWeblog api的Blog。



首先使用NuGet將MetaWeblogSharp組件參考加入。


image



加入命名空間MetaWeblogSharp。



using MetaWeblogSharp;



就可以開始進行程式的撰寫。



因為對Blog的操作需要有權限,所以這邊先以Login來說。Login的動作我們需要先取得BlogConnectionInfo的物件,在第一次登入時BlogConnectionInfo物件實體是要自己建立的,建立時我們需要帶入MetaWeblog API的位置以及Blog的帳號密碼。建構子這邊雖然也可以帶入BlogID與BlogURL,但是像ID這樣的東西不太可能是開發時會知道的東西,筆者也不太了解開發者為何這樣設計,這邊筆者是直接將空字串帶入。建立完BlogConnectionInfo物件實體後,我們需要將剛建立好的BlogConnectionInfo物件實體帶入Client的建構子,以建立Client的物件實體,後續我們的操作都是針對這個Client物件實體。特別注意到這邊,建立Client的物件實體並不會實際的透過網路去做登入的動作,所以無法判別帳密是否是正確無誤,故這邊筆者在登入時會嘗試讀取Blog資訊,如果帳密錯誤這邊就會觸發例外並告知錯誤原因,若是帳密無誤,這邊可以取得Blog資訊,筆者藉由將這邊取得的資訊回填,補齊本來沒帶入的BlogID與BlogURL。




public static Client Login(string metaWeblogAPIUrl, string id, string password)
{
var connectionInfo = new BlogConnectionInfo(
string.Empty,
metaWeblogAPIUrl,
string.Empty,
id,
password
);

    return Login(connectionInfo);
}

private static Client Login(BlogConnectionInfo connectionInfo)
{
    var client = new Client(connectionInfo);

    var blog = client.GetUsersBlogs().FirstOrDefault();

    connectionInfo.BlogID = blog.BlogID;
    connectionInfo.BlogURL = blog.URL;

    return client;
}</pre>



登入成功後,若想讓程式下次可以直接登入,可以叫用BlogConnectionInfo的Save成員方法,將連線資訊儲存在本地。



client.BlogConnectionInfo.Save(“connection.xml”);



下次程式開啟時可透過BlogConnectionInfo的Load靜態方法,將儲存的連線資訊載回去做登入。



var client = Login(BlogConnectionInfo.Load(“connection.xml”));



不過這邊筆者要提醒一下,MetaWeblogSharp的Save功能儲存的是未加密的資訊,所以不建議直接採用,比較好應該是自行處理掉這塊。



登入完成實際取得貼文看看,Client的GetRecentPosts成員方法可以讓我們取得最近n筆貼文。若是要取得所有的貼文,我們可以帶個極大的數值給它(MetaWeblog API在這塊感覺有點設計上的缺陷)。



var allPosts = client.GetRecentPosts(int.MaxValue);
allPosts.ForEach((post) =>
{
Console.WriteLine(post.Title);
Console.WriteLine(post.Link);
Console.WriteLine(new string(‘=’, 78));
});



image



PostInfo內Title、Link、Description這些會是我們比較關注的,因為它是文章的標題、相對路徑、以及內文。



另外我們比較關注的可能就是文章的位置。不過因為MetaWeblogSharp在這塊的實作上有些問題,所以取得的PostInfo其PremaLink會永遠是Null。當然如果要從PostInfo.Link以及部落格位置去兜出PremaLink也是可以,但總是不夠方便。


image



好在它的RawData裡面確實是有東西的,所以這邊我們可以改從RawData那邊去撈出PremaLink。


image



像是下面這樣撰寫:



var permalink = ((post.RawData as MetaWeblogSharp.XmlRPC.Struct)[“permalink”] as MetaWeblogSharp.XmlRPC.StringValue).String;



Permalink就可以確實的撈出。


image



除此之外文章的Category可能也是我們關注的重點,這邊一樣也是得從RawData內去撈。像是下面這樣:



var categories = ((post.RawData as MetaWeblogSharp.XmlRPC.Struct)[“categories”] as MetaWeblogSharp.XmlRPC.Array).OfType<MetaWeblogSharp.XmlRPC.StringValue>().Select(item => item.String).ToArray();


image



其它比較簡單的操作應該看一下就會了。像是用Client.GetPost取得特定的文章。



var post = client.GetPost(postID);



用Client.DeletePost刪除特定的文章



client.DeletePost(post.PostID);



用Client.EditPost編輯特定的文章



client.EditPost(post.PostID, “NewTitle”, “NewDescription”, null, true);



用Client.NewMediaObject上傳檔案



var bytes = File.ReadAllBytes(“test1.png”);
var mo = client.NewMediaObject(“foo.png”, “image/png”, bytes);



以及用Client.NewPost產生貼文



var categories1 = new List<string> { “A”, “B”, “C” };
var new_post_id = client.NewPost(title, body, categories1, true);



Link



  • MetaWeblogSharp - Home