在Python中实现Facebook FQL

在Python中实现Facebook FQL,python,django,facebook,facebook-fql,python-requests,Python,Django,Facebook,Facebook Fql,Python Requests,这可能很快就会很明显,但我对编码和StackOverflow还不熟悉——如果我表现得有点健忘,请道歉 我一直在尝试使用Django应用程序中我的views.py页面上的函数用FQL查询Facebook。我确实有一个利用Facebook Graph API的有效解决方案,但它最终是一个糟糕的解决方案,因为我的目标是检索用户的新闻提要 虽然在PHP中有许多关于Facebook FQL的答案,但在Python中没有明确的示例。相反,大多数问题只是与查询的语法有关,而不是如何将其实际集成到实际函数中 我

这可能很快就会很明显,但我对编码和StackOverflow还不熟悉——如果我表现得有点健忘,请道歉

我一直在尝试使用Django应用程序中我的views.py页面上的函数用FQL查询Facebook。我确实有一个利用Facebook Graph API的有效解决方案,但它最终是一个糟糕的解决方案,因为我的目标是检索用户的新闻提要

虽然在PHP中有许多关于Facebook FQL的答案,但在Python中没有明确的示例。相反,大多数问题只是与查询的语法有关,而不是如何将其实际集成到实际函数中

我想提出的问题是:

SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message, action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter WHERE uid = me() AND type = 'newsfeed’)
据我所知,提出此请求的最佳方式是使用请求,但坦率地说,我只是在寻找一个有效的解决方案

我曾考虑过在这里发布一些不起作用的代码,但它已经变得一团糟

非常感谢任何帮助或指导

更新 我只是想记录下我现在的处境,在Sohan Jain的帮助下,我做到了这一点:

def get_fb_post(request):
    user_id = UserSocialAuth.objects.get(user=request.user)
    api = facebook.GraphAPI(user_id.tokens)
    # response gets deserialized into a python object
    response = api.fql('''SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message,
          action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter
          WHERE uid = me() AND type = 'newsfeed')''')        
    print(response)

    data = {'profile': '...something...' } # what should be going in here?
    return HttpResponse(json.dumps(data), mimetype='application/json')
在PyCharm中,我得到以下信息(如果您愿意,请链接到图片:):

从django.utils将simplejson导入为json

在我的浏览器中,我得到以下信息(再次显示图像链接:):

我不知道如何修复弃用警告。我尝试在文件的顶部输入“from django.utils import simplejson as json”,但没有成功(我认为这可能有点过于简单,但值得一试)

如果我将查询替换为以下内容:

response = api.fql("SELECT name, type, value, filter_key FROM stream_filter WHERE uid = me()")
我确实收到了一个很长的回复,如下所示:

[{u'filter_key': u'nf', u'type': u'newsfeed', u'name': u'News Feed', u'value': None}, {u'filter_key'... ...}]
from facepy import GraphAPI

def get_fb_post(request):
user_id = UserSocialAuth.objects.get(user=request.user)
access_token = user_id.tokens
graph = GraphAPI(access_token)
data = graph.fql('''SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message,
          action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter
          WHERE uid = me() AND type = 'newsfeed')''')
return HttpResponse(json.dumps(data), mimetype='application/json')
它不停地运行,似乎正在返回有效信息。

您应该*。下面是运行查询的示例用法
FacebookSDK
最终是
请求
库的包装器,但增加了很多便利性

import facebook
api = facebook.GraphAPI(client_access_token)
# response gets deserialized into a python object
response = api.fql('''
    SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message, action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter WHERE uid = me() AND type = 'newsfeed’)
''')

*注意:在撰写本文时,
fql
方法有一个小错误,如下所示。你可能会想用回购协议的一个分支来修复这个bug,比如我已经弄明白了如何获得响应,代码如下所示:

[{u'filter_key': u'nf', u'type': u'newsfeed', u'name': u'News Feed', u'value': None}, {u'filter_key'... ...}]
from facepy import GraphAPI

def get_fb_post(request):
user_id = UserSocialAuth.objects.get(user=request.user)
access_token = user_id.tokens
graph = GraphAPI(access_token)
data = graph.fql('''SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message,
          action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter
          WHERE uid = me() AND type = 'newsfeed')''')
return HttpResponse(json.dumps(data), mimetype='application/json')
这是返回我正在查找的信息,看起来像这样:

[{u'filter_key': u'nf', u'type': u'newsfeed', u'name': u'News Feed', u'value': None}, {u'filter_key'... ...}]
from facepy import GraphAPI

def get_fb_post(request):
user_id = UserSocialAuth.objects.get(user=request.user)
access_token = user_id.tokens
graph = GraphAPI(access_token)
data = graph.fql('''SELECT post_id, app_id, source_id, updated_time, filter_key, attribution, message,
          action_links, likes, permalink FROM stream WHERE filter_key IN (SELECT filter_key FROM stream_filter
          WHERE uid = me() AND type = 'newsfeed')''')
return HttpResponse(json.dumps(data), mimetype='application/json')
{u'data':[{u'filter\u key':u'nf',u'permalink':u'facebook-link',u'attribute':无,u'app\u id':u'123456789',u'updated\u time':1398182407,u'post\u id':u'1482173147?5087666',u'likes':…等等


现在,我将尝试通过随机迭代JSON来随机显示帖子——当然,这超出了我的问题范围。感谢那些帮助过我的人。

谢谢,Sohan。我将尝试一下,并将返回让你知道它是如何运行的。Sohan,只是想让你知道我做了一个更新。给了它一个提示继续,但没有完全运行它,将注释放在原始问题中。感谢更新。首先,您可以忽略simplejson警告,或者使用
import json
获取
json
lib。接下来,确保您有“读取流”您的用户的fb权限。要测试这一点,请转到facebook图形浏览器,并单击“获取访问令牌”。在“扩展权限”下,选中“读取流”
。然后,将该访问令牌复制到代码中,以查看您的FQL命令是否有效。此外,不确定这是否有问题,但要将
访问令牌
传递到
GraphAPI()
应该只是字符串访问令牌。我认为
UserSocialAuth.tokens
返回一个字典
{'access\u token':'}
Sohan,我做了一个更新,讨论了我所做的更改。它目前正在工作。感谢您的帮助。