본문 바로가기
IT 인터넷/프로그래밍

[PHP] 네이버 블로그 API 포스팅

by Oriyong 2020. 3. 27.
반응형

본 포스팅에서 소개하는 네이버 블로그 글쓰기 API는 2020년 5월 6일 종료됩니다. 본 포스팅은 XMLRPC에 대한 참고사항으로만 이용 바랍니다.

네이버 공지사항 : https://developers.naver.com/notice/article/10000000000030668634

 

블로그 오픈 API 종료 안내 - 공지사항

안녕하세요. 네이버 개발자센터 블로그 오픈 API 담당자입니다. 그동안 개발자센터에 제공해온 외부 서비스에서 네이버 블로그에 글을 등록할 수 있게 하는 로그인 방식 블로그 오픈 API를 종료합니다. ※해당 API를 사용중이신 개발자분들께서는 아래 일정 참고 부탁드립니다. - 대상 : 로그인 방식 블로그 오픈 API (글쓰기) - 내용 : 종료 - 적용시점 : 2020년 5월 6일 최근 특정 사용자분들이 해당 기능을 이용하여 반복적, 기계적으로 유사한 내용

developers.naver.com

네이버블로그API를 이용하면 일일이 블로그에 방문하지 않아도 글을 작성할 수 있습니다. 이 글은 PHP 개발자분들을 위한 글이니 API에 대한 설명이라던지, PHP 기본 내용은 건너뛰겠습니다. 저는 PHP에서 네이버블로그API를 이용해서 포스팅 작성하는 기능을 검색해서 만들었습니다. 그런데... 외부 모듈을 임포트 하는 방식이 대부분의 포스팅이었습니다. 과거에 작성된 내용이 복사되고 검색되고 하는 과정에서 반복되는 느낌이었습니다. 찾아보니 PHP에는 XMLRPC를 지원하는 함수가 포함되어 있었습니다. 임포트 없이 그냥 기본 함수 쓰면 되는 거였습니다. 이런저런 시행착오를 거쳐서 만들어진 거라 아직 완전 한진 모르겠지만 개인적으로 정리해 놓는 의미에서 적어놓습니다. 본 코드는 바로 복사, 붙여넣기 해서 ID값과 패스워드만 변경하여 사용하셔도 동작하는 한 페이지 짜리 코드입니다.

 

준비하기

네이버블로그API 비밀번호 확인

본 기능일 쓰려면 네이버블로그API용 패스워드가 있어야 합니다. 이건 네이버블로그 관리 메뉴에서 확인 가능한데요.

네이버블로그 > 관리 > 메뉴,글,동영상 관리 > 글쓰기 API 설정 > API연결정보 에서 확인 가능합니다.

저는 이미 API연결암호를 발급받았기 때문에 저런 화면이지만, 처음 신청하시는 분들은 빈칸에 암호 발급 버튼이 보이실 겁니다. 클릭하면 바로 발급됩니다. API연결 암호 라는 값을 코드의 NaverBlogAPIPassword 란에 작성하시면 됩니다.

 

코드 작성

네이버API글쓰기는 xmlrpc라는 스펙을 사용합니다. 자세한 정보는 http://xmlrpc.com/ 있다고 되어 있는데 저도 열심히 안 봤습니다. 저도 직접 양식 맞춰서 제너레이팅 할게 아니라서;;; 시간이 허락하시면 https://ko.wikipedia.org/wiki/XML-RPC 여기 글도 봐놓으시면 좋을 듯합니다. 제가 한 줄로 요약해서 말씀드리면

xml-rpc는 표준 형식으로 정해진 xml로 요청하면 반응해주겠다.

입니다. 위 문서들은 그 xml 형식이 어떻게 생겼다. 이런 내용이지만, 우리가 하나씩 양식을 만들긴 힘듭니다. 우린 배열을 전달하면 해당 양식으로 xml 문서를 반환하는 이미 만들어진 함수의 도움을 받습니다. 아래는 작성할 PHP 코드입니다.

<?php
$content = [];
$content['title'] = "제목입니다.";
$content['description'] = "<![CDATA[
  <p>본문 내용을 입력 합니다.</p>
]]>";
$content['categories'] = "카테고리명";  // 카테고리명을 일치하게 입력합니다.
// 포스팅할 컨텐츠를 작성합니다.

