본문 바로가기
연구_고민/PHP & MySql

metaWeblog

by DevG 2007. 9. 27.

Open API에 관심을 갖게 되어 여기 저기 찾아보니 요새 많은 블로그들에서 범용으로 사용되는 프로토콜이 XMLRPC란 것을 알게 되었고, XMLRPC를 PHP에서 사용할 수 있도록 작성해 놓은 라이브러리를 찾을 수 있었다. XMLRPC for PHP 라이브러리는 소스포지의 한 프로젝트이며, 현재 2.2 버전까지 릴리즈가 되어 있다.

http://phpxmlrpc.sourceforge.net/

Open API에 관심을 갖게 만든건 미투데이의 블로그로 글 배달 서비스이다. 이 서비스를 받아들이기 위해서는 내 블로그에 XMLRPC 서버 기능을 추가해야 한다. 서버 기능이란 내 홈페이지로 request가 오면 그에 대한 처리를 하고 응답을 해 주는 기능을 말한다. 미투데이의 블로그로 글 배달 서비스의 경우 metaWeblog.newPost를 내 홈페이지에 보내게 되고, 서버 프로그램에서 그 request를 받아들여 DB에 글을 등록한 후 작성적으로 처리했다는 응답을 미투데이에 보내줘야 한다.

일단 미투데이의 블로그로 글 배달 서비스를 받기 위해선 blogger.getUsersBlogs 메소드와 metaWeblog.newPost 메소드에 대한 처리를 구현해야 한다. blogger.getUsersBlogs를 받으면 내 블로그에 대한 정보를 응답으로 보내줘야 하고, metaWeblog.newPost를 받았을 때는 글을 DB에 등록한 후 등록된 번호를 응답으로 보내줘야 한다.

참고로 FireFox의 부가기능인 ScribeFire에서는 위의 메소드 외에 metaWeblog.getCategories 메소드와 metaWeblog.getRecentPosts 메소드를 사용하여 블로그 정보를 얻어간다. 이 메소드들의 기능은 메소드 이름에 명확히 나타나 있기때문에 굳이 설명을 할 필요가 없어보인다.

이 밖에도 많은 메소드들이 존재하는데 다음의 페이지에서 간단한 정보를 얻을 수 있다. 어떤 메소드들이 있고 이 메소드에 대한 응답은 어떻게 하는지 간단하게 살펴볼 수 있다.

http://www.peopleaggregator.net/api/doc/peopleaggregator.html

이제 위의 메소드들에 대해서 서버 기능을 구현해주기만 하면 된다. XMLRPC for PHP 라이브러리는 체계적으로 잘 작성되어 있어서 어렵지 않게 구현할 수가 있다. 조금 살펴봐야 할 부분이 있다면 xmlrpcval class를 사용하는 방법 정도일 것이다. 물론 다큐먼트에 예제들이 잘 나와 있다.

xmlrpc.php라는 이름으로 서버 기능을 구현해 본다.

먼저 php파일 상단에 두 개의 파일을 인클루드 한다.

include "xmlrpc.inc";
include "xmlrpcs.inc";

그 다음 xmlrpc_server를 생성한다. 생성시 아규먼트로 메소드와 싱행할 함수의 쌍의 배열을 사용한다. 해당 메소드의 request를 받으면 콜백함수로써 등록된 함수가 실행되는 방식이다.

$s = new xmlrpc_server(
 array(
  "blogger.getUsersBlogs" => array("function", "blogger_getUsersBlogs"),
  "metaWeblog.getCategories" => array("function", "metaWeblog_getCategories"),
  "metaWeblog.getRecentPosts" => array("function", "metaWeblog_getRecentPosts"),
  "metaWeblog.newPost" => array("function", "metaWeblog_newPost")
 )
);

예를 들면, metaWeblog.newPost 요청을 서버에서 받은 경우 metaWeblog_newPost 함수가 실행되는 방식이다. metaWeblog_newPost 함수는 서버에서 구현해 주어야 하며 다음과 같이 작성할 수 있다.

function metaWeblog_newPost($msg)
{
 // $msg에는 클라이언트로부터 받은 XML 데이터가 포함되어 있다.
 
 $id = $msg->getParam(1);
 $id = $id->scalarVal(); // ID
 $password = $msg->getParam(2);
 $password = $password->scalarVal(); // Password

 // $id, $password를 비교해서 정상적인 접근인지 검사.

 // 응답할 XML 데이터 생성
 $value = new xmlrpcval(/* 응답할 데이터 */);

 return new xmlrpcresp($value); // 요청한 클라이언트로 응답
}

$msg에는 XML 데이터가 담겨있다. 각 값들을 파싱하는 함수들이 존재하므로 xmlrpcval 클래스 도움말을 참조하여 값들을 뽑아오면 된다. 요청을 잘 처리했으면 잘 처리했다는 응답을 요청한 클라이언트로 보내줘야 한다. xmlrpcresp 클래스를통해 응답을 해주게 되는데, 이 때 사용되는 $value값은 xmlrpcval 클래스를 사용하여 적당히 만들어줘야 한다.

지금까지의 작업으로 미투데이에서의 metaWeblog.newPost 요청을 처리할 수 있었다. 그런데 안타깝게도 한글이 깨져나오는 문제가 아직 존재한다. 오늘은 한글 문제를 해결하기 위해 골머리좀 쓰게 될 것 같다.