API Facebook Graph, comment envoyer les e-mails des utilisateurs?

86

J'utilise l'API Graph, mais je n'arrive pas à comprendre comment obtenir l'adresse e-mail des utilisateurs connectés.

L'introduction à Graph indique que "L'API Graph peut donner accès à toutes les données d'enregistrement de compte de base que vous demanderiez généralement dans un formulaire d'inscription pour votre site, y compris le nom, l'adresse e-mail, la photo de profil et la date de naissance"

Tout va bien, mais comment puis-je accéder à ces informations?

Voici ce que j'ai jusqu'à présent:

$json = $facebook->api('/me');

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
kylex
la source
3
qu'est-ce que la var_dump($obj);sortie?
Jayrox

Réponses:

76

La seule façon d'obtenir l'adresse e-mail des utilisateurs est de demander des autorisations étendues sur le champ e-mail. L'utilisateur doit vous permettre de voir cela et vous ne pouvez pas obtenir les adresses e-mail des amis de l'utilisateur.

http://developers.facebook.com/docs/authentication/permissions

Vous pouvez le faire si vous utilisez Facebook connect en transmettant scope = email dans la chaîne get de votre appel à la boîte de dialogue Auth.

Je recommanderais d'utiliser un SDK au lieu de file_get_contents car cela facilite grandement l' authentification Oauth .

Gazler
la source
Ok, fichier_get_contents modifié. Mais je suis un peu confus quant à l'endroit où je passerais le req_perms = email.
kylex
10
Nevermind, j'ai compris: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
Ce n'était pas complètement évident pour moi basé sur cette réponse ... si vous utilisez l'API JavaScript, vous voulez utiliserFB.api('/me?scope=email', function(apiResponse) { ... });
Olson.dev
58
// Facebook SDK v5 for PHP
// https://developers.facebook.com/docs/php/gettingstarted/5.0.0

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.4',
]);

$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
$response = $fb->get('/me?locale=en_US&fields=name,email');
$userNode = $response->getGraphUser();
var_dump(
    $userNode->getField('email'), $userNode['email']
);
masakielastic
la source
2
Y a-t-il quelque part une page de référence décrivant l' /meitinéraire? Je continue à parcourir les pages sur l' API Graph et je ne le trouve nulle part :(
Radu Murzea
3
/ moi locale = en_US & champs = nom, l' email était la seule façon que je pouvais comprendre pour l' obtenir pour retourner l'adresse e - mail, ne pouvait trouver aucune autre référence à cette ligne?
Ashley
voici les documents - developer.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku
1
C'est la bonne réponse, bien qu'une explication plus simple puisse être trouvée ici: stackoverflow.com/questions/37349618/…
HoldOffHunger
merci pour cela .. rien d'autre n'a fonctionné à part cela. maintenant ça marche bien! :)
supersan
19

Ouvrez base_facebook.php Ajoutez Access_token à la fonction getLoginUrl()

array_merge(array(
                  'access_token' => $this->getAccessToken(),
                  'client_id' => $this->getAppId(),
                  'redirect_uri' => $currentUrl, // possibly overwritten
                  'state' => $this->state),
             $params);

et utiliser la portée de l'autorisation de messagerie

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Kaletha
la source
6

Pour obtenir l'e-mail de l'utilisateur, vous devez vous connecter à l'utilisateur avec son compte Facebook en utilisant l' emailautorisation. Utilisez pour cela le SDK PHP Facebook ( voir sur github ) comme suit.

Vérifiez d'abord si l'utilisateur est déjà connecté:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();
if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        $user = null;
    }
}

Si ce n'est pas le cas, vous pouvez afficher le lien de connexion demandant l' emailautorisation:

if (!$user) {
    $args = array('scope' => 'email');
    echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
    echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}

Lorsqu'il est connecté, l'e-mail se trouve dans le $user_profiletableau.

J'espère que ça t'as aidé !

Quentin
la source
6

Ajoutez simplement ces blocs de code au retour d'état et commencez à passer un objet de chaîne de requête {}. Pour les développeurs JavaScript

Après avoir initialisé votre sdk.

étape 1: // obtenir le statut de connexion

$(document).ready(function($) {
    FB.getLoginStatus(function(response) {
        statusChangeCallback(response);
        console.log(response);
    });
  });

Cela vérifiera le chargement du document et vérifiera votre statut de connexion si les utilisateurs ont été connectés.

Ensuite, la fonction checkLoginState est appelée et la réponse est transmise à statusChangeCallback

function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

Étape 2: vous permet d'obtenir les données de réponse de l'état

function statusChangeCallback(response) {
    // body...
    if(response.status === 'connected'){
      // setElements(true);
      let userId = response.authResponse.userID;
      // console.log(userId);
      console.log('login');
      getUserInfo(userId);

    }else{
      // setElements(false);
      console.log('not logged in !');
    }
  }

Cela a également l' ID utilisateur qui est défini sur variable, puis une fonction getUserInfo est appelée pour récupérer les informations utilisateur à l'aide de Graph-api.

function getUserInfo(userId) {
    // body...
    FB.api(
      '/'+userId+'/?fields=id,name,email',
      'GET',
      {},
      function(response) {
        // Insert your code here
        // console.log(response);
        let email = response.email;
        loginViaEmail(email);
      }
    );
  }

Après avoir passé l' ID utilisateur comme argument, la fonction récupère toutes les informations relatives à cet ID utilisateur . Remarque: dans mon cas, je cherchais l'e-mail, pour me permettre d'exécuter une fonction qui peut connecter l'utilisateur par e-mail uniquement.

// connexion par e-mail

