본문 바로가기

닷컴's_열공/SNS

페이스북 Graph API를 사용하는 웹어플 만들기

회원제 커뮤니티 사이트를 만들려고 한다 
이 사이트의 홍보를 위해서 페이스북을 연동하려고 한다 
즉, 페이스북 계정을 가진 회원이 글을 작성하면 자신의 페이스북 담벼락에도 자신이 작성한 글의 일부와 링크가 등록되도록 하고 싶다 
이럴 때에 필요한 것이 페이스북 graph API를 사용한 웹어플이다 

웹어플 등록 
페이스북의 graph API를 사용하려면 앱 ID(App ID)가 필요하다 
App ID는 마치 회원가입을 하듯 이루어진다 
1. 앱 등록 
페이스북에 로그인 한 상태에서 다음 주소에 접속한다 

http://developers.facebook.com/setup/

사이트명, 사이트 URL을 입력하고 언어를 선택한 뒤 `앱 만들기`를 클릭한다 
2. 보안 확인 
Robot 등에 의한 자동 등록을 방지하기 위해서 보안 확인 문자열을 입력한다 
3. 완료 
앱 이름, 앱 URL, 앱 ID(API Key), 앱 시크릿 코드가 출력된다 
이 중에서 앱 ID는 코딩에 필요하므로 잘 기억해 두자 
나중에 자신이 등록한 웹어플을 관리하기 위해서는 다음 주소로 접속한다 

https://developers.facebook.com/apps

앱 이름, 앱 설명, 언어, 카테고리, 아이콘, 로고, 연락 이메일, 사이트 URL 등을 수정할 수 있다 

소셜 그래프 
페이스북의 핵심(core)은 social graph이다 
graph란 그래프 이론에서 다루는 수학 용어에 해당하며, 꼭짓점(vertex)의 집합과 두 꼭짓점을 잇는 변(edge)의 집합의 순서쌍으로 정의한다 
즉 일반적인 y=f(x)의 그래프보다는, 마인드맵이나 나무(tree)에 가까운 개념이다 
마찬가지로 페이스북의 social graph는 꼭짓점(vertex)에 해당하는 객체(object)와 변(edge)에 해당하는 연결(connection)로 구성되어 있다 

객체 
객체(object)에 해당하는 것은 사용자, 페이지, 이벤트, 그룹, 어플, 상태 메시지, 사진, 동영상, 노트 등등이다 
이들은 독립적인 객체(object)로, 저마다 고유한 ID를 가지고 있다 
Social graph에서 객체에 관한 정보를 가져오기 위해서는 다음 주소로 접속한다 

https://graph.facebook.com/(객체의 ID)

예를 들어, Nam Dongwoo라는 사용자(user)는 social graph를 이루고 있는 하나의 객체(object)이고 이 객체(object)는 ndongwoo라는 고유한 ID를 가지고 있다 
따라서 Nam Dongwoo에 대한 정보를 가져오려면 그 객체의 ID인 ndongwoo로 접속하면 된다 

https://graph.facebook.com/ndongwoo

그러면 페이스북 서버에서는 다음과 같은 형식의 json 파일을 출력한다 


"id": "100000786878603", 
"name": "Dongwoo Nam", 
"first_name": "Dongwoo", 
"last_name": "Nam", 
"link": "http://www.facebook.com/ndongwoo", 
"username": "ndongwoo", 
"gender": "male", 
"locale": "ko_KR" 
}

여기에서 특이한 점은 “id”라는 항목의 값이 “100000786878603”라는 것이다 
즉 Nam Dongwoo라는 사용자 객체의 진짜 ID는 100000786878603이고, ndongwoo는 별명과 같은 역할을 하는 ID인것이다 
따라서 다음 주소로 접속해도 위와 동일한 json 파일을 얻을 수 있다 

https://graph.facebook.com/100000786878603


연결 
객체(object)는 각각이 따로 존재하는 것이 아니라 서로간에 연결(connection)되어 있다 
각각의 객체마다 연결될 수 있는 객체의 종류가 정해져 있다 
또한 각각의 연결에는 저마다의 이름이 있다 
예를 들어 A, B라는 사용자, P라는 페이지가 있다고 하자 
A라는 사용자와 B라는 사용자는 연결될 수 있는 객체들이고, 친구(friend)라는 이름을 가진 연결을 갖는다 
A라는 사용자와 P라는 페이지는 연결될 수 있는 객체들이고, 좋아요(like)라는 이름을 가진 연결을갖는다 
하나의 객체가 가진 연결(connection)들의 목록을 얻기 위해서는 다음 주소로 접속한다 

