在Google App Engine上运行的Python中从Facebook中提取关系状态

时间:2011-11-12 19:35:25

标签: python facebook google-app-engine facebook-graph-api

我正在开发一个Facebook应用程序。它是用Python编写的,并在Google App Engine(GAE)上运行。

我知道如何获取用户网络的关系状态,但我这样做的方式是慢慢运行。 GAE有一个时间限制,以减少大约60秒的CPU使用率。使用以下代码,我可以在获得“DeadlineExceededError”之前获得该时间范围内约200人的关系状态。当然这还不够好,因为很多/大多数人在Facebook上有更多的朋友。

我现在要做的是获取用户的好友列表,然后为每个用户发出API调用,询问姓名和关系状态。

我使用的代码:

for f in friends:
    friends_info[f] = facebook.api('/'+f, {u'fields': 'name,relationship_status', 
    u'access_token': facebook.access_token})

然后我得到了数据:

rel_status = friends_info[f][u'relationship_status']

我需要什么:

有关优化的建议或提取整个网络关系状态的其他方法。

提前致谢: - )

编辑:

答案似乎是解决问题的好方法。虽然,我在Python中找不到批处理请求的任何好教程,所以我最终使用了FQL调用。通过使用以下内容,获取数据需要1-2秒:

Q = 'select uid, sex, relationship_status from user where uid in (select target_id from connection where source_id = me())'

实际数据由:

检索
data = fql.query(Q,facebook.access_token)

调用此函数:

def query(self,Q,access_token):
    ENDPOINT = 'https://api.facebook.com/method/'
    params = dict(query=Q, access_token=access_token, format='json')
    url = ENDPOINT + 'fql.query'
    return self._fetch(url, params=params)

def _fetch(self, url, params=None):
    conn = urllib2.urlopen(url, data=urlencode(params))
    try:
        return json.loads(conn.read())
    finally:
        conn.close()  

希望有人也可以使用它!

2 个答案:

答案 0 :(得分:2)

每个应用引擎实例最多可以有10个并行HTTP查询,因此您可以使用create_rpc& amp; make_fetch_call。在某些情况下,这也不起作用,因此您需要将作业拆分为多个任务并让它们并行运行。

答案 1 :(得分:2)

您可以使用脸谱图batch query API一次最多查询20个用户