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'];
php
json
facebook
facebook-graph-api
kylex
źródło
źródło
var_dump($obj);
wyświetla?Odpowiedzi:
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 .
źródło
FB.api('/me?scope=email', function(apiResponse) { ... });
// 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'] );
źródło
/me
trasę? Ciągle przeglądam strony w Graph API i nie mogę go nigdzie znaleźć :(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')); }
źródło
Aby otrzymać adres e-mail użytkownika, musisz zalogować się na jego konto na Facebooku, używając
email
uprawnienia. 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
email
pozwolenie: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_profile
tablicy.Mam nadzieję, że to pomoże!
źródło
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 !'); } }); }
źródło
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"]); } ?>
źródło
$user_profile
nie zawiera eZakł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).
https://developers.facebook.com/docs/facebook-login/permissions
źródło
https://graph.facebook.com/me
poda informacje o aktualnie zalogowanym użytkowniku, ale będziesz musiał podać token oauth. Widzieć:
http://developers.facebook.com/docs/reference/api/user
źródło
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.
źródło
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.
źródło
Podczas programowania przydatne mogą być następujące narzędzia:
https://developers.facebook.com/tools/debug/accesstoken/
https://developers.facebook.com/tools/explorer
źródło
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
.źródło
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ń
oczywiście, tworząc własny przycisk do rozpoczęcia procesu logowania
LUB
2) dodaj atrybut scope = "email" do przycisku xfbml
aby móc zbierać adresy e-mail po stronie PHP.
Mam nadzieję, że to pomoże.
źródło
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); });
źródło