6월 23일.
삼성 소프트웨어 멤버십에 들어오고나서 나의 첫 기술세미나를 가졌다. 세미나 주제는 신입 단기과제때 잠시 다뤄보았던 BlogAPI. 이를 이용하여 MS Windows Live Writer같은 원격 블로깅 프로그램을 만들어보자!
BlogAPI에 대해 알아보기 전에 XML-RPC에 대해서 알아볼 필요가 있다. XML-RPC란, RPC(Remote Procedure Call) 프로토콜의 일종으로서, 인코딩 형식에서는 XML을 채택하고, 전송 방식에서는 HTTP 프로토콜을 사용하고 있다. XML-RPC는 매우 단순한 규약으로서, 작은 데이터 형식이나 명령을 정의하는 정도로만 사용하고 있으며, 사양서도 A4 2매 정도로 꽤나 단순한 편이다. 이는 대다수의 RPC 프로토콜 시스템이 수많은 규격을 규정하고, 실제 사용할 때에도 엄청난 양의 코딩을 요구하는 것과 비교하면 눈에 띄는 특징이라고 할 수 있다. 간단히 말해 서로 다른 운영체제, 프로그래밍 언어 간에도 웹을 통해 데이터를 주고 받을 수 있도록 해주는 표준 프로토콜을 의미한다.
< XML-RPC 아키텍쳐 >
XML-RPC 중 특히 블로깅과 관련된 기능을 지원하는 것을 BlogAPI 라고 하며, 블로그에 직접 접속하지 않고도 원격으로 포스팅이 가능하고, 포스팅 한 글의 편집, 삭제 등등 블로깅 전반에 걸친 여러 함수들을 제공한다.
BlogAPI에는 MetaWeblog API, Blogger API, MovableType API 등등 여러 종류의 BlogAPI가 있다. 티스토리 블로그는 위의 세 BlogAPI를 모두 지원하며 각 블로그 서비스마다 지원하는 BlogAPI가 조금씩 틀리다. 여기서는 가장 널리 지원되고 있는 MetaWeblog API를 이용하여, C# 언어로 티스토리 블로그에 원격 블로깅을 할 수 있는 간단한 예제를 구현해본다.
http://www.xml-rpc.net/ 에 접속하면 첫페이지 상단에서 XML-RPC.NET Ver.2.4.0 을 다운받을 수 있다. 압축을 풀면 여러 폴더와 파일들이 나오는데, 다 필요없고 bin1_0 폴더 안의 CookComputing.XmlRpc.dll 파일만이 필요하다.
위 그림처럼 using CookComputing.XmlRpc 을 위해서CookComputing.XmlRpc.dll 파일을 프로젝트에 참조시킨다. 이 dll 파일안에 MetaWeblog API들이 포함되어있다. 우리는 그냥 가져다 쓰기만 하면 된다.
위에 첨부된 MetaWeblog.cs 파일을 다운받아 프로젝트에 추가하도록 하자. MetaWeblog API를 C#에서 바로 쓸 수 있게 만들어진 클래스다. 와... 이 정도면 그냥 거져 먹는거다. 간단하게 MetaWeblog.cs 의 내용에 대하여 살펴보자. 블로그와 관련된 구조체들이 선언되어 있고, 본격적으로 XmlRpc에 구현된 함수들을 C#에서 맛있게 먹도록 해줄 클래스가 있다.
구조체 선언부와 클래스 선언부 사이에 보면 [XmlRpcUrl("http://parksk.tistory.com/api")] 라는 부분이 있다. 티스토리 블로그의 경우에는 자신의 블로그 주소 뒤에 "/api"를 붙이면 되고, 이글루스 블로그 같은 경우에는[XmlRpcUrl(http://rpc.egloos.com/rpc1)] 로 수정하면 된다. 자신이 이용하는 블로그 서비스의 BlogAPI 설정을 참고하도록 한다. 이제 클래스 내의 여러 함수 중, 새 글을 포스팅하는 함수인 newPost함수에 대해 자세히 알아보자.
[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 });
}
newPost 함수는 blogid, username, password, content, publish 를 매개변수로 가지며, 각 매개변수를 이용하여 자신의 블로그에 원격 포스팅을 한다. 각 매개변수에 대해서 알아보자.
blogid
각 블로그 서비스마다 틀린데, 티스토리같은 경우 관리자 환경설정에서 BlogAPI메뉴를 보면 84258 등의 숫자로 되어있는 자신의 blogid를 알 수 있다.
username 블로그 아이디
password 블로그 비밀번호. 티스토리는 그냥 실제 자신의 비밀번호를 입력하면 된다. 이글루스는 비밀번호를 직접 입력하지 않고 따로 API Key를 제공받아 password로 사용한다. 아마도 실제 비밀번호가 노출되는 것을 막기 위한 듯
contents 포스팅 될 글의 제목과 내용. 실제 포스팅되는 중심부분
publish 포스팅의 공개 유무
자 이제 C#으로 원격 블로깅 프로그램을 구현할 준비가 다 되었다.
이제 아주 간단하게 만들어 본... 포스팅 정도는 할 수 있는 코드를 살펴보자.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CookComputing.XmlRpc;
using System.Net;
namespace blogapi
{
public partial class Main : Form
{
MetaWeblog mw = new MetaWeblog();
string username;
string password;
string blogid;
string postid;
public Main()
{
InitializeComponent();
mw.Credentials = new NetworkCredential(username, password);
}
private void btn_posting_Click(object sender, EventArgs e)
{
username = tb_blogid.Text;
password = tb_blogpw.Text;
blogid = tb_blogapiid.Text;
try
{
Post post = new Post();
post.categories = new string[] { "Test Posts" };
post.title = tb_title.Text;
post.description = tb_contents.Text;
post.dateCreated = DateTime.Now;
postid = mw.newPost(blogid, username, password, post, true);
}
catch (XmlRpcFaultException xrfe)
{
MessageBox.Show("ERROR : " + xrfe.ToString());
return;
}
MessageBox.Show("Posting is Completed");
}
private void btn_file_Click(object sender, EventArgs e)
{
username = tb_blogid.Text;
password = tb_blogpw.Text;
blogid = tb_blogapiid.Text;
MediaObjectUrl url =
mw.newMediaObject(blogid, username, password, mw.GetMediaObject("c:\\me.jpg"));
Post post = new Post();
post.categories = new string[] { "Test" };
post.title = "TEST";
post.description = "<img src=" + url.url.ToString() + ">";
post.dateCreated = DateTime.Now;
string id = mw.newPost(blogid, username, password, post, false);
MessageBox.Show("File Upload & Posting Completed");
}
private void btn_del_Click(object sender, EventArgs e)
{
username = tb_blogid.Text;
password = tb_blogpw.Text;
blogid = tb_blogapiid.Text;
try
{
Post post = new Post();
post.categories = new string[] { "Test Posts" };
post.title = tb_title.Text;
post.description = tb_contents.Text;
post.dateCreated = DateTime.Now;
mw.deletePost(String.Empty, postid, username, password, true);
}
catch (XmlRpcFaultException xrfe)
{
MessageBox.Show("ERROR : " + xrfe.ToString());
return;
}
MessageBox.Show("Deleting is Completed");
}
}
}
Windows Form 응용 프로그램 프로젝트 중 코드부분만 붙였다.
위 코드중 newMediaObject함수에 의해 리턴되는 url은 포스팅할 때 자신이 올린 파일의 주소이다. 이 주소를 이용해서 이미지 태그를 사용하여 이미지를 올린다던가 파일을 다운받을 수 있게 만드는 것이 가능하다. 여기까지 BlogAPI와 간단한 활용에 대해 알아보았다. C#을 조금이라도 아는 초보개발자라면 누구나 이해할 수 있을 정도로 쉽다. BlogAPI 별거 없다.
<참고자료>
http://msdn.microsoft.com/ko-kr/library/aa905670.aspx