This article assumes that you are familiar with the Facebook SDK Core Concepts and know how to request a user’s access token. This also uses the Facebook PHP SDK.
Getting the list of friends
You can get the friends of a Facebook user using this FQL query:
This request requires the access token of the user whose friends you want to access. Here’s an example using the Facebook SDK for PHP:
$client = new Facebook(array('appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET'));
$userId = 123;
$fql = "SELECT uid, first_name, last_name FROM user "
. "WHERE uid in (SELECT uid2 FROM friend where uid1 = $userId)";
$friends = $client->api(array(
'method' => 'fql.query',
'access_token' => 'USER_ACCESS_TOKEN',
'query' => $fql,
));
// we now have an array containing the friends of the user
print_r($friends);
You can look at the user
table reference for other fields
besides first_name
and last_name
. Note that there are some fields such as email
that require
user specific permissions. If the user/friend has not given your app
email permissions, chances are you won’t be able to get the email address. For instances like these, you can opt to filter just the
friends who have given your app permissions. This can be done using the is_app_user
field:
The case with email addresses
From my tests, it looks like it’s more reliable to get the email addresses of friends if you don’t put in any user access token when calling $client->api()
.
Here’s a complete example of getting a list of friends and getting all their email addresses:
$appId = 'YOUR_APP_ID';
$appSecret = 'YOUR_APP_SECRET';
$userId = 'A_FACEBOOK_USER_ID';
$userAccessToken = 'THE_FACEBOOK_USER_ACCESS_TOKEN';
$client = new Facebook(array('appId' => $appId, 'secret' => $appSecret));
// get all friends who has given our app permissions to access their data
$fql = "SELECT uid, first_name, last_name, email FROM user "
. "WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = $userId)";
$friends = $client->api(array(
'method' => 'fql.query',
'access_token' => $userAccessToken,
'query' => $fql,
));
// make an array of all friend ids
$friendIds = array();
foreach ($friends as $friend) {
$friendIds[] = $friend['uid'];
}
// get info of all the friends without using any access token
$friendIds = implode(',', $friendIds);
$fql = "SELECT uid, first_name, last_name, email FROM user WHERE uid IN ($friendIds)";
$friends = $client->api(array(
'method' => 'fql.query',
'query' => $fql,
// don't use an access token
));
// we should now have a list of friend infos with their email addresses
print_r($friends);