批量,发送和接收大量Facebook Graph API调用

时间:2011-11-17 04:09:39

标签: php facebook facebook-graph-api facebook-fql facebook-php-sdk

我正在尝试使用Graph API和PHP + JS SDK来获取一个人的朋友列表,然后出去找朋友列表中的每个人的共同朋友。我可以轻松搞定朋友列表,因为它只是一个简单的API调用。然而,当试图获得所有共同的朋友时,问题就出现了。假设一个人有500个朋友,那就是501个不同的API调用来运行应用程序一次,这太多了。

精细。

下一个想法。批量处理所有这些API调用并将501转换为25.这似乎是一个好主意,这就是我所做的。不幸的是,它没有用。这是我的代码:

KK NVM,我固定了它(很多)。它仍然运行起来真的很慢。这是新代码:

$userFriends = $facebook->api('/me/friends', 'GET');
$queries = array();
$mutual_friends = array();

foreach ($userFriends[data] as $v1) {
    $queries[] = array('method' => 'GET', 'relative_url' => '/me/mutualfriends/'.$v1[id]);
    if (count($queries)==20){
        $batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
        foreach (range(0,count($queries)-1) as $n) {
            $mutual_friend[] = json_decode($batchResponse[$n]['body'], true);
        }
        $queries = array();
    }
    $batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
    foreach (range(0,count($queries)-1) as $n) {
        $mutual_friend[] = json_decode($batchResponse[$n]['body'], true);
    }
}

我有一种潜在的怀疑,你不应该像这样批处理API调用,但我可能错了。另外,我已经读过FQL实际上是获取此类信息量的更好,首选方法,但这意味着我还需要访问其他人的朋友列表。

我能想到的唯一其他解决方案是限制通话,但我真的不想这样做,因为我不希望应用程序运行缓慢或等待时间很长。

我正在尝试做甚么可能吗?我是以错误的方式去做的吗?任何意见或专业知识将不胜感激。

2 个答案:

答案 0 :(得分:0)

在我看来,FQL确实更适合这种情况。

这样的事情应该回答你的问题:

$fql = "SELECT uid1,uid2 FROM friend WHERE uid1 IN ( SELECT uid2 FROM friend WHERE uid1 = me() )";
$friends = $GLOBALS["facebook"]->api(array(
    'method' => 'fql.query',
    'query' => $fql,
));

关于权限,我认为在每种情况下(批量API或FQL),您都需要用户的权限。

编辑: 事实上,在通话过程中有一个例外,实际上是禁止的:

  

致命错误:未捕获异常:604:无法查找XXXXXXXX的所有朋友。只能查找登录用户(YYYYYYYYY)或   具有相应权限的登录用户的朋友   在... / php-sdk-v3.1 / src / base_facebook.php 1039行

答案 1 :(得分:0)

很抱歉在这里切换语言,但我使用Koala在Ruby中运行良好。我正在使用Batch Request,如下所示:

 friends = @graph_batch.batch do |batch_api|
    batch_api.get_connections("me", "friends", {:limit => 100, :offset => 0}, :batch_args => {:name => "get-friends"})
    batch_api.get_objects("{result=get-friends:$.data.*.id}")
    batch_api.graph_call("method/fql.query", { :query => "SELECT uid1, uid2 FROM friend WHERE uid2 IN ({result=get-friends:$.data.*.id}) AND uid1 IN (SELECT uid2 FROM friend WHERE uid1=me())" }, "post" )
 end

即,

  1. 图表 - 获取我的朋友列表 - /我/朋友
  2. 图表 - 获取我的朋友数据 - /?ids = {result = get-friends:$。data。*。id}
  3. FQL - 获取所有共同的朋友 - /method/fql.query?query=SELECT uid1,uid2 FROM friend WHERE uid2 IN({result = get-friends:$。data。*。id})AND uid1 IN(SELECT uid2 FROM friend WHERE uid1 = me())“} (使用正确的转义和POST方法)
  4. 第三个查询将返回元素列表uid1,uid2。从那里,您拥有计算共同朋友计数所需的所有数据。在Ruby中,我使用以下内容:

     friends[2].clone.delete_if { |r| r['uid2'] != "xxxxxxx" }.count
    

    基本上,我计算数组中uid2是特定ID的所有元素。我确信有更好的方法可以计算,但数据现在是你的。希望这会有所帮助,并且再次抱歉切换语言(但是当你使用API​​时,语言是什么意思?)。

    修改:您一次只能处理大约100行。您可以调整限制/偏移参数以分页结果。