使用PHP和facebook API获取用户好友列表

时间:2015-02-24 21:41:23

标签: php facebook codeigniter facebook-graph-api

所以我正在使用CodeIgniter框架并试图吸引用户朋友。我没有使用身份验证的问题,但是当我尝试让用户朋友使用https://graph.facebook.com/me/friends?fields=gender,id,name&access_token=中的GET方法时,它返回我的空数组。这是前端代码

<script>
$(function () {
    FB.init({
        appId: ****, // App ID
        channelUrl: '', // Channel File
        status: true, // check login status
        cookie: true, // enable cookies to allow the server to access the session
        xfbml: true  // parse XFBML
    });
});

jQuery('*[data-action="doFbLogin"]').on('click', function () {
    FB.login(function (response) {
        if (response.authResponse) {

            FB.api('/me/friends', function(response) {

                // loading message
                var intervalLoading = 0;
                setInterval(function() {
                    intervalLoading = ++intervalLoading % 4;
                    jQuery('*[data-message="fb_loading"]').html("Connecting, please wait" + Array(intervalLoading + 1).join("."));
                }, 400);

                // request
                jQuery.post('http://www.****.***/ajax/fb_connect', {
                        "user_id": response.id,
                        "full_name": response.name,
                        "first_name": response.first_name,
                        "last_name": response.last_name,
                        "email": response.email,
                        "gender": response.gender,
                        "token": response.token,
                        "friends": response.friends,
                        "current_url": 'http://*****',
                        "ref_url": 'http://*****'
                    },
                    function (data) {
                        data = JSON.parse(data);
                        if (data == true) {
                            jQuery('*[data-message="fb_loading"]').removeAttr('data-message').html('Connected!');
                            location.reload();
                        } else {
                            jQuery('*[data-message="fb_loading"]').removeAttr('data-message').html('Connection failed!');
                            setTimeout(function(){
                                location.reload();
                            }, 2000);
                        }
                    }
                );
            });
        } else {
            console.log('something went wrong');
        }
    }, {scope: 'email'});
});

这是我的后端 - 连接:

$data = array(
        'fb-config' => array(
            'appId'  => FACEBOOK_API_ID,
            'secret' => FACEBOOK_SECRET
        )
    );

    $this->load->library('facebook', $data['fb-config']);
    $data['userData'] = $this->facebook->getUser();

    if ( $data['userData'] ) {
        try {
            $data['user_profile'] = $this->facebook->api('/me');
        } catch (FacebookApiException $e) {
            $data['user_profile'] = null; // return false, execution terminated.
            $this->facebook->destroySession();
        }
    }

$this->session->set_userdata(array('user_fb_token' => $this->facebook->getAccessToken()));
            print_r($this->users_model->getUserFacebookFriends());
            exit;

和获取朋友的方法:

public function getUserFacebookFriends()
{
    // get facebook friends (crawl)
    $graph_link = 'https://graph.facebook.com/me/friends?fields=gender,id,name&access_token=';
    $user_friends = file_get_contents($graph_link . $this->session->userdata('user_fb_token'));

    $friendsArray = json_decode($user_friends, true);

    if ( is_array($friendsArray) ) {
        $data = array('friendsArray' => $friendsArray['data']);
    } else {
        $data = array('friendsArray' => FALSE);
    }

    return $data;
}

所以我不知道为什么这不起作用,有什么建议吗?

2 个答案:

答案 0 :(得分:1)

结果是正确的。自v2.0起,您也只能获得授权您的应用的朋友:https://developers.facebook.com/docs/apps/changelog

这很可能是在stackoverflow上被问到最多的问题,请在询问之前使用搜索选项(google,stackoverflow)。这个帖子中有一个非常详细的答案,例如:Facebook Graph Api v2.0+ - /me/friends returns empty, or only friends who also use my app

答案 1 :(得分:0)

我有同样的问题。您可以使用 FQL 来获取朋友列表。但是FQL 已被弃用,我认为将在2-3个月内停用。 使用v2.0 +,在隐私政治更改后,您可以获得已安装您的应用的朋友列表(他们为您的应用授予了权限)。 一般来说,在v2.0之前根据隐私,用户负责自己的帐户和朋友帐户。在v2.0之后,用户只负责自己的个人资料。

使用v2.0,您只能收集朋友列表以向他们推荐您的应用,因此您必须更改应用宣传方式以收集朋友个人资料。

FQL documentation

请求如下:

GET /fql?q=SELECT+uid2+FROM+friend+WHERE+uid1=me()&access_token=...
当然可以修改

查询,就像这样(你可以添加/删除字段甚至添加子查询):

SELECT+uid,+name,+first_name,+last_name,+pic_big,+birthday_date,+sex,+locale+FROM+user+WHERE+uid+IN+(SELECT+uid2+FROM+friend+WHERE+uid1=me())

但是您的帐户/应用程序必须在2014年注册(我希望我的确无误,但您可以签入文档)