- 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)