function loginViaEmail(email) {
    // body...
    let token = '{{ csrf_token() }}';

    let data = {
      _token:token,
      email:email
    }

    $.ajax({
      url: '/login/via/email',    
      type: 'POST',
      dataType: 'json',
      data: data,
      success: function(data){
        console.log(data);
        if(data.status == 'success'){
          window.location.href = '/dashboard';
        }

        if(data.status == 'info'){
          window.location.href = '/create-account'; 
        }
      },
      error: function(data){
        console.log('Error logging in via email !');
        // alert('Fail to send login request !');
      }
    });
  }
Delino
la source
Bonjour @Pang, vous pouvez vérifier maintenant, je pense que cela pourrait aider. mais mieux encore, vous pouvez encore commenter d'autres problèmes.
Delino
+ statut du héros, juste pour '/' + userId + '/? fields = id, name, email' qui n'est pas spécifié dans la documentation
therightstuff
5

Vous pouvez récupérer l'adresse e-mail du profil de l'utilisateur connecté. Voici l'extrait de code

<?php

    $facebook = new Facebook(array(
      'appId'  => $initMe["appId"],
      'secret' => $initMe["appSecret"],
    ));

    $facebook->setAccessToken($initMe["accessToken"]);
    $user = $facebook->getUser();

    if ($user) {
        $user_profile = $facebook->api('/me');
        print_r($user_profile["email"]);
    }
?>
Yash Kumar
la source
4
Cela ne fonctionne pas pour moi. $user_profilene contient pas d'email
zed Blackbeard
3

En supposant que vous ayez demandé des autorisations de messagerie lorsque l'utilisateur s'est connecté à partir de votre application et que vous disposez d'un jeton valide,

Avec l' api de récupération, vous pouvez simplement

const token = "some_valid_token";
const response = await fetch(
        `https://graph.facebook.com/me?fields=email&access_token=${token}`
      );
const result = await response.json();

le résultat sera:

{
    "id": "some_id",
    "email": "[email protected]"
}

id sera retourné de toute façon.

Vous pouvez ajouter aux champs le paramètre de requête plus de choses, mais vous avez besoin d'autorisations pour eux s'ils ne sont pas sur le profil public (le nom est public).

?fields=name,email,user_birthday&token=

https://developers.facebook.com/docs/facebook-login/permissions

Gabriel P.
la source
Aimez une réponse qui ne suppose pas l'utilisation d'un SDK qui n'est pas nécessaire.
Lilleman le
1

https://graph.facebook.com/me

vous donnera des informations sur l'utilisateur actuellement connecté, mais vous devrez fournir un jeton oauth. Voir:

http://developers.facebook.com/docs/reference/api/user

Bobby Jack
la source
13
vous ne pouvez pas l'obtenir sans autorisation prolongée.
grayger
ou sans spécifier le paramètre de champs '/ me /? fields = id, name, email' qui n'est pas spécifié dans la documentation
therightstuff
1

L'e-mail dans le profil peut être obtenu en utilisant une autorisation étendue mais je suppose qu'il n'est pas possible d'obtenir l'e-mail utilisé pour se connecter à fb. Dans mon application, je voulais afficher plusieurs comptes fb d'un utilisateur dans une liste, je voulais afficher les e-mails de connexion des comptes fb comme un identifiant unique des comptes respectifs, mais je ne pouvais pas le retirer de fb, tout ce que j'ai obtenu était l'adresse e-mail principale dans le profil utilisateur, mais dans mon cas, mon adresse e-mail de connexion et mon adresse e-mail principale sont différentes.

Karthik Sekar
la source
0

Assurez-vous que votre application Facebook est publiée. Afin de recevoir des données pour les e-mails, public_profile et user_friends, votre application doit être rendue publique.

Vous pouvez le désactiver plus tard à des fins de développement et toujours obtenir le champ de courrier électronique.

Didzis
la source
0

Assurez-vous de spécifier complètement le numéro de version de l'API comme quelque chose comme "v2.11"et non"2.11"

Je ne suis pas sûr de la valeur par défaut si cela est incorrect, mais j'ai eu des erreurs étranges en essayant de récupérer simplement l'e-mail lorsque j'ai manqué le fichier v.

Simon_Weaver
la source
0

Pour moi, le problème avec la collecte des adresses e-mail des utilisateurs côté PHP (méthode getGraphUser ()) était que le comportement par défaut du bouton rendu par facebook (côté WEBSIDE, créé avec xfbml = 1) est d'appeler implicitement FB.login () avec la portée n'inclut PAS "l'email".

Cela signifie que vous DEVEZ:

1) appeler

FB.login (...., {scope: email})

manifestement, créer votre propre bouton pour démarrer le processus de connexion

OU

2) ajoutez l'attribut scope = "email" au bouton xfbml

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "round" data-auto-logout-link = "false" data-use-continue-as = "true" data-
width = "1000px" scope = "email"> </div>

pour pouvoir collecter une adresse e-mail côté PHP.

J'espère que cela aide.

Marek Wysmułek
la source
0

Tout d'abord, activez votre application dans le centre de développement Facebook . Les applications en mode développement ne sont pas autorisées à récupérer le champ e-mail.

Si l'utilisateur n'est pas connecté, vous devez vous connecter et spécifier que votre application / site aura besoin du champ e-mail.

FB.login(
    function(response) {
         console.log('Welcome!');
    },
    {scope: 'email'}
);

Ensuite, après la connexion, ou si l'utilisateur est déjà connecté, récupérez l'e-mail à l'aide de l'API Facebook, en spécifiant le champ email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Derzu
la source