ポイント
- GAEで利用する python2.5 でなくpython2.6以上を利用
json や urlparse.parse_qs でエラーとなる
AttributeError: 'module' object has no attribute 'parse_qs'
- 'scope':'read_stream,user_photos'
- 1度で20件づつしか取得できないので paging が必要となる
また、先頭の1行のデータは重複する(?)。
- http://127.0.0.1:8080/ を登録
- token が expire している場合は以下のエラーとなるため
urllib2.HTTPError: HTTP Error 400: Bad Request
$ rm .fb_access_token
参考
https://sites.google.com/site/benersuayen/lab/facebook
fb_albums.py
#!-*- coding:utf-8 -*-
#!/opt/local/bin/python2.7
import os.path
import json
import urllib2
import urllib
import urlparse
import BaseHTTPServer
import webbrowser
APP_ID = 'XXX'
APP_SECRET = 'XXX'
ENDPOINT = 'graph.facebook.com'
REDIRECT_URI = 'http://127.0.0.1:8080/'
ACCESS_TOKEN = None
LOCAL_FILE = '.fb_access_token'
def get_url(path, args=None):
args = args or {}
if ACCESS_TOKEN:
args['access_token'] = ACCESS_TOKEN
if 'access_token' in args or 'client_secret' in args:
endpoint = "https://"+ENDPOINT
else:
endpoint = "http://"+ENDPOINT
return endpoint+path+'?'+urllib.urlencode(args)
def get(path, args=None):
return urllib2.urlopen(get_url(path, args=args)).read()
def do_next(next,last_id):
count = 0
for item in json.loads(get(next))['data']:
if last_id <> item['id'].encode('utf-8'):
print "%s, %s" % ( item['id'].encode('utf-8') ,item['name'].encode('utf-8') )
count = count + 1
print '---'
last_id = item['id'].encode('utf-8')
next = json.loads(get(next))['paging']['next']
next = next.replace("https://graph.facebook.com/me/albums","/me/albums")
if next and count > 0:
do_next(next,last_id)
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
global ACCESS_TOKEN
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
code = urlparse.parse_qs(urlparse.urlparse(self.path).query).get('code')
code = code[0] if code else None
if code is None:
self.wfile.write("Sorry, authentication failed.")
sys.exit(1)
response = get('/oauth/access_token', {'client_id':APP_ID,
'redirect_uri':REDIRECT_URI,
'client_secret':APP_SECRET,
'code':code})
ACCESS_TOKEN = urlparse.parse_qs(response)['access_token'][0]
open(LOCAL_FILE,'w').write(ACCESS_TOKEN)
self.wfile.write("You have successfully logged in to facebook. "
"You can close this window now.")
if __name__ == '__main__':
if not os.path.exists(LOCAL_FILE):
print "Logging you in to facebook..."
webbrowser.open(get_url('/oauth/authorize',
{'client_id':APP_ID,
'redirect_uri':REDIRECT_URI,
'scope':'read_stream,user_photos'}))
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), RequestHandler)
while ACCESS_TOKEN is None:
httpd.handle_request()
else:
ACCESS_TOKEN = open(LOCAL_FILE).read()
# for item in json.loads(get('/me/feed'))['data']:
# if item['type'] == 'status':
# print item['from']['name'].encode('utf-8')
# print item['message'].encode('utf-8')
# if 'comments' in item:
# for comment in item['comments']['data']:
# print comment['from']['name'].encode('utf-8')
# print comment['message'].encode('utf-8')
# print '---'
# for item in json.loads(get('/me/friends'))['data']:
for item in json.loads(get('/me/albums'))['data']:
print "%s, %s" % ( item['id'].encode('utf-8') ,item['name'].encode('utf-8') )
last_id = item['id'].encode('utf-8')
print '---'
next = json.loads(get('/me/albums'))['paging']['next']
prev = json.loads(get('/me/albums'))['paging']['previous']
# print prev
print next
next = next.replace("https://graph.facebook.com/me/albums","/me/albums")
if next:
do_next(next,last_id)