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'];

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 .


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

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


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

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 !


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

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

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": "name@example.org"
}

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


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


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.


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.



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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.