본문 바로가기
연구_고민

xml rpc 를 통한 daum blog 에 글 등록 하기

by DevG 2007. 9. 27.

xml rpc 를 통한 daum blog 에 글 등록 하기

phpschool 의 fguy 님의 daum blog api 를 참고하여 작성하였습니다.
http://www2.phpschool.com/bbs2/inc_view.html?id=12080&code=tnt2&start=0&mode=search&field=title&search_name=&operator=and&period=all&category_id=&s_que=daum

api 는 올려주셨는데 사용법이 없어 올려 보았습니다.


0. 본 문서는 www.phpschool.com 의 tip&tech 게시판에 게시하며 작성자의 허락없이 무단 배포를 금지합니다.
xml 과 http 이해가 가능한자를 기본으로 작성하였습니다.

1. xmlrpc 란 무엇인가?

기존 서버-서버 간 또는 서버-클라이언트간 의 통신에서
form 을 이용한 방식은 페이지를 여러번 거쳐 request - response 를 반복해야하는 단점이 있고
socket 을 이용한 response - request 로 한 페이지 안에서 처리 할 수도 있지만
이 역시 각 서버(업체)마다 서로 상이한 response 결과가
발생하여 이를 다시 파싱하여 프로그램 하기에는 많은 노력이 필요했습니다.

여기에서 나온 대안이 표준문서인 xml 을 이용하는 것이며
xml 중 xmlrpc 방식의 전송규약(protocal) 을 이용하여 서버의 메소드에 바로 접근하는 것이라고
간단히 생각하면 될것 같습니다.

결과적으로 돌아가는 방식은
서버로 내용(xml)을 전송(POST)하여 그 결과(xml)를 받아 오는 방식으로
socket 이나 html - form 을 이용하는 것과 같다고 볼 수 있습니다.
다만 여기서 보내고 받는 방식에 통일된 전송규약(xmlrpc)을 두었다고 생각하면 될것 같습니다.

2. xmlrpc 의 이용 예제

이를 위해 xmlrpc-server 중 공개되어 있는 daum blog 를 이용하여
원격으로 (다음 사이트에 로긴하여 form 을 이용하여 직접입력하지 않고)
daum blog 에 글을 올리는 예제 입니다.

만약 daum 뿐만 아니라 기타 여러 사이트가 xmlrpc server 를 열어 준다면
개인서버등에서 한번의 입력만으로 여러 사이트에 동시에 글을 올리고
그 결과를 쉽게 받아 올 수 있을 것입니다.

(물론 여러 사이트에 한번에 글을 등록하기 위해서 기존에 http - form 이나 socket 을 사용하여 올릴 수도 있습니다.)

xmlrpc 를 이용하기 위해서 먼저 php 가 xml 과 xmlrpc 함수를 지원하도록 컴파일 되어 있어야 합니다.
(xml, xmlrpc 함수가 지원되지 않을때는 socket 과 문자열 파싱의 노가다로 해결 할 수도 있습니다.)

xmlrpc 관련함수는 --with-xmlrpc 로 컴파일시 xmlrpc-server 관련 함수는 기본 지원되나
xmlrpc-client 관련 함수는 지원되지 않으므로 http://sourceforge.net/projects/phpxmlrpc/ 에서 배포하고 있습니다.


fguy 님의 daum blog api 중 발췌
=======================================
Protocols
The DAUM BLOG API is currently implemented for XML-RPC
URI
All XML-RPC requests should go to the following URI: http://blog.daum.net/_blog/XMLRPC.do
Method
daum.blog.newPost.execute : 새 글 등록

daumid (string) : 다음 사용자 ID
password (string) : 다음 사용자 PASSWORD
subject (string) : 글 제목
body (string) : 글 내용
tag (string) : 이 글에 대한 태그 (카테고리)
date (string) : 작성일자 (ISO8601 형식. yyyy-MM-dd'T'HH:mm:ss'Z')

Return
(string) : 등록된 글 번호.
=======================================


위와 같은 daum blog api 가 공개 되었습니다. 이를 이용하여 글등록을 해보도록 하겠습니다.
아래의 소스는 http://sourceforge.net/projects/phpxmlrpc/ 의 배포파일내의 client.php 를 참조한 것입니다.

<?php
include("xmlrpc.inc"); // http://sourceforge.net/projects/phpxmlrpc/ 의 배포파일에 포함 되어 있음...

