facebook API와 php로 새 글 등록하기

|

이전에 듣기로, 페이스북은 OAuth를 사용한다고 얼핏 들은것 같았으나,
실제 개발을 하려고 봤더니 정보를 구할 수 있는게 없더라.

me2day는 네이버 개발자 센터를 통해 한글로 잘 정리된 api를 볼 수 있어서 cURL 라이브러리로 작성했고,
twitter는 문서는 잘 되어 있으나 인증이 잘 되지 않아서 외부 php 라이브러리로 작성을 했더랬다.

facebook은 공식 문서도 잘 모르겠고 (graph가 뭐임?)
php용 라이브러리라고 되어있는 facebook.php는 봐도 어떻게 쓰는지 모르겠고....


게다가 국내 검색에서는 내용은 거의 찾을수도 없고....


그래서 일단은 성공했기에 블로그에 정리해둘겸 포스팅.


먼저 페이스북 사이트의 맨 아래 Developer 텍스트 링크를 따라 들어가보면, 이런 페이지가 뜬다.

사용자 삽입 이미지
일단 어플리케이션을 개발하려고 하면 문서도 문서지만... 키를 발급해야 하는데...
메뉴라곤, 문서 / 포럼 / 쇼케이스 / 블로그. 뿐.

도대체 키 발급은 어디서 받는건지... 한참을 찾아 헤멨다.
결국은 문서 안에서 찾았지만....

어플리케이션 등록 주소는 http://www.facebook.com/developers/apps.php 이곳이다.
어플리케이션 등록과 관리가 이루어지는 페이지.

이곳에서 어플리케이션을 등록하면 Application ID와 API Key, Application Secret이 발급된다.

문서상으로 보면 facebook API는 OAuth를 사용한다고 되어 있는데, 이게 좀 애매하다.
내가 알고있는(얼마전에 포스팅했던) OAuth와 키를 발급받는 과정도 좀 다르고,
최종적으로 발급되는 access token secret이 없다. 게다가 access token은 consumer key가 변경되기 전까진 영구적으로 유효한데,
어제 테스트하며 발급받은 access token과 오늘 다시 발급받아본 access token이 값이 다르다.

문서를 좀 더 뒤져봐야 할듯. 싶은데......


어쨌든, 이유는 나중에 알아보고 실제 어떻게 써야하는지 알아보자.
Developer 페이지에 PHP용 라이브러리가 하나 링크되어 있다.

https://github.com/facebook/php-sdk/tree/master/src/

이곳에서 facebook.php와 fb_ca_chain_bundle.crt 파일을 받아 서버에 올려놓자. 일단.
(아님 뭐 wget으로 바로 받아도 되고...)

먼저, php상에서 facebook 클래스 객체를 생성해 주어야 한다.

[code php]
require "./facebook.php";

$fb = new Facebook(array(
"appId" => //APPLICATION ID,
"secret" => //API Secret,
"cookie" => true //쿠키 지원 여부라는데 차이는 아직 잘 모르겠다. 아래에 설명되어 있다.
));
[/code]

그리고 api를 사용하기 위해서는 이 객체를 사용해서,
[code php]
$fb->api(...);
[/code]
이렇게 사용해야 하는데, 바로는 안된다.
왜냐, 로그인을 하지 않았기 때문.

로그인을 하려면 웹브라우저로 facebook쪽의 로그인 페이지를 열어주어야 하는데
이 주소는 다음과 같이 가져올 수 있다.
[code php]
$loginUrl = $fb->getLoginUrl(/*params*/);
[/code]

그러면 기본 로그인 주소가 나오게 되는데,
글쓰기를 하려면 scope를 주어야 한다. 그리고 모바일용 페이지라면 모바일용 웹페이지로.
그리고 로그인 후 이동하는 페이지는 현재 페이지 주소로 되어 있는데, 새 창으로 오픈할 경우에는 다른 페이지로 돌려야 할 거다.
이 값은 next라는 필드명으로 준다. facebook쪽을 거쳐서 오기 때문에 도메인을 포함한 Full URL로 적어주어야 한다.
결과적으로, 글쓰기를 가능하게 하고, 모바일용 웹페이지이며, 현재 페이지가 아닌 다른 주소로 돌아오게 하고 싶다. 라면

[code php]
$loginUrl = $fb->getLoginUrl(array(
"scope" => "publish_stream", //글쓰기 가능
"display" => "touch", //모바일용 웹페이지
"next" => "http://도메인/aaa/facebook_callback.html" //로그인 후 돌아올 페이지
));
[/code]
이렇게 생성하면 된다.

