Получить друзей моего друга с помощью Graph API

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

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

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

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

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

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


person Yaron Levi    schedule 06.08.2010    source источник
comment
Какой язык вы используете для разработки своего приложения? Вы пытались поймать исключение? Кроме того, получили ли вы соответствующее разрешение от пользователя?   -  person Martin Bean    schedule 06.08.2010
comment
Я использую С#. Я поймал исключение, и оно не содержит никакой конкретной информации, кроме того, что я упомянул.   -  person Yaron Levi    schedule 06.08.2010
comment
@YaronLevi: Мы можем найти друзей друга. Я дал ответ. Пожалуйста, проверьте. Ему нужны некоторые разрешения и те друзья, которые используют приложение facebook.   -  person Somnath Muluk    schedule 02.08.2012


Ответы (4)


Если я пытаюсь найти друзей случайного пользователя, я получаю 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"
   }
}

что довольно очевидно.

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

person serg    schedule 06.08.2010
comment
Хорошо, я понимаю, но это именно то, что я делаю: graph.facebook.com/123456/ друзья?access_token=4333ed34d... 123456 мой друг. почему я не могу получить его фирнеды??? что значит с соответствующим разрешением. как я могу получить премиссию от моего друга через API? - person Yaron Levi; 06.08.2010
comment
@Yaron Levi: Должна быть какая-то настройка в меню «Учетная запись» › «Настройки конфиденциальности», но не знаю, какая именно. - person serg; 06.08.2010
comment
Или, может быть, при нажатии на значок карандаша на гаджете со списком друзей. - person serg; 06.08.2010
comment
@serg: Теперь мы можем найти друзей друга. Я дал ответ. Пожалуйста, проверьте. - person Somnath Muluk; 02.08.2012

вы действительно можете украсть информацию из общедоступного 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. PPS: эти объекты заданий заботятся о последовательных запросах ajax. Я обнаружил, что они мне нужны, так как моему FF не хотелось делать более 2000 запросов AJAX одновременно :-D

person Tomáš Reichmann    schedule 10.08.2011
comment
Ваше решение выглядит очень умным. Однако эти запросы основаны на сеансе. Даже если пользователь залогинен в Facebook, как вам это удается, запускать в браузере в вашем домене? Я думал, что браузеры не позволят вашему www.mydomain.com запрашивать ajax-запросы к facebook.com! Как вы можете запустить этот код в своем приложении, чтобы получить друзей? - person Angel G. Olloqui; 09.06.2012
comment
Если я не ошибаюсь, сидеть и ползать от местных очень полезно! Кстати, это все еще работает, так как оно довольно старое, около 1 года? Любое обновление? - person 夏期劇場; 30.04.2013

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

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

person agbb    schedule 10.08.2010
comment
@agbb: Теперь мы можем найти друзей друга. Я дал ответ. Пожалуйста, проверьте. - person Somnath Muluk; 02.08.2012

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

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

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

$fb_id= идентификатор пользователя, друзья друзей которого требуются.

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

$query="ВЫБЕРИТЕ uid, имя, work_history ОТ пользователя, ГДЕ uid В (ВЫБЕРИТЕ uid2 ОТ друга, ГДЕ uid1 В (ВЫБЕРИТЕ uid ОТ пользователя, ГДЕ uid В (ВЫБЕРИТЕ uid2 ОТ друга, ГДЕ uid1 = $fb_id ) и is_app_user=1) )";

person Somnath Muluk    schedule 25.02.2012
comment
Я пробовал, не работает. Вы уверены, что код правильный? - person Claus; 04.06.2012
comment
Я работал над этим. Я смог увидеть друзей моего друга. Это требует следующих требований: 1. Ваш друг должен использовать приложение. 2. Разрешение от приложения read_stream, publish_stream, publish_checkins. - person Somnath Muluk; 05.06.2012