Получить друзей моего друга, используя Graph API - PullRequest
4 голосов
/ 06 августа 2010

Я пытаюсь сделать очень простую вещь с помощью нового API Graph.

Я уже знаю, как найти своих друзей: "https://graph.facebook.com/me/friends?access_token=4333ed34d..."

Но если у меня есть друг , чей ID 123456, тогда я хочу получить его друзей: "https://graph.facebook.com/123456/friends?access_token=4333ed34d..."

Но я получаю исключение:

"Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера. "

Почему я не могу этого сделать?Это очень тривиальная задача для API.

Ответы [ 4 ]

8 голосов
/ 06 августа 2010

Если я пытаюсь найти друзей случайного пользователя, я получаю HTTP 500, но он содержит следующий ответ:

{
   "error": {
      "type": "Exception",
      "message": "(#604) Can't lookup all friends of <UID>. Can only lookup for the logged in user (<MY_UID>), or friends of the logged in user with the appropriate permission"
   }
}

, что само собой разумеется

Если я пытаюсь завести друзей моего друга, который позволяет просматривать других его друзей, это работает нормально.Если мой друг решил запретить просмотр других друзей, я получаю ту же ошибку.

6 голосов
/ 10 августа 2011

Вы можете фактически украсть информацию из публичного Facebook. Это не красиво, занимает пару секунд, но работает.

У меня есть JS-код, который запускается из консоли и делает запрос AJAX - те же самые facebooks делают при запросе большего количества друзей в обычном пользовательском интерфейсе facebook при прокрутке вниз (http://www.facebook.com/profile.php?sk=friends). Затем я анализирую результат. Пока он работает без нареканий. Я просто прошу новых друзей, и когда у меня нет совпадений, я знаю, что у меня их все.

Я не хочу делиться всем кодом, но это важная часть:

// Recursively load person friends 
function getMoreFriends(job, uid, fb_dtsg, post_form_id, offset, callback, finished ){
    var url = "http://www.facebook.com/ajax/browser/list/friends/all/?uid="+uid+"&offset="+offset+"&dual=1&__a=1&fb_dtsg="+fb_dtsg+"&lsd=&post_form_id="+post_form_id+"&post_form_id_source=AsyncRequest";  
    var request = { type: 'POST', url: url, data: { __a: 1, dual: 1, offset: offset, uid: uid }, dataType: "text", complete: function(data){
    var response = data.responseText.match(/HTML.*$/)[0];
        response = response.replace(/u003c/gi,"<");
        response = response.replace(/\\u([a-f0-9]{4})/gm, "&#x$1;").replace(/\\\//g,"/").replace(/\\/g,'');
        response = response.match(/^.*<\/div><\/div><\/div>/);
        if(response != null){
            response = response[0].replace("HTML(","");
            var people = [];
        $jq(response).find(".UIImageBlock").each( function(){
            var newPerson = new Person( $jq(this).find('.UIImageBlock_Content a').text(), $jq(this).find('a').first().attr('href'), $jq(this).find('img').attr('src'), jQuery.parseJSON( $jq(this).find('a').last().attr('data-gt') ).engagement.eng_tid );
            people.push( newPerson );
            });
            callback(people);
            getMoreFriends(job, uid, fb_dtsg, post_form_id, offset+60, callback, finished);
        }
    } };
    job.addToQueue( request );
    if(job.state != "processing"){
        if (typeof finished != "function" ){ finished = function(){}; }
        job.startProcessing({ finished: function(){ finished(); } } );
    }
}

Вы можете получить необходимые переменные от пользователя, вошедшего в систему, как этот:

function loadFriends(person, onInit, store, callback){
    info("loading friends of "+person.name+" initiated");
    //addStatus("loading friends of "+person.name+" initiated");

    if (typeof onInit == "function" ){
        onInit();
    }

    if(person.id == -1){
        error("Person "+person.name+" doesn't have an id.!");
        addStatus("Person "+person.name+" doesn't have an id.!","error");
        return false;
    }
    else {
        // Load friends 
        var fb_dtsg = $jq('input[name="fb_dtsg"]').eq(0).val();
        var post_form_id = $jq('#post_form_id').val();
        var loadFriendsJob = ajaxManager.addJob({limit: 1});
        getMoreFriends(loadFriendsJob,person.id, fb_dtsg, post_form_id, 0,     function(people){ // callback on each iteration
            d( "Loaded "+people.length+" friends of " + person.name );
            store(people);
        },function(){ // callback on finish
            info("loading friends of "+person.name+" finished");
            //addStatus("loading friends of "+person.name+" finished");
            if (typeof callback == "function" ){ callback(); }
        });
    }

}

Я понимаю, что это, вероятно, бесполезно для вашего случая, так как это JS. В любом случае, кто-то может найти это полезным.

P.S .: $ jq = jQuery. P.P.S .: эти объекты задания заботятся о последовательных запросах ajax. Я узнал, что они мне нужны, так как мой FF не чувствовал, что делает 2000+ запросов AJAX одновременно: -D

4 голосов
/ 10 августа 2010

Вы просто не можете этого сделать.

Если вам требуется соответствующее расширенное разрешение, когда пользователи авторизуют ваше приложение, вы можете получить доступ к некоторым данным о друзьях пользователя, которые в данный момент зарегистрированы, но это все, что вы получите (http://developers.facebook.com/docs/authentication/permissions см.: Friends_xxxx разрешения), но не его / ее друзья.

2 голосов
/ 25 февраля 2012

У меня есть друзья друзей (ограничено). У меня была такая же проблема. Хотя уже очень поздно отвечать на вопрос, это кому-нибудь поможет. Поэтому отвечаю на этот вопрос.

Мы можем завести друзей друзей, которые являются пользователями приложения. Требуются следующие требования:

  1. Ваш друг должен использовать приложение (принятые разрешения для приложения).
  2. Разрешение от приложения read_stream, publish_stream, publish_checkins.

$ fb_id = идентификатор пользователя, которому нужны друзья друзей.

Попробуйте этот запрос FQL.

$ query = "SELECT uid, name, work_history ОТ пользователя ГДЕ uid IN (SELECT uid2 ОТ друга, ГДЕ uid1 IN (ВЫБЕРИТЕ uid ИЗ ПОЛЬЗОВАТЕЛЯ, ГДЕ УИД В (ВЫБЕРИТЕ uid2 ОТ ДРУГОГО ГДЕ uid1 = $ fb_id) и is_app_user = 1)) ";

...