Steemit 포스트를 OpenAPI로 Naver 블로그로 보내기(export) using PHP

in #kr7 years ago (edited)


(결과물)

Github : https://github.com/junn279/steemjs_example/blob/master/naver_open_api.php

제목은 Steemit 포스트를 Naver 블로그로 보내기 입니다, 다만 모든 과정을 한번에 적을 수는 없어서..사실상 Naver OpenAPI 이용하기가 이번 포스팅의 핵심일 듯 합니다.

사실 이 과정은 여러 단계를 거쳐야 합니다. 이전 제 포스팅을 참고하시면 될 것 같습니다.
스팀잇에 쓴 글은 너무 오래된 것 같아 제 개인 블로그에 적은 글로 링크를 걸겠습니다.

1> 스팀잇 포스트를 불러온다.(Javascript 또는 Python)

https://junn.in/archives/557 : Get Posts (getState)

https://junn.in/archives/575 : Get Posts more than 20 posts, pagination

2> 마크다운으로 작성된 글은 Html 로 변환한다.

https://junn.in/archives/690 : Steem Markdown to HTML

3> 네이버로 보낸다.

 

오늘은 3번 부분을 진행하려고 합니다. OpenAPI에 대한 간략한 이해에 도움이 되었으면 합니다.

Mediteam.us 의 경우 1,2번 과정을 거친 뒤에 DB에 한번 저장을 하지만, 사실 DB에 저장할 필요는 없습니다.
Javascript로 본문 내용을 가져온 후, 마크다운을 HTML로 변환하는 과정이 자바스크립트로 가능하며,
이렇게 중간에 DB에 저장하지 않고 네이버로 전송하기위한 API를 사용하는 PHP 파일에 변수값으로 전달하면 되기 때문입니다.

이 예제에서 PHP를 사용한 이유는 단지 프로젝트의 중간과정이었던 DB에서 빼고 자료를 보내는 과정이 편리하기 때문이었습니다.

다음(Daum)의 경우에도 비슷한 형식으로 API를 제공하기 때문에, 이 과정이 가능하다면 다음(Daum) 블로그에 저장하는 것도 어렵지 않을 것입니다.

사실 가장 큰 문제는 네이버의 경우 OpenAPI를 사용하기에 앞어서 심사를 받는 점입니다.
블로그 쓰기를 하려면 '블로그 API' 를 이용해야하는데 이 경우 '네이버 아이디 로그인(네아로)' 기능을 필수로 이용해야 하며,
이 네이버 로그인은 심사를 받아야만 진행할 수 있습니다.

Mediteam.us 의 경우 블로그 보내기를 정해진 관리지만 진행하는 작업이라 이메일 부분을 체크했습니다.
그래야 PHP에서 if 문으로 체크를 할 수 있기 때문입니다. 심사는 대략 3일정도 걸린 것 같습니다.

위의 Client ID와 Secret 코드는 바로 볼 수 있습니다. 심사가 되어야 이용가능할 뿐입니다.

사실 예제가 사이트에도 잘 나와있습니다만 처음에 이해하기가 어려울 따름입니다.
이럴 땐 그냥 코드 복사가 정답인 듯 합니다.

Open API 흐름은 간단히 이렇게 생각하시면 됩니다.

로>> Access Token을 받음 >> Access Token을 저장(쿠키 등) >> Access Token을 통한 작업(사용자 정보 불러오기, 글쓰기 등)

Github : https://github.com/junn279/steemjs_example/blob/master/naver_open_api.php

예제의 로그인파트는 단순합니다. redirectURI를 로그인 페이지와 동일하게 처리할 수도 있습니다.
페이지 상단에 Callback 시 실행될 코드들을 넣어 작업하여 AccessToken이 잘 넘어왔으면 진행, 없으면 로그인 그림을 보이도록 하여 분기시킬 수 있게 때문입니다.

$client_id = "0pV03YSGMoL9r4Qc6G5J";
$redirectURI = urlencode(/* 콜백 페이지 주소 : http://~~~/callback.php */);
$state = "RAMDOM_STATE";
$apiURL = "https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=".$client_id."&redirect_uri=".$redirectURI."&state=".$state;