https://graph.facebook.com/(객체의 ID)/(객체의 연결 이름)

예를 들어 ndongwoo라는 ID를 가진 사용자(객체)의 친구 목록(연결)을 알기 위해서는 다음 주소로 접속한다 

https://graph.facebook.com/ndongwoo/friends

ndongwoo는 객체의 ID를 의미한다 
friends는 그 객체의 연결의 이름을 의미한다 
그러면 페이스북 서버에서는 ndongwoo의 friends의 목록을 담은 json 파일을 출력한다 

인증 
위의 `객체` 항목에서 살펴본 것처럼, 객체에 대한 정보를 가져오는 것은 빠르고 편리하다 
하지만 이 방법에는 단점이 있는데, 누구에게나 공개된 정보(public information)만 얻을 수 있다는 점이다 
예를 들어 담벼락을 친구에게만 공개한 사용자의 경우 위의 방법으로는 그 사용자의 ID를 알더라도 담벼락의 글들을 가져올 수 없다 
이를 해결하기 위해서는 웹어플을 사용하는 사람(사용자)에게서 권한을 얻어야 한다 
자세한 내용은 다른 글에서 다루겠지만, 페이스북이 사용하는 인증 방식은 OAuth 2.0으로, 페이스북 서버, 사용자, 웹어플이 유기적으로 연동되도록 한다 
A라는 사용자가 X라는 웹어플을 사용하려고 하면 X는 A라는 사용자를 페이스북 인증 페이지로 보낸다(redirect) 
사용자 인증 페이지의 웹주소는 다음과 같다 

https://www.facebook.com/dialog/oauth?client_id=(앱 ID)&redirect_uri=(임시 열쇠를 받기로 한 웹주소)&scope=(웹어플이 필요로 하는 권한들)

페이스북은 A라는 사용자가 로그인한 상태인지 확인하고, 로그인하지 않은 상태라면 A라는 계정으로 로그인하도록 한다 
사용자가 페이스북에 로그인한 상태에서 X라는 웹어플이 허가를 요청한 권한들을 볼 수 있고, A라는 사용자가 여기에 동의할 경우 페이스북은 임시 열쇠(code)를 웹어플 X에게 전달한다 
웹어플 X는 임시 열쇠(code)를 받아서 페이스북 서버와 통신한다 
사용자의 웹브라우저를 통하지 않고 socket등을 사용하여 다음 웹주소로 요청을 보낸다 

https://graph.facebook.com/oauth/access_token?client_id=(앱 ID)&client_secret=(앱의 시크릿 코드)&redirect_uri=(임시 열쇠를 발급받을 때에 사용한 웹주소)&code=(방금 전달받은 임시 열쇠)

앱의 시크릿 코드는 노출되면 해킹의 위험이 있으므로 공개되어서는 안된다 
위의 요청을 받은 페이스북 서버는 임시 열쇠, 앱 ID, 앱 시크릿 코드를 확인하고 문제가 없으면 access_token과 expires를 출력한다 
redirect_uri는 임시 열쇠를 식별하기 위해서 필요한 값이며, 이 때 사용자 브라우저를 통하여 접속하는 것이 아니므로 실제 redirect는 이루어지지 않는다 
이제부터 X는 진짜 열쇠(access_token)를 이용해서 A가 허가한 권한들을 사용할 수 있게 된다 
예를 들어 위에서 언급한 다음 주소로 접속할 경우 Nam Dongwoo라는 사용자에 대한 공개 정보만 얻을 수 있었다 

https://graph.facebook.com/ndongwoo

그런데 Nam Dongwoo 본인이나 Nam Dongwoo의 친구들이 X라는 웹어플에 접속하여 권한을 허용하면 X라는 웹어플은 열쇠(access_token)를 갖게 된다 
동일한 웹주소로 접속할 때에 다음과 같이 access_token을 추가로 전달하면 친구에게만 공개된 정보들까지 추가로 얻을 수 있다 

https://graph.facebook.com/ndongwoo?access_token=...

역시 페이스북 서버에서는 json 파일을 출력하게 된다 

여러 객체 
여러 객체의 정보를 가져오려면 ids를 GET으로 전달하면 된다 
예를 들어 ndongwoo와 facebook이라는 ID를 가진 객체의 정보를 한꺼번에 가져오려면 다음 주소로 접속한다 

