블로그 이미지
Sunny's

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

'MetaWebLog'에 해당되는 글 2

  1. 2010.07.30 MetaWeblog API
  2. 2010.07.30 MetaWeblog API 사용
2010. 7. 30. 12:01 .NET Framework

 XML-RPC.NET library  :  http://xml-rpc.net/


The following code samples show how to use the XML-RPC.NET library and the .NET Framework to call MetaWeblog API methods exposed by Windows Live Space

MetaWeblogAPI C# Code Sample

MetaWeblogAPI VisualBasic .NET Code Sample



Example

This C# code example demonstrates how to use all of the methods supported by the MetaWeblog API. The example enables external programs to get and set the text and attributes of Weblog posts. The example uses the XML-RPC protocol for communication between client applications and the Weblog server.

using System;
using CookComputing.XmlRpc;
using System.Net;
 
namespace MetaWeblogApi
{
 
 
/// <summary>
/// This struct represents information about a user's blog.
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct UserBlog{
public string url;
public string blogid;
public string blogName;
}
 

/// <summary>
/// This struct represents information about a user.
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct UserInfo{
public string url;
public string blogid;
public string blogName;
public string firstname;
public string lastname;
public string email;
public string nickname;
}
 
 
/// <summary>
/// This struct represents the information about a category that could be returned by the
/// getCategories() method.
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct Category{
public string description;
public string title;
}
 
/// <summary>
/// This struct represents the information about a post that could be returned by the
/// editPost(), getRecentPosts() and getPost() methods.
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct Post {
public DateTime dateCreated;
public string description;
public string title;
public string postid;  
public string[] categories;
}
 
/// <summary>
/// This class can be used to programmatically interact with a Weblog on
/// MSN Spaces using the MetaWeblog API.
/// </summary>
[XmlRpcUrl("https://storage.msn.com/storageservice/MetaWeblog.rpc")]
class MsnSpacesMetaWeblog : XmlRpcClientProtocol {
 
 
/// <summary>
/// Returns the most recent draft and non-draft blog posts sorted in descending order by publish date.
/// </summary>
/// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
/// <param name="numberOfPosts"> The number of posts to return. The maximum value is 20. </param>
/// <returns></returns>
[XmlRpcMethod("metaWeblog.getRecentPosts")]
public Post[] getRecentPosts(
string blogid,
string username,
string password,
int numberOfPosts){

return (Post[]) this.Invoke("getRecentPosts", new object[]{ blogid, username, password, numberOfPosts}); 
}
 