$struct = array(
    'title' => '{{title}}',
    'description' => '{{description}}',
    'categories' => '{{categories}}'
);
/* xmlrpc 함수에서 사용될 struct 영역 구조를 만들어줍니다.
한글을 작성해서 xmlrpc_encode_request 함수로 결과를 받아오면 글자가 깨집니다.
그래서 {{항목명}} 형태로 encoding한 후에 replace 명령어로 {{항목명}} 내용을 변경합니다.
*/

$method = 'metaWeblog.newPost';  // 글쓰기 method 명령어
$params = array(
  "NaverBlogId", // 네이버 블로그 아이디
  "NaverId", // 네이버 아이디
  "NaverBlogAPIPassword", // api연결암호
  $struct, // 컨텐츠 데이터
  true // 공개여부
);
// 각 항목을 채우세요.

$request = xmlrpc_encode_request($method, $params, array('encoding'=>'utf-8'));
/* PHP 7.x 버전에서는 utf-8 인코딩 옵션이 작동합니다.
그런데 PHP 5.x 버전에서는 option 전달이 제대로 안됩니다. 아래와 같은 형태로 해줘야 합니다.
$request = xmlrpc_encode_request($method, $params);
$request = str_replace("iso-8859-1", "utf-8", $request);
*/

// 컨텐츠 채우기
$request = str_replace("{{title}}", $content['title'], $request);
$request = str_replace("{{description}}", $content['description'], $request);
$request = str_replace("{{categories}}", $content['categories'], $request);
// 변경된 xml 양식에서 {{항목명}} 형태로 되어 있는 값들을 실제 값으로 replace 해줍니다.

// Post xml-rpc
$urlForXmlrpcNaverBlog = "https://api.blog.naver.com/xmlrpc";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlForXmlrpcNaverBlog);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml; charset=utf-8"));
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$results = curl_exec($ch);
curl_close($ch);
// curl을 이용해서 네이버API서버에 전달합니다.
// 결과를 받아와서 $result에 넣습니다.

$xmlString = simplexml_load_string($results);
$jsonResult = json_encode($xmlString);
print_r(json_decode($jsonResult, true));
// 받아온 결과를 화면에 표시합니다.
?>

 

 각 코드에 대한 설명은 주석으로 작성해놨습니다. 실제로 사용하실 때는 주석은 삭제하고 사용하시면 됩니다. 인코딩 문제 등 다양한 문제를 둘러서 해결하는 방식으로 만들어져 있으니, 고수분들이 리팩터링 하시면 코드가 많이 간결해질지도 모르겠습니다. 그래도 다른 모듈 없이 한 페이지로 복사,붙여넣기 해서 쓸 수 있는 코드를 제공하는 것에 의의를 둡니다. ㅎㅎ

실행하기

코드를 작성하고 해당 PHP 파일(URL 접근 등)을 실행해 주면 네이버블로그에 글이 올라가는 게 보입니다. 보통은 제3의 게시판에 글이 써질 때 네이버블로그에 같이 작성된다거나, 특정 시점에 특별한 내용들을 긁어와서 네이버에 글을 쓴다거나 할 때 코드를 이용한 포스팅을 하게 되는데요. 전 코드만 알려드릴 뿐. 활용은 각자의 영역입니다. ㅎㅎ

 

마무리

저도 처음에는 이 기능을 만들기 위해서 이런저런 포스팅을 찾았는데, 대부분은 모듈을 import하는 형식으로 되어 있었습니다. 근데 저는 함수가 이미 존재하니, 그걸 쓰면 된다고 생각했습니다. 지금은 왜 그런 모듈이 따로 만들어져 있는지 알 거 같습니다. ㅎㅎ; 이런 식이던, 저런 식이던 자신이 편한 방식으로 쓰시면 될 듯합니다. 또 PHP코드를 작성하다보면 일반 메모장은 너무 불편한데요. PhpStorm이나, WebStorm, Atom, SublimeText, Visual Studio Code 등 다양한 PHP 코딩을 도와주는 통합개발환경이나 코딩툴들이 있습니다. 비교해 보시고, 본인에게 맞는 에디터 쓰시면 생산성이 올라가니 추천합니다. ㅎㅎ

 추가적으로 말씀드리면 위 코드를 사용하실 땐 주의해서 사용하세요. 저는 이 모듈로 블로그에 과도하게 글을 올렸다가 블로그가 저품질에...... ㅠㅠ

 

반응형