https://graph.facebook.com/?ids=ndongwoo,facebook

그러면 페이스북 서버는 다음과 같은 json 결과물을 출력한다 


"ndongwoo": { 
"id": "100000786878603", 
"name": "Dongwoo Nam", 
"first_name": "Dongwoo", 
"last_name": "Nam", 
"link": "http://www.facebook.com/ndongwoo", 
"username": "ndongwoo", 
"gender": "male", 
"locale": "ko_KR" 
}, 
"facebook": { 
"id": "20531316728", 
"name": "Facebook", 
"picture": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/174597_20531316728_2866555_s.jpg", 
"link": "http://www.facebook.com/facebook", 
"likes": 48841836, 
"category": "Product/service", 
"website": "http://www.facebook.com/\n", 
"username": "facebook", 
"founded": "February 4, 2004", 
"company_overview": "…(생략)", 
"mission": "Facebook's mission is to give people the power to share and make the world more open and connected." 

}


특정 필드 
특정 필드(또는 연결)에 관한 정보만 받아오려면 fields를 GET으로 전달하면 된다 
예를 들어 ndongwoo라는 ID를 가진 객체에서 id와 last name만 가져오려면 다음 주소로 접속한다 

https://graph.facebook.com/ndongwoo?fields=id,last_name

그러면 페이스북 서버는 다음과 같은 json 결과물을 출력한다 


"id": "100000786878603", 
"last_name": "Nam" 
}


페이지네이션 
개수를 기준으로 페이지네이션 하려면 limit 또는 offset을 GET으로 전달한다 
시간을 기준으로 페이지네이션 하려면 until 또는 since를 GET으로 전달한다 

검색 
페이스북 내에서 객체를 검색하려면 다음 주소로 접속한다 

https://graph.facebook.com/search?q=(검색할 문자열)&type=(검색 대상 객체의 종류)


글 등록 
열쇠(access_token)을 얻은 사용자에 대해서는 글을 등록할 수 있다 
ndongwoo라는 사용자가 X라는 웹어플에 접속하여 권한을 허용하면 X는 열쇠(access_token)을 갖게 된다 
X가 가진 열쇠(access_token)를 통해 X는 ndongwoo의 정보를 얻는 것 뿐 아니라 ndongwoo라는 사용자의 담벼락에 글을 작성할 수 있다 
다음과 같은 주소로 HTTP POST 방식으로 form을 전송하면 글을 작성할 수 있다 

https://graph.facebook.com/(권한을 허용한 사용자 ID)/feed

예를 들어 이미 ndongwoo라는 사용자로부터 열쇠(access_token)를 획득한 X라는 웹어플이 ndongwoo의 담벼락에 글을 작성하려면 다음 주소로 POST를 전송한다 

https://graph.facebook.com/ndongwoo/feed

POST로는 기본적으로 내용(message)과 열쇠(access_token)를 전송해야 한다 
추가적으로 사진(picture), 링크(link), 게시자 이름(name), 제목(caption), 설명(description), 출처(source) 등을 함께 전송할 수 있다 

댓글/좋아요 
글을 등록하는 것과 마찬가지 방법이다 
다만 글을 등록할 때에는 사용자라는 객체의 ID를 필요로 했다면, 댓글(comment)을 등록하거나 좋아요(likes)를 할 때에는 글(post)이라는 객체의 ID를 필요로 한다는 점이 다르다 
다음과 같은 주소로 HTTP POST 방식으로 form을 전송하면 댓글을 작성할 수 있다 

https://graph.facebook.com/(댓글을 등록할 글의 ID)/comments

POST로는 내용(message)과 열쇠(access_token)를 전송해야 한다 
또한 다음과 같은 주소로 HTTP POST 방식으로 form을 전송하면 좋아요(likes)를 할 수 있다 

https://graph.facebook.com/(좋아요를 할 객체의 ID)/likes

POST로는 열쇠(access_token)를 전송해야 한다 

'닷컴's_열공 > SNS' 카테고리의 다른 글

트위터 자동 포스팅하기  (0) 2011.10.20
[페이스북]FB.api 사용  (0) 2011.09.27
페이스북 로그인  (0) 2011.09.26
[PHP]Facebook에서 데이터 가져오기  (0) 2011.09.26
페이스북 API  (0) 2011.08.29