2010-08-06 6 views
4

Я пытаюсь сделать очень элементарное дело с новым графическим API.Получите друзей моего друга, используя Graph API

Я уже знаю, как получить мои друзья: «https://graph.facebook.com/me/friends?access_token=4333ed34d ...»

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

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

"The remote server returned an error: (500) Internal Server Error."

Почему я не могу сделать ТНА т? Это очень тривиальная задача, чтобы спросить у API.

+1

Какой язык вы используете для разработки своего приложения? Вы пытались поймать исключение? Кроме того, получили ли вы соответствующее разрешение от пользователя? –

+0

Я использую C#. Я выбрал исключение, и его доза не содержит никакой конкретной информации, кроме как из того, что я упомянул. –

+0

@YaronLevi: Мы можем найти друзей друг. Я дал ответ. Пожалуйста, проверьте. Он нуждается в некоторых разрешениях, и эти друзья используют приложение facebook. –

ответ

8

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

, которая очень нуждается в пояснениях.

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

+0

Хорошо, я понимаю, но это именно то, что я делаю: https: //graph.facebook.com/123456/friends? Access_token = 4333ed34d ... 123456 - мой друг. почему я не могу получить его firneds ??? Что значит «с соответствующим разрешением». Как я могу получить предварительный отчёт от моего API? –

+0

@Yaron Levi: Должна быть какая-то настройка в меню Учетная запись> Конфиденциальность, но не знаете, какой из них. – serg

+0

Или, может быть, при нажатии на значок карандаша в гаджете списка друзей. – serg

4

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

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

+0

Я понимаю, спасибо –

+1

@agbb: Теперь мы можем найти друзей друга. Я дал ответ. Пожалуйста, проверьте. –

6

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

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

Я не хочу, чтобы разделить весь код, но это существенная часть:

// 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(); } }); 
    } 
} 

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

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

+1

Ваше решение выглядит очень умно. Однако эти запросы основаны на сеансах. Даже если пользователь зарегистрирован в Facebook, как вам это удается, для запуска в браузере в вашем домене? Я думал, что браузеры будут препятствовать тому, чтобы ваш www.mydomain.com отвечал на запросы ajax на facebook.com! Как вы можете запустить этот код в своем приложении, чтобы получить друзей? –

+0

Если я не ошибаюсь, это очень полезно, чтобы сидеть и ползать из местных! Кстати, это все еще работает, так как это довольно старый, как 1 год? Любое обновление? –

2

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

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

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

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

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

$query="SELECT uid, name, work_history FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 IN (SELECT uid FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = $fb_id) and is_app_user=1))";

+0

Я пробовал, он не работает. Вы уверены, что код верен? – Claus

+1

Я работал над этим. Я смог увидеть друзей моего друга. Он нуждается в следующих требованиях: 1. Ваш друг должен использовать приложение. 2. Разрешение из приложения read_stream, publish_stream, publish_checkins. –

Смежные вопросы