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;
?>
---------------------------------------------------------------------------------------------------
===========================================================
<?php
include("d:/Project/xml-rpc/lib/xmlrpc.inc"); // http://sourceforge.net/projects/phpxmlrpc/ 의 배포파일에 포함 되어 있음...
/*
public struct[] blogger.getUsersBlogs(
string appkey,
string username,
string password);
*/
$appkey = "****";
$username = "****";
$password = "****";
$f = new xmlrpcmsg("blogger.getUsersBlogs",
array(
new xmlrpcval($appkey, "string"),
new xmlrpcval($username, "string"),
new xmlrpcval($password, "string")
)
);
print "<PRE>다음으로 보내지는 데이터 원본:<BR>" . htmlentities($f->serialize()) . "</PRE>\n"; // 보내는 메세지 출력
$c = new xmlrpc_client("/storageservice/MetaWeblog.rpc", "storage.msn.com", 443);
$c->setDebug(1); // debug 메세지 출력( msn 에서 보내주는 결과값 )
$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>"; //echo'
}//echo"
else {
print "Fault: ";
print "Code: " . htmlspecialchars($r->faultCode()) . "<br>";
print "Reason '" . htmlspecialchars($r->faultString()) . "'<BR>";
}
?>