이글은 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()); //에러 메시지 출력
'프로그램 > api&mfc' 카테고리의 다른 글
[MFC] 트레이 아이콘(Tray Icon)의 생성 및 사용 & 사용자 정의 메시지 (0) | 2012.10.14 |
---|---|
MFC 트레이 아이콘(TrayIcon) 등록 및 윈도우 감추기 (0) | 2012.05.19 |
윈도우 창 띄우기 (0) | 2012.04.03 |
[WinAPI] 윈도우 프로그래밍 (0) | 2012.03.02 |
델파이 Win 32 API 의 기본 틀에 대해 알아보자 ! (0) | 2012.02.26 |
API란 (0) | 2012.01.16 |
WINAPI 그림판 소스입니다. (1) | 2011.09.20 |
winapi 소스 (0) | 2011.09.19 |