Facebook FQL:让用户喜欢的页面,至少有一个朋友也喜欢

时间:2013-05-02 19:04:37

标签: facebook facebook-fql

这可能吗?我尝试了一件不起作用的事情:

SELECT name 
FROM page 
WHERE page_id IN (
    SELECT page_id
    FROM page_fan
    WHERE uid = me()
    AND page_id IN (
        SELECT page_id
        FROM page_fan
        WHERE uid IN (
            SELECT uid2 
            FROM friend 
            WHERE uid1 = me()
        )
    )
)

我是否需要获取用户喜欢的页面,然后遍历所有页面,检查朋友喜欢?

5 个答案:

答案 0 :(得分:2)

这个FQL可以解决这个问题:

select name from page where page_id in (SELECT page_id FROM page_fan WHERE uid IN 
(SELECT uid2 FROM friend WHERE uid1 = me ())) and page_id in
(select page_id from page_fan where uid = me())

希望它能与你合作,,,

答案 1 :(得分:1)

使用多查询我能够使用以下查询实现此目的。但是确实需要一些时间。

  {"friend_likes":"SELECT page_id FROM page_fan WHERE uid in(SELECT uid2 FROM friend WHERE uid1= me())","joints":"SELECT name FROM page WHERE page_id in(SELECT page_id FROM page_fan WHERE uid = me() AND page_id in(SELECT page_id FROM #friend_likes))"}

上述查询可让您的所有朋友喜欢,然后根据您的喜好进行匹配。问题是,你拥有的朋友越多,运行的时间越长(因为它明显得到了他们所有的喜欢)。我尝试通过获取所有喜欢来优化这一点,然后只从page_id列表中获得朋友喜欢,但是由于某种原因,这总是返回一个空集。看起来这个在1个查询中工作,你必须像现在这样长篇大论。

答案 2 :(得分:1)

对于任何大于2的子查询,FQL会变成蜗牛或超时。此外,我甚至不确定选择了不同的page_ids(每个用户都喜欢同一页面如何过滤?)。因此,当您执行set操作时,它很可能无法正常工作。只做两个查询。

  • 可以像朋友一样获取page_ids列表 "SELECT page_id FROM page_fan WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
  • 然后另一个只是拉你的喜欢 "SELECT page_id FROM page_fan WHERE uid=me())"

现在把它放在一个批次中,这样我们就可以同时获得两个数据集

fql?q={"userpages":"SELECT page_id 
                    FROM page_fan 
                    WHERE uid=me()",
       "friendpages":"SELECT page_id 
                      FROM page_fan 
                      WHERE uid IN 
                      (SELECT uid2 FROM friend WHERE uid1=me())"}

从这里你很可能会有一个非常庞大的名单和一个小名单

让我们说在Python中,

>>> len(data['data'][0]['fql_result_set'])
4505
>>> len(data['data'][1]['fql_result_set'])
85

我们需要在这里做两件事,

  • 获取intersection set
  • 删除重复项

现在,就过滤器和lambdas来说,这将在这个层面上变得微不足道......但是我们几乎破坏了数据的任何有用性。我们只有一组页面少了真正喜欢它们的实际朋友!我们如何验证?

好吧,现在考虑一下,最好保留API调用中的用户ID字段,然后我们就会将ID聚集在一起。 Python中的一个简单示例

>>> pages = {}
>>> for p in a0:
...     for q in a1:
...         if p['page_id'] == q['page_id']:
...             pid =  p['page_id']
...             if pid in pages:
...                 pages[pid].append(p['uid'])
...             else:
...                 pages[pid] = [q['uid']]
...                 pages[pid].append(p['uid'])

pages会给我一个字典,每个键都有一个id列表作为值。

然后我们可以通过查看API调用和crtl-F的浏览器转储来确认。由于禁用第三方应用程序的朋友的API隐私限制,查看实际页面将不是有效测试。我们希望匹配JSON响应中的出现次数。

答案 3 :(得分:0)

感谢那些回答了这个问题的人。不幸的是,所有的解决方案都很慢,并且它们没有获得所有页面(我猜是因为超时)。

我所做的就是获取所有用户的页面。然后我将这些内容过滤到我感兴趣的页面。之后我会查看朋友是否喜欢这些页面:

likes = fql("SELECT name, page_id FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=me())", access_token);
pages = []
for x in xrange(len(likes)):

    # Check that the page is an occasion

    conn.execute("SELECT 1 FROM occasionPageIds WHERE pageid = " + str(likes[x]["page_id"]) + " LIMIT 1");

    if len(conn.fetchall()):

        # Check that friends like this

        friend_likes = fql("SELECT uid FROM page_fan WHERE page_id = " + str(likes[x]["page_id"]) + " AND uid IN (SELECT uid2 FROM friend WHERE uid1=me())", access_token);

        if len(friend_likes):
            pages.append(likes[x]["page_id"])

所以你必须在检查朋友是否喜欢这个页面之前过滤页面,除非你想等很长时间。

答案 4 :(得分:0)

我的python代码花费大约36.8938140869秒查询,我有2277个朋友和2086页页面浏览(Facebook有5000个朋友限制+页面连接)。我认为查询100个page_ids一次应该没问题。

import urllib, urllib2, json, time
t0 = time.time()
a = "SELECT name, page_id FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid = me())"
AC = "USER_ACCESS_TOKEN"
url = "https://graph.facebook.com/fql?q="+urllib.quote_plus(a)+"&format=json-strings&access_token="+AC
print url
o = urllib2.urlopen(url)
r = o.read()
j = json.loads(r)['data']
page_list = []
page_info_dict = {}
for jj in j:
    page_list.append(jj["page_id"])
    page_info_dict[jj["page_id"]] = jj["name"]
map_list =[]
st = 0

for i, e in enumerate(page_list):
    t1 = time.time()
    pp = ",".join(page_list[st:st+100])
    print pp, type(pp)
    a = "SELECT page_id FROM page_fan WHERE page_id IN ("+pp+") and uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
    url = "https://graph.facebook.com/fql?q="+urllib.quote_plus(a)+"&format=json-strings&access_token="+AC
    print url
    o = urllib2.urlopen(url)
    r = o.read()
    j = json.loads(r)
    t2 = time.time()
    print t2- t1
    for jj in j['data']:
        map_list.append(jj["page_id"])
    if st>len(page_list):
        break
    else:
        st+=100
mutual_liks_page_id = list(set(map_list))
for page_id in mutual_liks_page_id:
    print page_info_dict.get(page_id, "")
print "Total time: ", time.time()-t0, " seconds"