如何在加载Facebook好友到Google App Engine示例时解析JSON数组?
我刚开始想做一个可以和Facebook互动的Google App引擎应用。我的编程经验主要是在Matlab里做一些数字计算,这种语言比较高级,很多真正的程序员甚至都没听说过。我正在尝试扩展Facebook提供的一个示例,具体可以在这里找到。目前为止,我尝试添加的唯一功能就是读取用户的朋友列表。我在下面的代码中添加的行前面加了注释。代码成功地从Facebook加载了用户信息,我可以访问各种用户属性并显示出来。然而,我尝试添加的朋友属性总是一个空列表。我觉得问题在于,像名字和ID这样的属性是可以像Python字符串那样处理的JSON字符串,但graph.get_connections返回的是一个包含JSON对象的数组,作为朋友列表。我认为我应该把这个JSON数组转换成Python字典,但我不知道该怎么做。当然,我也可能完全错了。
如果能给我一些建议,告诉我怎么把用户的朋友列表转成我可以操作的Python列表,我会非常感激。
谢谢,
Dessie
#!/usr/bin/env python
#
# Copyright 2010 Facebook
#
"""A barebones AppEngine application that uses Facebook for login."""
FACEBOOK_APP_ID = "my_facebook_app_id"
FACEBOOK_APP_SECRET = "my_facebook_app_secret"
import facebook
import os.path
import wsgiref.handlers
import logging
import platform
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
class User(db.Model):
id = db.StringProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
updated = db.DateTimeProperty(auto_now=True)
name = db.StringProperty(required=True)
profile_url = db.StringProperty(required=True)
access_token = db.StringProperty(required=True)
#Following line added by me
friends = db.StringListProperty()
class BaseHandler(webapp.RequestHandler):
"""Provides access to the active Facebook user in self.current_user
The property is lazy-loaded on first access, using the cookie saved
by the Facebook JavaScript SDK to determine the user ID of the active
user. See http://developers.facebook.com/docs/authentication/ for
more information.
"""
@property
def current_user(self):
if not hasattr(self, "_current_user"):
self._current_user = None
cookie = facebook.get_user_from_cookie(
self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
if cookie:
# Store a local instance of the user data so we don't need
# a round-trip to Facebook on every request
user = User.get_by_key_name(cookie["uid"])
if not user:
graph = facebook.GraphAPI(cookie["access_token"])
profile = graph.get_object("me")
id=str(profile["id"]
#Following 2 lines added by me
fs=graph.get_connections("me","friends")
logging.info(fs)
user = User(key_name=str(profile["id"]),
id=str(profile["id"]),
name=profile["name"],
profile_url=profile["link"],
access_token=cookie["access_token"],
#Following line added by me
friends=fs)
user.put()
elif user.access_token != cookie["access_token"]:
user.access_token = cookie["access_token"]
user.put()
self._current_user = user
return self._current_user
class HomeHandler(BaseHandler):
def get(self):
#Following line added by me
logging.info(self.current_user.friends)
path = os.path.join(os.path.dirname(__file__), "example.html")
args = dict(current_user=self.current_user,
facebook_app_id=FACEBOOK_APP_ID)
self.response.out.write(template.render(path, args))
def main():
util.run_wsgi_app(webapp.WSGIApplication([(r"/", HomeHandler)]))
if __name__ == "__main__":
main()
3 个回答
0
在Facebook的Python库中,你不需要手动把json转换成其他格式。
你只需要从fs["data"]开始,比如说如果你想统计朋友的数量。
fs=graph.get_connections("me","friends")
friends_count = len(fs["data"])
0
我在使用评论工具的时候遇到了一些麻烦,时间限制让我很困扰。罗伯特的回答看起来是对的,但在我的代码里却没能成功。最后我换了一种方法,终于让它工作了。
import re
import urllib2
#after I created the user
url = "https://graph.facebook.com/" + user.id + "/friends?access_token=" + user.access_token
response = urllib2.urlopen(url)
fb_response = response.read()
x = re.findall(r'"\d+"',fb_response)
friend_list = [a.strip('"') for a in x]
user.friends = friend_list
user.put()
4
我觉得我应该把这个JSON数组转换成一个Python字典,但我不知道该怎么做。
simplejson这个库在app-engine里是自带的,也在django的工具包里。
from django.utils import simplejson as json
def your_method(ars):
# do what ever you are doing...
dict_of_friends = json.loads(json_string)