$userID = "XXXXXX";
$userPW = "XXXXXX";
$subject= "xml rpc input test";
$body = "Hello XMLRPC";
$tag = "daum tag";

$f = new xmlrpcmsg("daum.blog.newPost.execute",
array( new xmlrpcval($userID, "string"),
new xmlrpcval($userPW, "string"),
new xmlrpcval($subject, "string"),
new xmlrpcval($body, "string"),
new xmlrpcval($tag, "string"),
new xmlrpcval(date("c"), "string") )
);

//print "<PRE>다음으로 보내지는 데이터 원본:<BR>" . htmlentities($f->serialize()) . "</PRE>\n"; // 보내는 메세지 출력

$c = new xmlrpc_client("/_blog/XMLRPC.do", "blog.daum.net", 80);
//$c->setDebug(1); // debug 메세지 출력( daum 에서 보내주는 결과값 )
$r = $c->send($f);
$v = $r->value();

if(!$r->faultCode()) {
print "다음 등록 글 번호 : " . ($v->scalarval()) . "<BR>";
print "<a href=\"http://blog.daum.net/" . $userID . "/" . $v->scalarval() . "\">글보기</a><br>";
}
else {
print "Fault: ";
print "Code: " . htmlspecialchars($r->faultCode()) . "<br>";
print "Reason '" . htmlspecialchars($r->faultString()) . "'<BR>";
}
?>


위와 같이 하시면 다음 블로그에 글이 등록된 결과를 확인 하실 수 있을 겁니다.

3. 참고
http://www.xmlrpc.com/spec
http://xmlrpc-epi.sourceforge.net

시간이 없어 xmlrpc.inc 에 문자열 인코딩 부분을 확인 하지 못해 한글 입력은 현재 바로 사용하시면 깨져서 들어 갈 것입니다.
처리 하신 분들은 댓글로 부탁드려요 ^^;


---------------------------------------------------------------------------------------------------
--with-xmlrpc 의 옵션으로 컴파일 한 경우 아래와 같이 socket 과 같이 사용하니 한글 처리가 되는 군요...

<?php
    // daum 서버와 소켓 통신
    function sendQuery($request_xml) {
        global $host, $cgi;

        $fp = fsockopen($host, 80, $errno, $errstr, 30);

        if (!$fp) {
            exit(\"Error : fsockopen\");
        }

        $header =  \"POST \" . $cgi . \" HTTP/1.0\\r\\n\" .
                    \"User-Agent: Frontier/5.1.2(WinNT)\\r\\n\" .
                    \"Host: \" . $host . \"\\r\\n\" .
                    \"Content-Type: text/xml\\r\\n\" .
                    \"Content-length: \" . strlen($request_xml) . \"\\r\\n\";

        fputs($fp, $header . \"\\r\\n\" . $request_xml);
        $buff = \"\";
        while (!feof($fp)) {
            $buff .= fgets($fp, 1024);
        }
        fclose($fp);

        return $buff;
    }

    $headerDelim = \"\\r\\n\\r\\n\";
    $host  = \"blog.daum.net\";
    $cgi    = \"/_blog/XMLRPC.do\";
    $method = \"daum.blog.newPost.execute\";

    // array(userID, userPW, subject, body, tag, date)
    $param  = array(\"XXXXXX\", \"XXXXXXX\", \"xml rpc 입력 테스트\", \"하이\", \"daum tag\", date(\"c\"));

    $output_options = array( \"output_type\" => \"xml\",
                            \"verbosity\" => \"pretty\",
                            \"escaping\" => array(\"markup\"),
                            \"version\" => \"xmlrpc\",
                            \"encoding\" => \"EUC-KR\" );


    $request_xml    = xmlrpc_encode_request($method, $param, $output_options);
    $buff          = sendQuery($request_xml);

    $response_xml  = substr($buff, strpos($buff, $headerDelim) + strlen($headerDelim));
    $result        = xmlrpc_decode_request($response_xml, $method);

    echo \"<xmp>\";
    echo \"전송 데이터 : \\n\";
    echo $request_xml;
    echo \"\\n\\n\\n\";

    echo \"수신 데이터 : \\n\";
    echo $response_xml;
    echo \"\\n\\n\\n\";

    echo \"결과값 : \\n\";
    echo $result;
    echo \"</xmp>\";
    exit;
?>