        /// <summary>
        /// Posts a new entry to a blog.
        /// </summary>
/// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
/// <param name="post"> A struct representing the content to update. </param>
        /// <param name="publish"> If false, this is a draft post. </param>
        /// <returns> The postid of the newly-created post. </returns>
        [XmlRpcMethod("metaWeblog.newPost")]
public string newPost(
string blogid,
string username,
string password,
Post content,
bool publish){

return (string) this.Invoke("newPost", new object[]{ blogid, username, password, content, publish}); 
}
 
/// <summary>
/// Edits an existing entry on a blog.
/// </summary>
/// <param name="postid"> The ID of the post to update. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
/// <param name="post"> A struct representing the content to update. </param>
/// <param name="publish"> If false, this is a draft post. </param>
/// <returns> Always returns true. </returns>
[XmlRpcMethod("metaWeblog.editPost")]
public bool editPost(
string postid,
string username,
string password,
Post content,
bool publish){

return (bool) this.Invoke("editPost", new object[]{ postid, username, password, content, publish}); 
}
 
/// <summary>
/// Deletes a post from the blog.
/// </summary>
/// <param name="appKey"> This value is ignored. </param>
/// <param name="postid"> The ID of the post to update. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
/// <param name="post"> A struct representing the content to update. </param>
/// <param name="publish"> This value is ignored. </param>
/// <returns> Always returns true. </returns>
[XmlRpcMethod("blogger.deletePost")]
public bool deletePost(
string appKey,
string postid,
string username,
string password,
bool publish){

return (bool) this.Invoke("deletePost", new object[]{ appKey, postid, username, password,  publish}); 
}
 

/// <summary>
/// Returns information about the user’s space. An empty array is returned if the user does not have a space.
/// </summary>
/// <param name="appKey"> This value is ignored. </param>
/// <param name="postid"> The ID of the post to update. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <returns> An array of structs that represents each of the user’s blogs. The array will contain a maximum of one struct, since a user can only have a single space with a single blog. </returns>
[XmlRpcMethod("blogger.getUsersBlogs")]
public UserBlog[] getUsersBlogs(
string appKey,
string username,
string password){
 
return (UserBlog[]) this.Invoke("getUsersBlogs", new object[]{ appKey,  username, password}); 
}
 
/// <summary>
/// Returns basic user info (name, e-mail, userid, and so on).
/// </summary>
/// <param name="appKey"> This value is ignored. </param>
/// <param name="postid"> The ID of the post to update. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <returns> A struct containing profile information about the user.
/// Each struct will contain the following fields: nickname, userid, url, e-mail,
/// lastname, and firstname. </returns>
[XmlRpcMethod("blogger.getUserInfo")]
public UserInfo getUserInfo(
string appKey,
string username,
string password){
 
return (UserInfo) this.Invoke("getUserInfo", new object[]{ appKey,  username, password}); 
}
 
 
/// <summary>
/// Returns a specific entry from a blog.
/// </summary>
/// <param name="postid"> The ID of the post to update. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
    /// <returns> Always returns true. </returns>
[XmlRpcMethod("metaWeblog.getPost")]
public Post getPost(
string postid,
string username,
string password){

return (Post) this.Invoke("getPost", new object[]{ postid, username, password}); 
}
 
/// <summary>
/// Returns the list of categories that have been used in the blog.
/// </summary>
/// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>
/// <param name="username"> The name of the user’s space. </param>
/// <param name="password"> The user’s secret word. </param>
/// <returns> An array of structs that contains one struct for each category. Each category struct will contain a description field that contains the name of the category. </returns>
[XmlRpcMethod("metaWeblog.getCategories")]
public Category[] getCategories(
string blogid,
string username,
string password){
 
return (Category[]) this.Invoke("getCategories", new object[]{ blogid, username, password}); 
}
 
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args) {
 
MsnSpacesMetaWeblog mw = new MsnSpacesMetaWeblog();
string username = "!Space3*Pqc3*yUo00Y0!";
string password = "mYsEcReTwOrD";
mw.Credentials = new NetworkCredential(username, password);
 
try{
 
  // Space3Pqc3yUo00Y0
Post post = new Post();
post.categories = new string[]{"Test Posts"};
post.title = "Tets 3";
post.description = "This is my 3rd test post";
post.dateCreated = DateTime.Now;
 
string id = mw.newPost("MyBlog", username, password, post, true);
 
post.title = "Test 3 (typo fixed)";
 
mw.editPost(id, username, password, post, true);

post = mw.getPost(id, username, password);
Console.WriteLine("Just edited the post with the title '{0}' at '{1}'", post.title, post.dateCreated);
 
/* display list of categories used on the blog */
Category[] categories = mw.getCategories("MyBlog", username, password);

foreach(Category c in categories){
Console.WriteLine("Category: {0}", c.description);
}
 
/* display title of the ten most recent posts */
Post[] posts = mw.getRecentPosts("MyBlog", username, password, 10);
 
foreach(Post p in posts){
Console.WriteLine("Post Title: {0}", p.title);
}
 
mw.deletePost(String.Empty, id, username, password, true);
Console.WriteLine("The post entitled '{0}' has been deleted", post.title);
 
/* get info on user's blogs */
UserBlog[] blogs = mw.getUsersBlogs(String.Empty, username, password);

foreach(UserBlog b in blogs){
Console.WriteLine("The URL of '{0}' is {1}", b.blogName, b.url);
}
 
/* get info on the user */
UserInfo user = mw.getUserInfo(String.Empty, username, password);
Console.WriteLine("{0} {1} ({2}) is the owner of the space whose URL is {3}", user.firstname, user.lastname, user.email, user.url);

 
}catch(XmlRpcFaultException xrfe){
Console.WriteLine("ERROR: {0}", xrfe.FaultString);
}
 
Console.ReadLine();
}

}

}


posted by Sunny's
2010. 7. 30. 11:39 ETC

네이버 블로그에 글쓰기 API 가 열렸는데 MetaWeblog API 라는 Xmlrpc 규격으로 사용이 됩니다. 
MetaWeblog API 를 사용하시면 네이버 블로그 뿐만 아니라 유명한 블로그 시스템에도 글을 올릴 수 있으니 참고하세요. 

1. groovy 로 xmlrpc 사용하기 

기본 라이브러리에는 포함 되어 있지 않고 jar 파일을 따로 다운 받아야 합니다. 


여기 가시면 간단한 xmlrpc 예제를 보실 수 있구여 

실제 라이브러리는  

http://repository.codehaus.org/org/codehaus/groovy/groovy-xmlrpc/0.7/groovy-xmlrpc-0.7.jar

여기서 받으시면 됩니다. 

각자 클래스 패스가 잡히는 곳에 넣어두시면 되요 

2. MetaWeblog기능  

블로그에 글쓰기를 할 수 있는 표준 xmlrpc 규격이구여  이용할 수 있는 api 는 다음과 같습니다. 

