【问题标题】:Get the Friends of my friend using the Graph API使用 Graph API 获取我朋友的朋友
【发布时间】:2026-02-09 14:00:01
【问题描述】:

我正在尝试用新的 Graph API 做一件非常基本的事情。

我已经知道如何结交朋友: "https://graph.facebook.com/me/friends?access_token=4333ed34d..."

但如果我有一个 ID 为 123456 的 朋友,那么我想获得 他的 朋友: "https://graph.facebook.com/123456/friends?access_token=4333ed34d..."

但我得到一个例外:

“远程服务器返回错误:(500)内部服务器错误。”

为什么我不能这样做?从 API 中询问是一项非常简单的任务。

【问题讨论】:

  • 您使用什么语言来开发您的应用程序?您是否尝试过捕获异常?另外,您是否获得了用户的相关许可?
  • 我正在使用 C#。我发现了异常,它不包含任何特定信息,除了我提到的。
  • @YaronLevi:我们可以找到一些朋友的朋友。我已经给出了答案。请检查。它需要一些权限和那些使用 facebook 应用程序的朋友。

标签: c# facebook facebook-graph-api facebook-friends


【解决方案1】:

如果我尝试结交随机用户的朋友,我会收到 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"
   }
}

这是不言自明的。

如果我尝试结交允许查看其他朋友的朋友的朋友,则效果很好。如果我的朋友选择不允许查看他的其他朋友,我会收到同样的错误。

【讨论】:

  • 好吧,我明白了,但这正是我所做的:graph.facebook.com/123456/friends?access_token=4333ed34d... 123456 是我的朋友。为什么我不能得到他的解雇??? “在适当的许可下”是什么意思。如何通过 API 从我的朋友那里获得授权?
  • @Yaron Levi:肯定是帐户 > 隐私设置菜单中的一些设置,但不确定是哪一个。
  • 或者当点击朋友列表小工具上的铅笔图标时。
  • @serg:我们现在可以找到朋友的朋友了。我已经给出了答案。请检查。
【解决方案2】:

你不能那样做。

如果您在用户授权您的应用时需要适当的扩展权限,您可以访问当前登录用户的朋友的一些数据,但仅此而已(http://developers.facebook.com/docs/authentication/permissions 请参阅:friends_xxxx 权限),但不能访问他/她的朋友.

【讨论】:

  • @agbb:我们现在可以找到朋友的一些朋友了。我已经给出了答案。请检查。
【解决方案3】:

您实际上可以从公共 Facebook 窃取信息。这不漂亮,需要几秒钟,但有效。

我有一个从控制台运行并发出 AJAX 请求的 JS 代码 - 当您向下滚动时(http://www.facebook.com/profile.php?sk =朋友)。然后我解析结果。到目前为止,它完美无缺。我只是要求更多的朋友,当我没有得到匹配时,我知道我拥有他们所有的。

我不想分享整个代码,但这是必不可少的部分:

// 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

【讨论】:

  • 您的解决方案看起来非常聪明。但是,此请求是基于会话的。即使用户登录 Facebook,您如何设法做到这一点,在您的域中的浏览器中运行?我认为浏览器会阻止您的 www.mydomain.com 向 facebook.com 查询 ajax 请求!您如何在您的应用程序中实际运行此代码来获得朋友?
  • 如果我没记错的话,这对于从当地坐下来爬行非常有用!顺便说一句,这仍然有效吗,因为它已经 1 岁了?有更新吗?
【解决方案4】:

我有朋友的朋友(有限)。我有同样的问题。虽然回答问题已经很晚了,但它会帮助别人。这就是为什么要回答这个问题。

我们可以结交那些是应用用户的朋友的朋友。 它需要以下要求:

  1. 您的朋友需要使用应用程序(已接受应用程序权限)。
  2. 来自应用程序 read_stream、publish_stream、publish_checkins 的权限。

$fb_id= 需要朋友的朋友的用户 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)";

【讨论】:

  • 我试过了,还是不行。你确定代码正确吗?
  • 我已经研究过了。我能够见到我朋友的朋友。它需要以下要求: 1.您的朋友需要正在使用应用程序。 2. 来自应用read_stream、publish_stream、publish_checkins的权限。