예제의 글쓰기, 사용자 정보 불러오기 파트에서 봐야할 것은 바로 cURL 파트입니다.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$response = curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
$res = json_decode($response);

혹은 아래와 같은 방식으로도 사용합니다. 예제에는 두 방식 코드를 다 남겨두었습니다. 저도 계속 복붙하는 부분입니다.

$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'https://openapi.naver.com/v1/nid/me',
CURLOPT_HTTPHEADER => array('Authorization: Bearer ' . $access_token)
));

$response = curl_exec ($ch);
curl_close ($ch);
$res = json_decode($response);

if($res->response->email == '허용된 email')
{
...
}

cURL 함수에 대한 예제는 구글에 많이 있기 때문에 자세한 설명은 생략했습니다.
중요한것 최종 response가 텍스트로 날라오기 때문에 json_decode 함수로 JSON 객체로 바꿔주어야 한다는 것입니다. 객체에 어떤 인스턴스들이 있는지는 var_dump로 항상 찍어서 확인합니다.

다음도 그렇고 네이버도 사실 모든 예제를 다 만들어놓지는 않습니다. 저도 처음 이 부분에 입문할 때 힘들었었는데요, API 명세서를 잘 보면

이런식으로 써있게 되는데, 잘 보면 중요한건

POST / GET 인지 여부 (위 예제에서는 POST)

URL (/blog/writePost.json)

Header 여부 (위 예제에서는 "Authorization: Bearer {토큰} ")

이런 부분들을 PHP cURL에서 조합을 하면 됩니다.

로그아웃(Access Token 폐기)도 명세서(https://developers.naver.com/docs/login/api/)의 2,3번 항목및 예제를 참조하여 만들면 아래와 같습니다.

$access_token = $_COOKIE['access_token'];
$service_provider = "NAVER";
$client_id = "0pV03YSGMoL9r4Qc6G5J";
$client_secret = /***********/;
$grant = 'delete';
$redirectURI = urlencode(로그아웃콜백페이지 주소);  /*이 코드가 적힌 페이지? */
$url = "https://nid.naver.com/oauth2.0/token?grant_type=".$grant."&client_id=".$client_id."&client_secret=".$client_secret."&redirect_uri=".$redirectURI."&access_token=".$access_token."&service_provider=".$service_provider;
$is_post = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$response = curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);

실제로 많은 부분이 생략된 소스입니다만 핵심 코드들 Github 파일에 다 모아놨습니다.

그 결과로, 아래와 같이 보내기용의 페이지를 제작한 후

네이버로 잘 보내지는 것을 확인했습니다.

== 오류 수정 (2018/1/8) ==
네이버로 옮겨가는 과정에 특정 문자가(특수문자) 있으면 오류가 발생하는 것을 발견했습니다.
Markdown 라이브러리의 문제일 수도 있고, 재미있는 현상이라 다음 포스팅(https://steemit.com/kr/@junn/steemit-naver-2)에 제대로 설명하도록 하겠습니다.

Sort:  

I don't understand the language.
Kindly up vote

오호 신기하네요 좋은 글 잘 보고가요 :)

감사합니다~ :)

Please vote my post

꿀팁이네요!! ^^ 감사합니다

뭔가 바리바리 적긴했는데, 저도 항상 복붙하여 그때그때 수정하는거라 제대로 도움이 되는 글일지 모르겠네요 ㅠ

Good one you shared @junn

successful sharing Jun 👍

Do you have an English version?

I'm sorry, I cannot afford to translate this article in English. :(

좋은 시도네요. 재미있게 보고 있습니다.

도움이 되는 내용이었으면 좋겠습니다 ㅎ

유용한 정보 감사합니다.
저도 한 번 시도해 봐야겠네요~

API 를 하나하나 사용하는건 디버깅도 그렇고 쉽지 않은 일인 것 같습니다. 이 글이 조금이나마 도음이 되면 좋겠습니다.

Coin Marketplace

STEEM 0.25
TRX 0.21
JST 0.036
BTC 97583.14
ETH 3481.73
USDT 1.00
SBD 3.45