Facebook Graph API, jak zdobyć e-mail użytkowników?

86

Używam Graph API, ale nie mogę dowiedzieć się, jak uzyskać adres e-mail zalogowanego użytkownika.

Wprowadzenie do programu Graph stwierdza: „Interfejs Graph API może zapewnić dostęp do wszystkich podstawowych danych rejestracyjnych konta, o które zwykle prosisz w formularzu rejestracji w witrynie, w tym imię i nazwisko, adres e-mail, zdjęcie profilowe i urodziny”

Wszystko dobrze, ale jak uzyskać dostęp do tych informacji?

Oto, co mam do tej pory:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
kylex
źródło
3
co się var_dump($obj);wyświetla?
Jayrox,

Odpowiedzi:

76

Jedynym sposobem uzyskania adresu e-mail użytkownika jest zażądanie rozszerzonych uprawnień w polu e-mail. Użytkownik musi pozwolić Ci to zobaczyć i nie możesz uzyskać adresów e-mail znajomych użytkownika.

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

Możesz to zrobić, jeśli korzystasz z połączenia z Facebookiem, przekazując scope = email w ciągu pobierania połączenia do okna dialogowego Auth.

Zalecam użycie zestawu SDK zamiast file_get_contents, ponieważ znacznie ułatwia to przeprowadzenie uwierzytelniania Oauth .

Gazler
źródło
OK, zmieniono file_get_contents. Ale jestem trochę zdezorientowany, gdzie powinienem przekazać req_perms = email.
kylex
10
Nieważne, rozgryzłem to: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
Nie było to dla mnie całkowicie oczywiste na podstawie tej odpowiedzi ... jeśli używasz JavaScript API, chcesz użyćFB.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
źródło
2
Czy jest gdzieś strona referencyjna opisująca /metrasę? Ciągle przeglądam strony w Graph API i nie mogę go nigdzie znaleźć :(
Radu Murzea
3
/ me? locale = en_US & fields = name, e-mail był jedynym sposobem, w jaki mogłem się dowiedzieć, aby zwrócić adres e-mail, nie mogłem znaleźć żadnego innego odniesienia do tego w Internecie
Ashley
tutaj są dokumenty - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku
1
To jest poprawna odpowiedź, chociaż prostsze wyjaśnienie można znaleźć tutaj: stackoverflow.com/questions/37349618/ ...
HoldOffHunger
dziękuję za to .. nic innego nie działało poza tym. teraz działa dobrze! :)
supersan
19

Otwórz base_facebook.php Dodaj Access_token w funkcji getLoginUrl()

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

i Użyj zakresu uprawnień do wiadomości e-mail

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Kaletha
źródło
6

Aby otrzymać adres e-mail użytkownika, musisz zalogować się na jego konto na Facebooku, używając emailuprawnienia. Użyj do tego zestawu Facebook PHP SDK ( patrz na github ) w następujący sposób.

Najpierw sprawdź, czy użytkownik jest już zalogowany:

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

Jeśli nie, możesz wyświetlić link do logowania z prośbą o emailpozwolenie:

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

Gdy jest zalogowany, e-mail można znaleźć w $user_profiletablicy.

Mam nadzieję, że to pomoże!

Quentin
źródło
6

Po prostu dodaj ten blok kodu przy zwrocie statusu i zacznij przekazywać obiekt ciągu zapytania {}. Dla programistów JavaScript

Po zainicjowaniu pliku sdk.

krok 1: // pobierz status logowania

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

Spowoduje to sprawdzenie załadowania dokumentu i sprawdzenie statusu logowania, czy użytkownicy są zalogowani.

Następnie wywoływana jest funkcja checkLoginState , a odpowiedź przekazywana jest do statusuChangeCallback

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

Krok 2: Pozwól uzyskać dane odpowiedzi ze statusu

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

Ma również identyfikator użytkownika, który jest ustawiany na zmienną, a następnie wywoływana jest funkcja getUserInfo w celu pobrania informacji o użytkowniku za pomocą 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);
      }
    );
  }

