티스토리 뷰

페이스북

페이스북 realtime updates 사용하기

나를찾는아이 2013. 5. 14. 16:12
728x90
반응형

페이스북은 실시간 업데이트에 대한 API를 제공합니다.


페이스북의 서드파티 어플리케이션 사용자의 어떠한 정보가 바뀌었을때 정보가 바뀌었음을 실시간으로 알려주는 API입니다.


어플리케이션 개발자들이 사용자의 데이터가 바뀌었는지 안바뀌었는지 매번 조회할 필요 없이


페이스북이 해당 알림을 주는 경우에 해당 사용자의 정보를 다시 가져와서 업데이트 하면 되는 아주 편리한 API죠.



가장 흔히 쓰이는 경우는 페이스북 친구목록이 변경되었을때 이를 반영하기 위한 용도나,


사용자의 이름, 프로필 등이 변경되었을때 이를 반영하기 위한 용도죠.



페이스북에서 앱을 만들고 설정 메뉴의 Realtime Updates 메뉴에서 설정할수 있습니다.





fields 항목에는 업데이트 알림을 받고 싶은 범위를 선택하면 되고


callback에는 업데이트 알림을 받을 우리측 서버의 url을 넣으면 됩니다.


verify token은 callback으로 온 업데이트 알림이 페이스북으로 부터 유효하게 온것인지 체크하는 용도의 키값입니다.




이렇게 Realtime Updates를 설정하면 페이스북으로 부터 알람을 받을수 있게 됩니다.


페이스북은 해당 앱 사용자의 정보가 변경된 경우, 앱 설정에 Realtime Updates가 설정되었다면


해당 callback url로 해당 알림을 발송합니다.



콜백서버는 POST와 GET의 두가지 리퀘스트를 처리하면 됩니다.



페이스북이 콜백 url을 GET방식으로 호출할때에는 다음의 쿼리파라메터가 전송됩니다.



hub.mode  - "subscribe" 이라는 string이 전송됩니다.
hub.challenge - 랜덤한 string이 전송됩니다.
hub.verify_token - 설정했던 verify_token이 전송됩니다.



PHP에서 쿼리파라메터의 .(점)과 공백은 _ (언더바)로 자동 변환되기 때문에 


$_GET['hub_mode'], $_GET['hub_challenge'], $_GET['hub_verify_token']


이렇게 값을 사용해야 합니다.



콜백서버는 전송된 verify_token 값이 내가 설정한 값과 일치하는지 먼저 확인하고 맞다면


전송받은 hub.challenge 값을 그대로 출력하면 됩니다.


페이스북은 이 리턴된 값을 통해 해당 콜백서버에 대한 검증을 마치고 콜백서버로 데이터를 전송할 준비를 마치게 되는겁니다.


그리고 POST방식으로 실제 데이터를 전송합니다.


콘텐츠타입은 application/json 이고 json형태로 인코딩된 스트링이 전해집니다.


PHP의 경우 아래와 같이 페이스북으로부터 온 string을 전달받아 파싱하여 사용할수 있습니다.


$data = file_get_contents("php://input");
$json = json_decode($data);




페이스북은 매 5초마다 변경된 내역을 모아서 알림을 보내주거나, 변경된 내역이 1000개를 넘으면 보내준다고 하네요.



사용자의 어떠한 필드들이 변경되었는지 해당 회원의 ID와 함께 정보가 전달됩니다.


보안을 이유로 이 데이터에는 변경된 필드명만 있고,


실제로 변경된 값은 해당 회원의 엑세스토큰을 이용해 다시 페이스북의 API를 조회하여 얻어야 합니다.



페이스북이 전송하는 데이터 형태는 이런 구조를 갖습니다.


{
  "object": "user",
  "entry": [
    {
      "uid": 1335845740,
      "changed_fields": [
        "name",
        "picture"
      ],
      "time": 232323
    }, {
      "uid": 1234,
      "changed_fields": [
        "friends"
      ],
      "time": 232325
    }
  ]
}



만약 이 알림이 서버로 전달되는데 실패하면 페이스북은 몇차례 더 시도를 한다고 합니다.


페이스북은 추가로  X-Hub-Signature HTTP헤더를 전송합니다.


헤더값은 request 페이로드를 app의 secret을 사용하여 SHA1로 사인하고 sha1= 이란 접두사를 붙여서 전송됩니다.


이 값을 이용해서 콜백서버에서 시그니쳐를 비교분석하여 무결성을 검증할 수 있습니다.




PHP의 callback 예제 첨부하니 도움이 되었으면 좋겠네요.



if($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['hub_mode']) && $_GET['hub_mode'] == 'subscribe' && isset($_GET['hub_verify_token']) && $_GET['hub_verify_token'] == '확인용토큰') {
    echo $_GET['hub_challenge'];
}else if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $post_body = file_get_contents('php://input');
    $obj = json_decode($post_body, true);

    foreach($obj['entry'] as $v){

        if(in_array('friends', $v['changed_fields'])){
        }
       
        if(in_array('picture', $v['changed_fields'])){
        }
    }
}




728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함