Пакетирование, отправка и получение большого количества вызовов API Graph Facebook - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь использовать 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 голосов
/ 22 января 2012

Извините за переключение языков здесь, но я получил это, чтобы хорошо работать в Ruby, используя Коала .Я использую Пакетный запрос следующим образом:

 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. График - Получить список моих друзей - / me / friends
  2. График - Получить данные моих друзей - /?ids= enjresult=get-friends:$.data.*.id‹
  3. FQL - Получить всех общих друзей - /method/fql.query?query = SELECT uid1, uid2 ОТ друга, ГДЕ uid2 IN ({result = get-friends: $. data. *. id}) И uid1 IN (ВЫБЕРИТЕ uid2 ИЗ друга, ГДЕ uid1 = me ()) "} (справильное экранирование и метод POST)

Третий запрос вернет список элементов, uid1, uid2. Оттуда у вас есть все данные, необходимые для вычисления общего числа друзей. В RubyЯ использую следующее:

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

По сути, я считаю все элементы в массиве, где uid2 является конкретным идентификатором. Я уверен, что есть лучшие способы подсчета, но теперь данные ваши. Надеюсь, этопомогает, и еще раз извините за переключение языков на вас (но что означает язык, когда вы используете API в любом случае?).

Редактировать : Вы сможете толькоделать около 100 строк одновременно.Вы можете настроить параметры ограничения / смещения для просмотра результатов.

0 голосов
/ 20 ноября 2011

На мой взгляд, 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), для этого вам необходимы права пользователя.

Редактировать: На самом деле, существует исключение во время вызова, которое фактически запрещено:

Неустранимая ошибка: Uncaught Исключение: 604: Невозможно найти всех друзей XXXXXXXX.Может только искать вошедшего в систему пользователя (ГГГГГГГГ) или друзей вошедшего в систему пользователя с соответствующими разрешениями, брошенными в ... / php-sdk-v3.1 / src / base_facebook.php в строке 1039

...