'PHP-XMLRPC'에 해당되는 글 1건

  1. 2011.08.24 PHP-XMLRPC기반 metaWebblog API 정리
프로그램/api&mfc2011. 8. 24. 18:33

이글은 http://blog.qnibus.com/319 에서 발췌한 글입니다.

파일첨부 및 카테고리 선택 후 포스트 발행이 목표입니다.

시작하기 앞서 PHP기반 라이브러리는 http://phpxmlrpc.sourceforge.net/ 이곳에서 다운로드 받으셔서 설치하시면 됩니다.

다운로드 받으시면 정말 많은 파일들이 있는데요 압축해제후 lib/xmlrpc.inc 이파일을 include 하셔서 사용하시면 됩니다.

아래의 예제를 통해서 익혀보세요!

[데모페이지]

http://lib.qnibus.com/m_metaWeblog/

테스트는 티스토리만 제외하시고 나머지 블로그를 선택하시어 적당히 테스트 해주시면 되겠습니다.

나머지 블로그는 어차피 사용안하는 블로그이니 부담은 갖지않으셔도 될듯 ^^;

[index.php]

이파일은 원격발행에 필요한 기본적인 폼양식을 만들어놓은 것 입니다.

상단에 환경설정은 보시고 자신의 환경에 맞게 잘 작성해주세요!

더불어 카테고리도 추출할 수 있게 만들어놓았으니 상단에 데모페이지에서 확인해보시면 되겄습니다.


<?php

//환경설정

$q_blogApiUrl = array(

"tistory"=>"http://blog.qnibus.com/api",

"naver"=>"https://api.blog.naver.com/xmlrpc",

"egloos"=>"https://rpc.egloos.com/rpc1",

"wordpress"=>"http://qnibus.wordpress.com/xmlrpc.php"

);

$q_blogId = array(

"tistory"=>"123456",

"naver"=>"blogid",

"egloos"=>"blogid",

"wordpress"=>"blogid"

);

$q_userName = array(

"tistory"=>"blog@example.com",

"naver"=>"id",

"egloos"=>"blog@example.com",

"wordpress"=>"id"

);

$q_password = array(

"tistory"=>"password",

"naver"=>"api_key",

"egloos"=>"api_key",

"wordpress"=>"password"

);

require_once 'lib/xmlrpc/lib/xmlrpc.inc';

$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; //한글 출력 가능케 함 반드시 넣어야 함 안넣으면 오류발생

$q = $_GET['q'] ? $_GET['q'] : 'naver';

//카테고리 정보 추출 시작

$client = new xmlrpc_client($q_blogApiUrl[$q]);

$message = new xmlrpcmsg("metaWeblog.getCategories",

array(

new xmlrpcval($q_blogId[$q], "string"),

new xmlrpcval($q_userName[$q], "string"),

new xmlrpcval($q_password[$q], "string"),

)

);

$message->request_charset_encoding = 'UTF-8';

$response = $client->send($message);

$value = $response->value(); //카테고리 struct 반환

for($i=0; $i<$value->arraysize(); $i++) $categories[$i] = $value->arraymem($i)->me['struct']['title']->me['string']; //카테고리 타이틀 배열로 생성

natsort($categories); //자연어 정렬

?>

<html>

<head>

<title>원격발행</title>

</head>

<body>

<h1>metaWeblog API</h1>

<ul>

<li><a href="./?q=naver">네이버</a></li>

<li><a href="./?q=tistory">티스토리</a></li>

<li><a href="./?q=egloos">이글루스</a></li>

<li><a href="./?q=wordpress">워드프레스</a></li>

</ul>

<form method="post" enctype="multipart/form-data">

<fieldset>

<legend>newPost Publish</legend>

<input type="hidden" name="q" value="<?php echo $q?>" />

<p>

<label>Title</label>

<input type="text" name="title" size="30" />

</p>

<p>

<label>Category</label>

<select name="categories">

<?php foreach($categories as $val):?>

<option value="<?php echo $val?>"><?php echo $val?></option>

<?php endforeach?>

</select>

</p>

<p>

<label>Description</label>

<textarea name="description" cols="50" rows="5"></textarea>

</p>

<p>

<label>Tags</label>

<input type="text" name="keywords" value="PhotoShake!" />

</p>

<p>

<label>File</label>

<input type="file" name="upload" />

</p>

<p>

<input type="submit" value="submit" />

</p>

</fieldset>

</form>

</body>

</html>

[action.php]