Po przekazaniu identyfikatora użytkownika jako argumentu funkcja pobiera wszystkie informacje dotyczące tego identyfikatora użytkownika . Uwaga: w moim przypadku szukałem e-maila, ponieważ pozwolił mi uruchomić funkcję, która może zalogować użytkownika tylko przez e-mail.

// zaloguj się przez 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
źródło
Cześć @Pang, możesz teraz sprawdzić, myślę, że to może pomóc. ale lepiej nadal możesz komentować więcej problemów.
Delino
+ status bohatera, tylko dla '/' + userId + '/? fields = id, name, email', co nie jest określone w dokumentacji
therightstuff
5

Możesz pobrać adres e-mail z profilu zalogowanego użytkownika. Oto fragment kodu

<?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
źródło
4
To nie działa dla mnie. $user_profilenie zawiera e
zed Blackbeard
3

Zakładając, że zażądałeś uprawnień do poczty e-mail, gdy użytkownik zalogował się z Twojej aplikacji i masz ważny token,

Dzięki api pobierania możesz po prostu

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

wynik będzie:

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

id i tak zostanie zwrócony.

Możesz dodać do pól zapytania param więcej rzeczy, ale potrzebujesz do nich uprawnień, jeśli nie ma ich w profilu publicznym (nazwa jest publiczna).

?fields=name,email,user_birthday&token=

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

Gabriel P.
źródło
Uwielbiam odpowiedź, która nie zakłada użycia zestawu SDK, który nie jest potrzebny.
Lilleman
1

Adres e-mail w profilu można uzyskać za pomocą rozszerzonych uprawnień, ale myślę, że nie jest możliwe uzyskanie adresu e-mail używanego do logowania na fb. W mojej aplikacji chciałem wyświetlić wiele kont fb użytkownika na liście, chciałem pokazać e-maile logowania do kont fb jako unikalny identyfikator odpowiednich kont, ale nie mogłem go usunąć z fb, wszystko, co otrzymałem, to podstawowy adres e-mail w profilu użytkownika, ale w moim przypadku mój adres e-mail logowania i główny adres e-mail są różne.

Karthik Sekar
źródło
0

Upewnij się, że Twoja aplikacja Facebook została opublikowana. Aby otrzymywać dane do wiadomości e-mail, public_profile i user_friends, Twoja aplikacja musi być publicznie dostępna.

Możesz go później wyłączyć do celów programistycznych i nadal otrzymywać pole e-mail.

Didzis
źródło
0

Upewnij się, że w pełni określasz numer wersji interfejsu API jako coś podobnego, "v2.11"a nie"2.11"

Nie jestem pewien, jakie jest domyślne ustawienie, jeśli jest to nieprawidłowe, ale pojawiły się dziwne błędy podczas próby pobrania wiadomości e-mail, gdy przegapiłem v.

Simon_Weaver
źródło
0

Dla mnie problem ze zbieraniem adresów e-mail użytkownika po stronie PHP (metoda getGraphUser ()) polegał na tym, że domyślnym zachowaniem przycisku renderowanego na Facebooku (po stronie WEBSIDE, utworzonego z xfbml = 1) jest niejawne wywoływanie FB.login () z zakres NIE obejmuje „e-mail”.

Oznacza to, że MUSISZ:

1) zadzwoń

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

oczywiście, tworząc własny przycisk do rozpoczęcia procesu logowania

LUB

2) dodaj atrybut scope = "email" do przycisku xfbml

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

aby móc zbierać adresy e-mail po stronie PHP.

Mam nadzieję, że to pomoże.

Marek Wysmułek
źródło
0

Najpierw aktywuj swoją aplikację w centrum deweloperów Facebooka . Aplikacje w trybie programistycznym nie mogą pobierać pola e-mail.

Jeśli użytkownik nie jest zalogowany, musisz się zalogować i określić, że Twoja aplikacja / witryna będzie potrzebować pola e-mail.

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

Następnie po zalogowaniu lub jeśli użytkownik jest już zalogowany, pobierz wiadomość e-mail za pomocą Facebook API, podając pole email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Derzu
źródło