使用FB.api在单个请求中向facebook询问多个用户的数据

时间:2011-06-28 20:56:00

标签: facebook

我需要使用FB.api('/<some_id>/')从Facebook获取基本用户数据。这很好用,但速度很慢,因为我需要单独询问每个id,并多次拨打facebook。有没有办法收集所有ID并在单个请求中请求它们并获得一个数组?

修改

我不是要求用户朋友。我实际上是想收集用户的朋友的朋友,这是Facebook没有提供的东西,这就是我使用graph.facebook.com/<id>/而不是graph.facebook.com/me/friends的原因。我不想要朋友,我想做这样的事情:graph.facebook.com/<id1>,<id2>,<id3>,../

3 个答案:

答案 0 :(得分:2)

您可以使用fql查询获取所有朋友的信息:

SELECT uid, name, pic_small FROM user 
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())

如果您提示用户获得更多扩展权限,您将能够访问user table中的更多字段。

如果您正在尝试查询不是用户朋友的arbritary用户ID列表,您可以尝试在FQL查询中指定该列表以使用Facebook FQL Multiquery功能,执行多个select uid, name from user where uid = friendid1声明。

答案 1 :(得分:1)

如何使用FQL

来自Facebook的例子:

var friends = FB.Data.query(
     "(select uid2 from friend where uid1 = {0})",
     user_id);

var friendsoffriends = FB.Data.query(
     "select uid2 from friend where uid1 in (select uid2 from {0})",
     friends;

 // Now, register a callback
 FB.Data.waitOn([friends, friendsoffriends], function() {   
   // now display all the results
   FB.Array.forEach(friendsoffriends.value, function(row) {
       console.log(row.uid);
   });
 });

然后编辑您想要使用的任何ID集合。

上述方法仍然有效(作为一个合理的通用示例) - 但是,澄清:

您以前使用users.getInfo来做您要求的事情,因为这可以让您传递UIDS列表。不幸的是,这已被弃用。但是,所有这些实际上的查询都包含了一个FQL查询。

如果您在语法中应用标准FQL,则可以实现此目的:

{
myfriends:'select uid2 from friend where uid1=me()',
friendsoffriends:'select uid2 from friend where uid1 in (select uid2 from #myfriends)'
}

然而,facebook会主动阻止您使用错误执行此操作:

"error_code": 604,
  "error_msg": "Can't lookup all friends of 123456789. Can only lookup for the logged in user (987654321), or friends of the logged in user with the appropriate permission",

您的另一个选择是获取所有ID并对表单执行FQL查询:

select name from user where uid='123456789' OR uid='987654321' OR uid=...

答案 2 :(得分:0)

不再支持FQL,但这种方法可以解决新的API:

Requesting multiple Facebook fanpage data in a single call

简而言之,使用ids param:

FB.api(
    '/', 
    {ids : "19292868552,11239244970"}, 
    function(response) { 
        if (!response || response.error) {
            console.log(response.error); 
        } else { 
            console.log(response); 
        } 
    }
);