페이지 미러링을 위한 페이스북 Graph API 사용기

한 페이스북 페이지를 지속적으로 관찰하면서, 일정한 기준 (반응수, 댓글수, 공유횟수) 을 넘는 게시글이 발견되면 내 소유 페이지로 미러링 하는 크롤러를 개발할 일이 생겼다. 페이스북은 피드가 정적으로 보여주는 것이 아니라 동적으로 실시간으로 로드되어 일반적인 크롤링 방식으로는 골치아프다. 다만 페이스북에서는 Graph API 를 제공하여, 페이스북의 여러 기능을 IOS, Android, Javascript (Web) 플랫폼에서 사용할 수 있도록 도움을 준다. 다만 이것이 (최소한 내 기준으로는) 꽤나 복잡하여 그 구조를 파악하는데 오래걸렸다. 사실 몇시간정도 훑어본거라 아직 제대로 알고 있지 못하다고 하는게 맞는 것 같다. 또한 나는 node.js 환경에서 작업해야하는데 node.js 용으로는 SDK 를 제공하지 않아 3rd-party 모듈을 사용해야 하는데, 적어도 npm 에 올라와 있는 모듈들은 그다지 완성도가 높아 보이지 않는다. 사용법도 잘 모르겠다. 내가 무식한건가?

앱 생성하기

일단 Graph API 를 사용하기 위해서는 개발자 등록을 마치고 Facebook APP 을 생성해야 한다. 그 앱에서 사용자 혹은 페이지에게 요청하여 권한을 받고, 그 권한 안에서 할 수 있는 기능들을 프로그램으로 작성하여 자동화 등을 할 수 있다. 권한을 받기위해서는 Graph API Explorer 에 들어가 토큰받기 > 사용자 액세스 토큰받기를 클릭하여, 원하는 권한을 선택하여 받으면된다. 나는 타 페이지를 미러링 하기 위한 목적이므로 manage_pages, publish_actions, user_posts, publish_pages 등의 권한을 받게 되었다. 사실 권한 하나하나가 정확히 어떤 역할인지 알지못해 관련있어 보이는 것은 모두 받았다. 헤헷.

피드 받아오기

일단 미러링 하기 위해서는 해당 페이지의 Feed 데이터를 받아와야 한다. 해당 공식 문서에서 많은 것을 확인할 수 있는데, 난 못알아듣겠다. Feed 데이터는 간단하게 GET 메소드를 사용해 다음 URL로 요청하기만 하면 된다.

https://graph.facebook.com/{페이지 ID}/feed/?fields=message,created_time,reactions.limit(0).summary(true),comments.limit(0).summary(true).filter(stream){message},shares.summary(true)&access_token={액세스토큰}&limit=100

페이지 ID는 페이지의 고유 정수값이며, findmyfbid.com 에서 알아낼 수 있다. fields 파라미터가 보일 텐데, 저 파라미터에서 반환할 필드를 설정할 수 있다. 현재 설정된 필드는 글내용, 작성일, 반응수, 댓글수, 공유수 이다. 여기서 .limit 는 나타낼 댓글들 내용의 수를 제한하는 것인데, 나는 댓글 내용은 필요없고, 반응, 댓글, 공유 각각의 수만 필요했기에 .limit(0) 을 사용하여 전혀 표시하지 않게끔 해놓았다. fields 파라미터에서의 limit 메소드 말고, 독립되어있는 limit 파라미터는 출력할 글의 갯수를 의미하며, 최대 100까지 설정할 수 있다. 가장 중요한것은 액세스토큰 인데, 페이스북 앱을 생성하고 난뒤 받을 수 있는 app_idapp_secret을 이용하여 다음과 같이 이어 놓으면 된다.

{app_id}|{app_secret}

이렇게 URL을 설정해놓은 다음 요청하게 되면 다음과 같이 결과를 반환 받을 수 있다. 나는 Graph  API Explorer 에서 예시를 위해 서울대학교 대나무숲 페이지의 피드를 반환받아 보았다.

포스트 올리기

이제 본격적으로 복잡해지게 된다. 결정적으로 내가 포기한 지점이기도 하고.. 사실 포스트를 올리는 과정은 그렇게 복잡한 것이 아니다. 다만 페이지 액세스토큰 이란것이 나의 발목을 붙잡게 되었다. Graph API 에는 토큰 종류가 4가지가 있다. User Access Token, App Access Token, Page Access Token, Client Access Token. 각각의 자세한 설명은 여기를 클릭해서 확인할 수 있다. 나는 페이지를 미러링 하기 때문에 페이지로 자동으로 페이지에 포스팅 하는 기능을 제작해야하는데, 페이지 액세스 토큰은 수동으로 계속 발급해줘야 한다.. 연장하면 60일까지 장기로 사용할 수 있는 토큰도 발급받을 수 있지만.. 아무튼.. 수동으로라도 발급 받아서 글은 쓸 수 있다. 여기서부터는 나는 fb 이라는 3rd-party 모듈을 사용했다. 그나마 완성도 있어 보였기에.

FB.setAccessToken('access_token');

모듈을 설치하고, import 시킨 후 이렇게 사용하여 액세스 토큰을 설정 할 수 있다. 물론 페이지에 글을 작성하는 것이니까 페이지 액세스 토큰을 Graph API Explorer에서 발급받아 넣는다.

FB.api('/feed', 'post', { message:  message }, function (res) {
  if(!res || res.error) {
    console.log(!res ? 'error occurred' : res.error);
    return;
  }
  console.log('Post Id: ' + res.id);
});

그 후 이런식으로 소스코드를 작성하면, 글쓰기 끝이다. 토큰을 수동으로 계속 발급 받는 수고만 없다면 간단한 과정이다. 더 자세한 것은 여기를 클릭하자.

뭐.. 결국

이번에도 포기하는 것인가. 트위터에는 많던 글작성 봇들이 페이스북에서는 유독 한번도 본 적 없는 이유를 알게되었다.