Facebook Graph API, wie bekomme ich Benutzer E-Mail?

85

Ich verwende die Graph-API, kann jedoch nicht herausfinden, wie ich eine E-Mail-Adresse eines angemeldeten Benutzers erhalte.

In der Einführung zu Graph heißt es: "Die Graph-API bietet Zugriff auf alle grundlegenden Kontoregistrierungsdaten, die Sie normalerweise in einem Anmeldeformular für Ihre Website anfordern würden, einschließlich Name, E-Mail-Adresse, Profilbild und Geburtstag."

Alles schön und gut, aber wie greife ich auf diese Informationen zu?

Das habe ich bisher:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Kylex
quelle
3
Was gibt var_dump($obj);aus?
Jayrox

Antworten:

75

Die einzige Möglichkeit, die E-Mail-Adresse des Benutzers abzurufen, besteht darin, erweiterte Berechtigungen für das E-Mail-Feld anzufordern. Der Benutzer muss zulassen, dass Sie dies sehen, und Sie können die E-Mail-Adressen der Freunde des Benutzers nicht abrufen.

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

Sie können dies tun, wenn Sie Facebook Connect verwenden, indem Sie scope = email in der get-Zeichenfolge Ihres Anrufs an das Auth-Dialogfeld übergeben.

Ich würde empfehlen, ein SDK anstelle von file_get_contents zu verwenden, da dies die Durchführung der Oauth- Authentifizierung erheblich erleichtert .

Gazler
quelle
Okay, file_get_contents geändert. Aber ich bin ein wenig verwirrt, wo ich die E-Mail req_perms = übergeben würde.
Kylex
10
Trotzdem habe ich es herausgefunden: $ facebook-> getLoginUrl (Array ('req_perms' => 'email'))
Kylex
13
FB.api('/me?scope=email', function(apiResponse) { ... });
Aufgrund
57
// 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']
);
masakielastisch
quelle
2
Gibt es irgendwo eine Referenzseite, die die /meRoute beschreibt? Ich stöbere weiter in den Seiten der Graph API und kann sie nirgendwo finden :(
Radu Murzea
3
/ me? locale = de_DE & fields = name, E-Mail war der einzige Weg, den ich herausfinden konnte, um die E-Mail-Adresse zurückzugeben. Ich konnte keinen anderen Verweis darauf online finden
Ashley
Hier sind Dokumente - Entwickler.facebook.com/docs/graph-api/reference/user @RaduMurzea
Arku
1
Dies ist die richtige Antwort, obwohl eine einfachere Erklärung hier zu finden ist: stackoverflow.com/questions/37349618/…
HoldOffHunger
danke dafür .. nichts anderes hat funktioniert außer diesem. jetzt funktioniert es gut! :)
Supersan
19

Öffnen Sie base_facebook.php. Fügen Sie Access_token bei function hinzu getLoginUrl()

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

und Bereich für E-Mail-Berechtigung verwenden

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

Um die Benutzer-E-Mail zu erhalten, müssen Sie sich mit der emailBerechtigung mit seinem Facebook-Konto beim Benutzer anmelden . Verwenden Sie dazu das Facebook PHP SDK ( siehe auf github ) wie folgt.

Überprüfen Sie zunächst, ob der Benutzer bereits angemeldet ist:

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

Wenn dies nicht der Fall ist, können Sie den Anmeldelink anzeigen und um emailErlaubnis bitten :

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

Wenn er angemeldet ist, befindet sich die E-Mail im $user_profileArray.

Hoffentlich hilft das !

QUentin
quelle
6

Fügen Sie diesen Codeblock einfach bei der Statusrückgabe hinzu und übergeben Sie ein Abfragezeichenfolgenobjekt {}. Für JavaScript-Entwickler

Nach der Initialisierung Ihres SDK.

Schritt 1: // Anmeldestatus abrufen

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

Dadurch wird das Laden des Dokuments überprüft und Ihr Anmeldestatus überprüft, ob Benutzer angemeldet sind.

Dann wird die Funktion checkLoginState aufgerufen und die Antwort an statusChangeCallback übergeben

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

Schritt 2: Lassen Sie Sie die Antwortdaten aus dem Status abrufen

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

Dies hat auch die Benutzer-ID , die auf Variable gesetzt wird. Dann wird eine getUserInfo-Funktion aufgerufen, um Benutzerinformationen mithilfe der Graph-API abzurufen.

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

