使用 PHP 和 facebook API 获取用户好友列表
Get user friends list using PHP and facebook API
所以我正在使用 CodeIgniter 框架并试图获得用户朋友。我在身份验证方面没有问题,但是当我尝试使用 https://graph.facebook.com/me/friends?fields=gender,id,name&access_token=
中的 GET 方法获取用户好友时,它 returns 我的数组是空的。这是前端代码
<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;
}
所以我不知道为什么这不起作用,有什么建议吗?
结果正确。从v2.0开始,你只能获取授权过你App的好友:https://developers.facebook.com/docs/apps/changelog
这很可能是在 Whosebug 上被问得最多的问题,请在提问前使用搜索选项 (google, Whosebug)。这个线程中有一个非常详细的答案,例如:Facebook Graph Api v2.0+ - /me/friends returns empty, or only friends who also use my app
我遇到了同样的问题。您可以使用 FQL 获取好友列表。但是 FQL 已弃用 ,我认为将在 2-3 个月内被禁用。
使用 v2.0+,在隐私政策发生变化后,您可以获得 仅 已经安装了您的应用程序的朋友列表(他们授予了您的应用程序权限)。
一般来说,在v2.0之前,根据隐私,用户对自己的账户和朋友账户负责。 v2.0之后,用户只对自己的资料负责。
在 v2.0 中,您只能收集朋友列表来向他们推荐您的应用,因此您必须改变推广应用的方式来收集朋友资料。
请求看起来像:
GET /fql?q=SELECT+uid2+FROM+friend+WHERE+uid1=me()&access_token=...
查询当然可以修改,像这样(你可以add/remove字段甚至添加子查询):
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())
但是 你的 account/application 必须在 2014 年注册(我希望我是正确的,但你可以查看文档)
所以我正在使用 CodeIgniter 框架并试图获得用户朋友。我在身份验证方面没有问题,但是当我尝试使用 https://graph.facebook.com/me/friends?fields=gender,id,name&access_token=
中的 GET 方法获取用户好友时,它 returns 我的数组是空的。这是前端代码
<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;
}
所以我不知道为什么这不起作用,有什么建议吗?
结果正确。从v2.0开始,你只能获取授权过你App的好友:https://developers.facebook.com/docs/apps/changelog
这很可能是在 Whosebug 上被问得最多的问题,请在提问前使用搜索选项 (google, Whosebug)。这个线程中有一个非常详细的答案,例如:Facebook Graph Api v2.0+ - /me/friends returns empty, or only friends who also use my app
我遇到了同样的问题。您可以使用 FQL 获取好友列表。但是 FQL 已弃用 ,我认为将在 2-3 个月内被禁用。 使用 v2.0+,在隐私政策发生变化后,您可以获得 仅 已经安装了您的应用程序的朋友列表(他们授予了您的应用程序权限)。 一般来说,在v2.0之前,根据隐私,用户对自己的账户和朋友账户负责。 v2.0之后,用户只对自己的资料负责。
在 v2.0 中,您只能收集朋友列表来向他们推荐您的应用,因此您必须改变推广应用的方式来收集朋友资料。
请求看起来像:
GET /fql?q=SELECT+uid2+FROM+friend+WHERE+uid1=me()&access_token=...
查询当然可以修改,像这样(你可以add/remove字段甚至添加子查询):
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())
但是 你的 account/application 必须在 2014 年注册(我希望我是正确的,但你可以查看文档)