Facebook Graph API, come ricevere la posta elettronica degli utenti?


86

Sto usando l'API Graph, ma non riesco a capire come ottenere un indirizzo email degli utenti che hanno effettuato l'accesso.

L'introduzione a Graph afferma "L'API Graph può fornire l'accesso a tutti i dati di registrazione dell'account di base che normalmente richiederesti in un modulo di registrazione per il tuo sito, inclusi nome, indirizzo email, immagine del profilo e data di nascita"

Tutto bene, ma come accedo a queste informazioni?

Questo è quello che ho finora:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];

3
cosa produce var_dump($obj);?
Jayrox

Risposte:


76

L'unico modo per ottenere l'indirizzo e-mail degli utenti è richiedere autorizzazioni estese nel campo dell'e-mail. L'utente deve consentirti di vederlo e non puoi ottenere gli indirizzi di posta elettronica degli amici dell'utente.

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

Puoi farlo se stai usando Facebook Connect passando scope = email nella stringa di ricezione della tua chiamata alla finestra di dialogo Auth.

Consiglierei di utilizzare un SDK invece di file_get_contents in quanto rende molto più semplice eseguire l' autenticazione Oauth .


OK, file_get_contents modificato. Ma sono un po 'confuso su dove passerei req_perms = email.
kylex

10
Non importa, l'ho capito: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex

14
Non era del tutto ovvio per me sulla base di questa risposta ... se stai usando l'API JavaScript, vuoi usareFB.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']
);

2
C'è da qualche parte una pagina di riferimento che descrive il /mepercorso? Continuo a sfogliare le pagine
sull'API

3
/ me? locale = en_US & fields = name, l'email era l'unico modo in cui ho potuto capire per ottenere che restituisse l'indirizzo email, non sono riuscito a trovare nessun altro riferimento a questo online
Ashley


1
Questa è la risposta corretta, anche se una spiegazione più semplice può essere trovato qui: stackoverflow.com/questions/37349618/...
HoldOffHunger

grazie per questo .. nient'altro ha funzionato tranne questo. ora funziona bene! :)
supersan

19

Apri base_facebook.php Aggiungi Access_token alla funzione getLoginUrl()

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

e Usa ambito per autorizzazione e-mail

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

6

Per ottenere l'email dell'utente, è necessario accedere all'utente con il suo account Facebook utilizzando l' emailautorizzazione. Usa per questo l'SDK PHP di Facebook ( vedi su GitHub ) come segue.

Per prima cosa controlla se l'utente è già loggato:

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

In caso contrario, puoi visualizzare il link di accesso chiedendo il emailpermesso:

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

Una volta effettuato l'accesso, l'email può essere trovata $user_profilenell'array.

Spero che aiuti !


6

Basta aggiungere questi blocchi di codice al ritorno dello stato e iniziare a passare un oggetto stringa di query {}. Per sviluppatori JavaScript

Dopo aver inizializzato il tuo sdk.

passaggio 1: // ottenere lo stato di accesso

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

Questo controllerà il caricamento del documento e otterrà il controllo dello stato di accesso se gli utenti hanno effettuato l'accesso.

Quindi viene chiamata la funzione checkLoginState e la risposta viene passata a statusChangeCallback

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

Passaggio 2: consente di ottenere i dati di risposta dallo stato

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 !');
    }
  }

Questo ha anche l' ID utente che viene impostato su variabile, quindi viene chiamata una funzione getUserInfo per recuperare le informazioni dell'utente utilizzando 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);
      }
    );
  }

Dopo aver passato l' ID utente come argomento, la funzione recupera tutte le informazioni relative a quell'ID utente . Nota: nel mio caso stavo cercando l'email, in quanto mi permetteva di eseguire una funzione che può loggare l'utente solo via email.

// accedi tramite 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 !');
      }
    });
  }

Ciao @Pang, puoi controllare ora, penso che questo potrebbe aiutare. ma meglio ancora puoi ancora commentare più problemi.
Delino

+ stato dell'eroe, solo per "/" + userId + "/? fields = id, name, email" che non è specificato nella documentazione
therightstuff

5

È possibile recuperare l'indirizzo e-mail dal profilo dell'utente connesso. Ecco lo snippet di codice

<?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"]);
    }
?>

4
Questo non funziona per me. $user_profilenon contiene email
zed Barbanera

3

Supponendo che tu abbia richiesto le autorizzazioni e-mail quando l'utente ha effettuato l'accesso dalla tua app e disponi di un token valido,

Con l' api fetch puoi semplicemente

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

il risultato sarà:

{
    "id": "some_id",
    "email": "name@example.org"
}

id verrà restituito comunque.

Puoi aggiungere ai campi query param più cose, ma hai bisogno delle autorizzazioni per loro se non sono sul profilo pubblico (il nome è pubblico).

?fields=name,email,user_birthday&token=

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


Adoro una risposta che non presuppone l'uso di un SDK non necessario.
Lilleman,


1

L'e-mail nel profilo può essere ottenuta utilizzando l'autorizzazione estesa, ma immagino non sia possibile ottenere l'email utilizzata per accedere a fb. Nella mia app volevo visualizzare più account fb di un utente in un elenco, volevo mostrare le email di accesso degli account fb come identificatore univoco dei rispettivi account ma non sono riuscito a toglierlo da fb, tutto quello che ho ottenuto è stato l'email principale nel profilo utente ma nel mio caso la mia email di accesso e la mia email principale sono diverse.


0

Assicurati che la tua applicazione Facebook sia pubblicata. Per ricevere dati per posta elettronica, public_profile e user_friends la tua app deve essere resa disponibile al pubblico.

Puoi disabilitarlo in seguito per scopi di sviluppo e continuare a ricevere il campo email.



0

Assicurati di specificare completamente il numero di versione dell'API come qualcosa di simile "v2.11"e non"2.11"

Non sono sicuro del valore predefinito se non è corretto, ma ho ricevuto alcuni strani errori cercando di recuperare l'email quando ho perso il file v.


0

Per me il problema con la raccolta degli indirizzi e-mail dell'utente sul lato PHP (metodo getGraphUser ()) era che il comportamento predefinito del pulsante renderizzato da Facebook (sul lato WEBSIDE, creato con xfbml = 1) è quello di chiamare implicitamente FB.login () con l'ambito NON include "email".

Ciò significa che DEVI:

1) chiama

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

manifestamente, creando il proprio pulsante per avviare il processo di accesso

O

2) aggiungi l'attributo scope = "email" al pulsante xfbml

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

per poter raccogliere indirizzi email sul lato PHP.

Spero che sia d'aiuto.


0

Innanzitutto, attiva la tua applicazione nel centro per sviluppatori di Facebook . Le applicazioni in modalità di sviluppo non possono recuperare il campo di posta elettronica.

Se l'utente non è loggato, devi effettuare il login e specificare che la tua applicazione / sito necessiterà del campo e-mail.

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

Quindi, dopo il login, o se l'utente è già loggato, recupera l'e-mail utilizzando l'API di Facebook, specificando il campo email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.