Getting a list of a Facebook user's friends with their email addresses


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:

SELECT uid FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = $userId)

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:

SELECT uid, first_name, last_name FROM user
  WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = $userId)

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);