글쓰기 : metaWeblog.newPost(blogid, username, password, struct, publish) return string 
수정 : metaWeblog.editPost(postid, username, password, struct, publish) return true 
읽기 : metaWeblog.getPost(postid, username, password) return struct
파일 업로드 : metaWeblog.newMediaObject(blogid, username, password, struct) return struct 
카테고리 : metaWeblog.getCategories (blogid, username, password) return array of structs
최근글 : metaWeblog.getRecentPosts(blogid, username, password, numberOfPosts) return array of structs 

정도의 기본 api 가 제공이 되고 있습니다. 



3. 네이버에서 글쓰기 API 허용하기 


이쪽 링크 가시면 잘 설명되어 있습니다. 

4. Groovy 에서 MetaWeblog 사용하기 

우선 아래와 같은 간단한 클래스를 하나 만들어 둡니다. 

import groovy.net.xmlrpc.XMLRPCServerProxy as Proxy

class MetaBlogProxy extends Proxy { 
MetaBlogProxy(url) {
super (url)
}
Object invokeMethod(String methodname, args) { 
super.invokeMethod ('metaWeblog.' + methodname, args)
}
}

api 를 사용할 때 모든 기능들이 metaWeblog. 이라는 네임스페이스가 붙기 때문에 간단하게 사용할 수 있도록 invokeMethod() 를 재정의 했습니다. (Groovy in Action 에 있는 내용 참고) 

5. 네이버 블로그에서 카테고리 목록 가지고 오기 

def blog = new MetaBlogProxy('https://api.blog.naver.com/xmlrpc') 

우선 xmlrpc를 사용할 주소를 지정합니다. 
생성된 객체를 가지고  metaWeblog.getCategories() 메소드를 실행합니다. 
(metaWeblog. 는 기본적으로 추가되게 되어있으므로 실제 메소드 실행하실 때 안적어주셔도 됩니다. ) 

자 이제 한번 목록을 얻어와볼까요? 

def categories = blog.getCategories(blogid, userid, password) 

간단하시죠. 프로토콜은 xmlrpc 이긴 한데 xml 을 다 작성하실 필요없이 groovy 에서 모두 해결해줍니다. 
그냥 메소드 사용하듯이 하시면 됩니다. 
매개변수를 간단히 설명드리면 

blogid : 자신의 네이버 블로그 아이디 
userid : 자신의 네이버 아이디 
password :  [ 3. 네이버에서 글쓰기 API 허용하기 ] 에서 미리 발급된 비밀번호 

자 이렇게 넣으면  아래와 같은 형태로 리스트가 나옵니다. 

[ [ title : '카테고리 제목', htmlUrl : '카테고리 링크', description : '설명'], ... ]

6. 최신 글 가지고 오기 

def articles = blog.getRecentPosts(blogid, userid, password, 10)   

형식의 category 가지고 오는 방식이랑 비슷하고 메소드 이름이랑 마지막에 가지고 올 개수 지정하는 부분만 틀립니다. 
리스트의 각 글을 가지고 있는 객체들은 아래와 같은 속성을 가집니다. 

title
description
tags
pubDate
    pubDate 의 경우 자바의 Date 객체 그대로를 전달해주기 때문에 groovy 에서 확장된 메소드가 사용가능합니다. 
    pubDate.format('yyyy-mm-dd') 로 바로 원하는 문자열로 바꿔주시면 됩니다. 
guid
postid
author

aticles.each {  obj -> 
    println obj.title 
}

이런식으로 리스트 출력하시면 됩니다. 

쉽죠. ^^;; 이걸로 하다보면 블로그를 네이버에 입력하는 시스템 기반으로 겁데기만 제가 만들어도 될 것 같네요. 

7. 네이버에 글을 써 볼까요? 

def postid = blog.getRecentPosts(blogid, userid, password, [
title : request.uploads.title.value,
description : request.uploads.content.value,
categories : ['프로그래밍'],
tags : 'blogapi'
], true)   

형태로 보내시면 됩니다.  

postid 가 리턴이 되어서 블로그 내용을 조회 할 수 있습니다. 

8. 블로그 포스트를 조회해볼까요? 

def post = blog.getPost(postid, userid, password)

조회를 하면 이런 내용이 나옵니다. 

[
    tags:, 
    guid:http://blog.naver.com/cyberuls/110080422720, 
    postid:110080422720, 
    pubDate:Wed Feb 10 14:54:00 UTC 2010, 
    author:cyberuls@naver.com, 
    title:네이버에 지도를 넣으면 ? ,
    username:cyberuls, 
    permaLink:http://blog.naver.com/cyberuls/110080422720, 
    description:  ,link:http://blog.naver.com/cyberuls, 
dateCreated:Wed Feb 10 14:54:00 UTC 2010, 
categories:[]
]

posted by Sunny's
prev 1 next