我正在尝试使用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实际上是获取此类信息量的更好,首选方法,但这意味着我还需要访问其他人的朋友列表。
我能想到的唯一其他解决方案是限制通话,但我真的不想这样做,因为我不希望应用程序运行缓慢或等待时间很长。
我正在尝试做甚么可能吗?我是以错误的方式去做的吗?任何意见或专业知识将不胜感激。
答案 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
即,
第三个查询将返回元素列表uid1,uid2。从那里,您拥有计算共同朋友计数所需的所有数据。在Ruby中,我使用以下内容:
friends[2].clone.delete_if { |r| r['uid2'] != "xxxxxxx" }.count
基本上,我计算数组中uid2是特定ID的所有元素。我确信有更好的方法可以计算,但数据现在是你的。希望这会有所帮助,并且再次抱歉切换语言(但是当你使用API时,语言是什么意思?)。
修改:您一次只能处理大约100行。您可以调整限制/偏移参数以分页结果。