2013년 5월 18일 토요일

[python] facebook bot 구현, access token 자동 갱신



트위터와는 달리 페이스북 봇에 대한 정보는 인터넷에 거의 없다.

트위터와 페이스북의 성격이 다르다는 점이 주된 이유겠지만

주변에 페이북 유저가 트위터 유저보다 훨씬 많아서 페이스 봇을 만들고자 했다.

먼저 페이스북에 글을 올리기 위해서는


1. Request를 직접 보내는 방법

2. Facebook API를 이용하는 방법


이렇게 두가지 방법이 가능하다.

페이스북은 플래시, 파이썬, 루비, 자바 등의 다양한 언어에 대해 API를 제공하고 있다.

파이썬에서는 Graph API 가 제공되며, 페이스북에서 데이터를 주고 받을때 주로 사용되는 API 이다.


python graph api 링크 : https://github.com/pythonforfacebook/facebook-sdk/

API 공식 reference : https://developers.facebook.com/docs/reference/api/


API를 이용하는 경우 데이터를 올리고 받을때 사용할 계정을 developer로 등록해야 하며

어플리케이션을 하나 만들어서 앱 ID를 가지고 있어야 한다

그리고 나선 어플리케이션이 할 수 있는 행동들의 범위를 지정해 주고 그에 대한 oauth_access_token를 받아야 한다

graph = facebook.GraphAPI(oauth_access_token)
profile = graph.get_object("me")
friends = graph.get_connections("me", "friends")
graph.put_object("me", "feed", message="I am writing on my wall!")

tags = json.dumps([{'x':50, 'y':50, 'tag_uid':12345}, {'x':10, 'y':60, 'tag_text':'a turtle'}])
graph.put_photo(open('img.jpg'), 'Look at this cool photo!', album_id_or_None, tags=tags)


파이썬 기본 예제에서 볼 수 있듯이 oauth_access_token 가 있어야 글을 얻거나 사진을 올릴 수 있다.

하지만 봇을 만들때 문제는 이 access_token이 시간이 지나면 expire 된다는 것이다.


나는 이 문제를 해결하기 위해 access_token을 자동으로 갱신받는 방법을 찾아 봤으며

브라우저를 이용하는 방법 post request를 사용하는 방법 등 여러가지를 시도해봤지만 실패했다.

하지만 방법을 결국 찾았는데 웹 사이트에서 페이스북 api를 사용하고자 할 때

그 웹 사이트에서 api를 사용할 수 있도록 만들어 주는 url을 만들 수 있으며

그 url 로 접속해서 접근하고자 하는 유저로 로그인을 하고 나면 redirect 되는 url에 oauth_access_token 이 주어진다.


아래의 소스는 위의 방법을 구현한 python 소스다.

분명 이 방법보다 쉬운 방법이 있을 수 있으나 내 검색 능력에서는 이게 최선이었다.

혹시라도 나와 같은 어려움을 겪고 있는 사람들을 위해 방법을 공유하고자 이렇게 글을 올린다.

이를 이용하면 재미있는 어플리케이션을 많이 만들 수 있을 것이다.

# author = 'carpedm20'

import mechanize
import facebook

while 1:
        br_mech = mechanize.Browser() # mechanize 를 이용해 브라우징을 한다
        br_mech.set_handle_robots(False) # 페이스북의 로봇 필터에 걸리지 않게 한다

        link='https://www.facebook.com/dialog/oauth?scope=사용하고자 하는 auth 범위
        &redirect_uri=리다이렉트 할 사이트 주소
        &response_type=token&client_id=어플리케이션 ID'

       # link='https://www.facebook.com/dialog/oauth?scope=publish_stream,publish_actions,
       # &redirect_uri=http://carpedm20.blogspot.kr
       # &response_type=token&client_id=어플리케이션 ID'

        #print '[1] open link'
        br_mech.open(link)

        #print '[2] current url : ' + br_mech.geturl()

        br_mech.form = list(br_mech.forms())[0]
        control = br_mech.form.find_control("email")
        control.value='로그인 할 계정 이메일'
        control = br_mech.form.find_control("pass")
        control.value='로그인 할 계정 비밀번호'

        #print '[3] submit'
        br_mech.submit() # 로그인

        #print '[4] current url : ' + br_mech.geturl()

        app_access = br_mech.geturl().split('token=')[1].split('&expires')[0]
        print '[5] access token : ' + app_access # access token 을 파징해서 출력한다
ps. 포탈봇 : https://www.facebook.com/hexa.portal
ps2. 컴공아 일하자 : https://www.facebook.com/comgong.job

댓글 2개:

  1. 위 소스로 테스트해보니까 안되네요...왜그럴까요??

    답글삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제