로그인을 취소한 후의 주소나 기타 다른 값들의 파라메터명은 문서를 참고하기 바란다.

자, 그럼 이렇게 생성한 주소를 자바스크립트의 window.open 으로 열어주고 로그인 및 정보 사용 동의가 끝나게 되면
위에 지정한 주소로 돌아오게 된다.

주소 뒤로 GET값으로 json형태의 값들을 가져오게 되는데, 궂이 어렵게 파싱할 필요 없이
콜백 페이지 php상의 Facebook 객체를 생성하면 세션이 살아있는 상태로 생성되게 된다.

이 상태에서 생성할때 사용하는 cookie 지원 여부에 처리방법이 달라지게 된다.

로그인 후 돌아온 콜백 페이지에서 facebook와의 연동(Facebook::api()함수 실행)을 한다면 궂이 쿠키를 지원할 필요 없이
생성된 클래스 객체로 사용하면 되고,

본인이 사용한 방법처럼 다른 페이지에서 다시 처리를 한다면 쿠키에 세션을 담아두어야 한다.
Facebook::SetCookie()라는 함수가 있으나, 세션이 살아있는채로 세션이 생성이 되었으므로, Facebook::GetSession()를 한번 실행해 주면 된다.
GetSession함수 내에 내부적으로 쿠키 설정 처리를 해주는 루틴이 들어가 있다.

즉, window.open으로 열었으니, opener.함수()형태로 로그인 이후 처리(=글쓰기)를 하고 window.close()를 그냥 해주면 되는거다.
이렇게,

[code]
<?
$fb = new Facebook(....); //생성하면 세션이 살아있는채로 생성됨.
$fb->GetSession();  //쿠키 설정을 위해 GetSession한번 실행
?>
<script type="text/javascript">
opener.facebook_act(); //페이스북으로 글 올리는 루틴
window.close();
</script>
[/code]

실제 API 실행은 Facebook::api()로 하게 된다.
글쓰기를 위해 필요한 파라메터는 글쓰는 내용을 담고 있는 "message" 파라메터이고,
기본적으로 "access_token"값을 같이 보내주어야 한다.

글쓰기는 다음과 같이 할 수 있다.
[code php]
$fb->api("/" . $fb->getUser() . "/feed?access_token=" . $fb->getAccessToken(), "POST", array(
"access_token" => $fb->getAccessToken(),
"message" => "메세지" //포스팅할 메세지
);
[/code]

이미지를 첨부하여 photo쪽에도 올릴 수 있는데, 기본적으로는 메세지 feed와 비슷하다.
주소를 /feed가 아닌 /photos로 돌리고,
보내는 파라메터에 "source"라는 이름으로 이미지 파일 패스를 넣어주면 된다.
이때, 파일 패스 문자열의 맨 앞에는 "@"를 붙여 주어야 한다. (이는 cURL의 스펙이다)

하나 더, 파일을 첨부하려면 Facebook::setFileUploadSupport()함수를 먼저 실행해 주어야 한다. (물론 인자는 true)

반환값은 api의 결과를 php array로 받아오며 글쓰기 성공 시 글의 ID가 내려온다.


마지막으로 하나 더,
Facebook 객체를 실행시킨 후 $fb->getSession()이 null이 아니라면 로그인 된 상태이므로
매번 로그인 페이지를 띄울 필요는 없다. 아래처럼.
[code php]
if($fb->getSession()) {
//로그인 된 상태. 바로 $fb->api()실행 가능
}else {
//로그인 안된 상태. 로그인 필요함.
}
[/code]



facebook.php를 열어보면 주석이 달려있긴 하지만 처음 사용에는 약간 이해가 어려운 부분이 있어서 간략하게 정리해 봤다.


덧.
Facebook 클래스 내의 함수들 중 '_'으로 시작되는 함수들은 내부 호출용 함수들로 보인다.
해당 함수를 wrap하고 있는 다른 함수가 있을 것이니 그 함수를 사용하면 될 것이다.



추가.
폼 데이터를 받아서 facebook에 등록하는 facebook.php이다. (위의 facebook.php와는 다름)
한 이틀 잘 되더니 This user not authorized for this action 뭐 이런 에러가 난다.
구글링을 해봐도 딱히 해결책이 안나온다.... 해결하신분 있으면 댓글좀.... -_-a
받아온 세션 페이지(콜백 페이지)에서 바로 처리하거나, 세션이 살아있는 페이지에서 쿠키를 설정해주면 된다. 위 설명 참고.


And