Nachdem die Benutzer-ID als Argument übergeben wurde, ruft die Funktion alle Informationen ab, die sich auf diese Benutzer-ID beziehen . Hinweis: In meinem Fall habe ich nach der E-Mail gesucht, um eine Funktion ausführen zu können, mit der Benutzer nur per E-Mail angemeldet werden können.

// Login per 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
quelle
Hallo @Pang, du kannst jetzt nachsehen, ich denke das könnte helfen. aber noch besser, Sie können noch mehr Probleme kommentieren.
Delino
+ Heldenstatus, nur für '/' + userId + '/? fields = id, name, email', was nicht in der Dokumentation angegeben ist
therightstuff
5

Sie können die E-Mail-Adresse aus dem Profil des angemeldeten Benutzers abrufen. Hier ist das Code-Snippet

<?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
quelle
4
Das funktioniert bei mir nicht. $user_profileenthält keine E-Mail
zed Blackbeard
3

Angenommen, Sie haben E-Mail-Berechtigungen angefordert, als sich der Benutzer über Ihre App angemeldet hat und Sie über ein gültiges Token verfügen.

Mit der Fetch-API können Sie einfach

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

Ergebnis wird sein:

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

ID wird trotzdem zurückgegeben.

Sie können den Feldern Abfrageparameter mehr hinzufügen, benötigen jedoch Berechtigungen, wenn sie sich nicht im öffentlichen Profil befinden (Name ist öffentlich).

?fields=name,email,user_birthday&token=

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

Gabriel P.
quelle
Ich liebe eine Antwort, die nicht die Verwendung eines SDK voraussetzt, das nicht benötigt wird.
Lilleman
1

https://graph.facebook.com/me

Sie erhalten Informationen über den aktuell angemeldeten Benutzer, müssen jedoch ein Oauth-Token angeben. Sehen:

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

Bobby Jack
quelle
13
Sie können es nicht ohne erweiterte Erlaubnis bekommen.
Grayger
oder ohne Angabe des Feldparameters '/ me /? fields = id, name, email', der nicht in der Dokumentation angegeben ist
therightstuff
1

Die E-Mail im Profil kann mit erweiterter Berechtigung abgerufen werden, aber ich denke, es ist nicht möglich, die E-Mail zum Anmelden von fb zu verwenden. In meiner App wollte ich mehrere fb-Konten eines Benutzers in einer Liste anzeigen, ich wollte die Anmelde-E-Mails von fb-Konten als eindeutige Kennung der jeweiligen Konten anzeigen, aber ich konnte sie nicht von fb entfernen, alles was ich bekam Die primäre E-Mail im Benutzerprofil, aber in meinem Fall unterscheiden sich meine Login-E-Mail und meine primäre E-Mail.

Karthik Sekar
quelle
0

Stellen Sie sicher, dass Ihre Facebook-Anwendung veröffentlicht ist. Um Daten für E-Mail, public_profile und user_friends zu erhalten, muss Ihre App öffentlich zugänglich gemacht werden.

Sie können es später für Entwicklungszwecke deaktivieren und trotzdem ein E-Mail-Feld erhalten.

Didzis
quelle
0

Stellen Sie sicher, dass Sie die Versionsnummer der API vollständig angeben "v2.11"und nicht"2.11"

Ich bin mir nicht sicher, wie es standardmäßig ist, wenn dies falsch ist, aber ich habe einige seltsame Fehler beim Versuch, die E-Mail einfach abzurufen, als ich die verpasst habe v.

Simon_Weaver
quelle
0

Für mich bestand das Problem beim Sammeln der E-Mail-Adressen des Benutzers auf der PHP-Seite (getGraphUser () -Methode) darin, dass das Standardverhalten der von Facebook gerenderten Schaltfläche (auf der WEBSIDE-Seite, erstellt mit xfbml = 1) darin besteht, implizit FB.login () mit aufzurufen Der Geltungsbereich enthält NICHT "E-Mail".

Das heißt, Sie müssen:

1) anrufen

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

Offensichtlich erstellen Sie Ihre eigene Schaltfläche, um den Anmeldevorgang zu starten

ODER

2) Fügen Sie der xfbml-Schaltfläche das Attribut scope = "email" hinzu

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

E-Mail-Adresse auf PHP-Seite sammeln zu können.

Ich hoffe es hilft.

Marek Wysmułek
quelle