처음에 멋도 모르고 하면 되겠지했었는데요~ 우선 이미지 첨부해서 포스팅하는 방법을 몰라서 헤맸는데 네이버 설명서(http://blog.qnibus.com/318) 보고 도움을 얻었구요!

그거 했더니 네이버에 태그와 티스토리에 카테고리가 등록이 안되서 한참을 헤맸었습니다.

태그 Parameter의 경우 mt_keywords로 사용하는데 네이버의 경우는 tags로 변경하셔야 태그가 정상등록됩니다.

티스토리는 완벽하게 카테고리를 배열로 넘겨줘야 등록됩니다. 나머지는 그냥 대충써도 넘어가구요!


<?php

//환경설정 (공동으로 사용하는 파일이니 xmlrpc.inc나 config.php로 파일 만들어 include 시켜서 사용하세요 한눈에 보여드리려고 풀어헤쳤습니다.

//반드시 환경설정부는 자신의 블로그 관리에서 확인하신후 정보를 변경하셔야 정상 출력합니다.

$q_blogApiUrl = array(

"tistory"=>"http://blog.qnibus.com/api",

"naver"=>"https://api.blog.naver.com/xmlrpc",

"egloos"=>"https://rpc.egloos.com/rpc1",

"wordpress"=>"http://qnibus.wordpress.com/xmlrpc.php"

);

$q_blogId = array(

"tistory"=>"123456",

"naver"=>"blogid",

"egloos"=>"blogid",

"wordpress"=>"blogid"

);

$q_userName = array(

"tistory"=>"blog@example.com",

"naver"=>"id",

"egloos"=>"blog@example.com",

"wordpress"=>"id"

);

$q_password = array(

"tistory"=>"password",

"naver"=>"api_key",

"egloos"=>"api_key",

"wordpress"=>"password"

);

require_once 'xmlrpc/lib/xmlrpc.inc';

$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';

// 파일 업로드

if (!empty($_FILES['upload']['name']))

{

$tempFile = $_FILES['upload']['tmp_name'];

$fileName = $_FILES['upload']['name'];

$fileType = $_FILES['upload']['type'];

// 파일 바이너리 데이터 가져오기

$fp=fopen($tempFile, "rb");

if (!$fp) return null; // file open failure !!

while( !feof($fp))

{

$filedescription .= fread( $fp, 1024); // 1024 is the server compatible buffer size

flush();

@ob_flush();

}

fclose($fp);

$client = new xmlrpc_client($q_blogApiUrl[$q]);

$newMediaObject = new xmlrpcmsg("metaWeblog.newMediaObject",

array(

new xmlrpcval($q_blogId[$q], "string"),

new xmlrpcval($q_userName[$q], "string"),

new xmlrpcval($q_password[$q], "string"),

new xmlrpcval(

array(

'name'  => new xmlrpcval($fileName, "string"),

'type'  => new xmlrpcval($fileType, "string"),

'bits' => new xmlrpcval($filedescription, "base64"), //파일 바이너리 값

), "struct")

)

);

$newMediaObject->request_charset_encoding = 'UTF-8';

$tempResponse = $client->send($newMediaObject);

$uploadFileName = $tempResponse->value()->me['struct']['url']->me['string'];

$uploadFileSize = getimagesize($tempFile);

$description = '<img src="'.$uploadFileName.'" '.$uploadFileSize[3].' /><br />'.$description.'<p>'.$_SERVER['REMOTE_ADDR'].'</p>';

}

$content = array(

'title'   => new xmlrpcval($title, "string"),

'description'   => new xmlrpcval($description, "string"),

        'dateCreated'  => new xmlrpcval(date("Ymd")."T".date("H:i:s"), "dateTime.iso8601"),

'categories' => new XMLRPCval(array(new XMLRPCval($categories,"string")), "array"),

($q=='naver') ? 'tags' : 'mt_keywords' => new xmlrpcval($keywords),

);

$client = new xmlrpc_client($q_blogApiUrl[$q]);

$message = new xmlrpcmsg("metaWeblog.newPost",

array(

new xmlrpcval($q_blogId[$q], "string"),

new xmlrpcval($q_userName[$q], "string"),

new xmlrpcval($q_password[$q], "string"),

new xmlrpcval($content, "struct"),

new xmlrpcval(true, "boolean")

)

);

$message->request_charset_encoding = 'UTF-8';

$response = $client->send($message);

$value = $response->value();

$postno = $value->scalarval(); // 발행한 결과로 블로그의 포스트 넘버를 반환합니다.

//디버그 확인

echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';

if(!$response->faultCode()) echo "성공적으로 발행되었습니다.";

else echo htmlspecialchars($response->faultString()); //에러 메시지 출력

Posted by wrnly