Facebook Graph API, kullanıcılara e-posta nasıl alınır?


87

Graph API'sini kullanıyorum, ancak oturum açmış bir kullanıcıların e-posta adresini nasıl alacağımı çözemiyorum.

Graph'in girişinde "Graph API, ad, e-posta adresi, profil resmi ve doğum günü dahil olmak üzere siteniz için bir kayıt formunda tipik olarak talep edeceğiniz tüm temel hesap kayıt verilerine erişim sağlayabilir" şeklindedir.

Her şey yolunda ve güzel, ama bu bilgiye nasıl erişebilirim?

Şimdiye kadar sahip olduğum şey bu:

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

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

3
var_dump($obj);çıktı ne ?
Jayrox

Yanıtlar:


78

Kullanıcıların e-posta adresini almanın tek yolu, e-posta alanında genişletilmiş izinler istemektir. Kullanıcı bunu görmenize izin vermelidir ve kullanıcının arkadaşlarının e-posta adreslerini alamazsınız.

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

Facebook Connect kullanıyorsanız, Auth Dialog'a yaptığınız çağrının get dizesine kapsam = e-posta göndererek bunu yapabilirsiniz.

Oauth kimlik doğrulamasını gerçekleştirmeyi çok daha kolay hale getirdiği için file_get_contents yerine bir SDK kullanmanızı öneririm .


Tamam, file_get_contents değiştirildi. Ancak req_perms = e-postasını nereye geçireceğim konusunda biraz kafam karıştı.
kylex

10
Boşver, anladım: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex

14
Bu yanıta dayalı olarak benim için tamamen açık değildi ... JavaScript API kullanıyorsanız, kullanmak istersinizFB.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
/meRotayı açıklayan bir referans sayfası var mı ? Sayfalara Graph API üzerinden göz atmaya devam ediyorum ve hiçbir yerde bulamıyorum :(
Radu Murzea

3
/ me? locale = en_US & Fields = name, e-posta, e-posta adresini geri döndürmeyi bulmamın tek yoluydu, buna çevrimiçi olarak başka bir referans bulamadım
Ashley


1
Bu doğru cevap, ancak daha basit bir açıklama burada bulunabilir: stackoverflow.com/questions/37349618/…
HoldOffHunger

bunun için teşekkürler .. bunun dışında hiçbir şey işe yaramadı. şimdi iyi çalışıyor! :)
supersan

19

Base_facebook.php dosyasını açın Fonksiyona Access_token ekleyin getLoginUrl()

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

ve E-posta İzni kapsamını kullanın

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

6

Kullanıcı e-postasını almak için, emailizni kullanarak kullanıcının Facebook hesabıyla oturum açmanız gerekir . Bunun için Facebook PHP SDK'sını ( github'a bakın ) aşağıdaki gibi kullanın.

İlk önce kullanıcının zaten oturum açmış olup olmadığını kontrol edin:

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

Değilse, emailizin isteyen giriş bağlantısını görüntüleyebilirsiniz :

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

Oturum açtığı zaman e-posta $user_profiledizisinde bulunabilir.

Umarım yardımcı olur !


6

Sadece durum dönüşünde bu kod bloğunu ekleyin ve {} bir sorgu dizesi nesnesini iletmeye başlayın. JavaScript geliştiricileri için

SDK'nızı başlattıktan sonra.

1. adım: // giriş durumunu al

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

Bu, belge yüklemesini kontrol edecek ve kullanıcıların oturum açıp açmadığını kontrol edecek.

Daha sonra checkLoginState işlevi çağrılır ve yanıt statusChangeCallback'e iletilir.

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

2. Adım: Durumdan yanıt verilerini almanıza izin verin

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

Bu aynı zamanda değişken olarak ayarlanan kullanıcı kimliğine sahiptir , ardından Graph- api'yi kullanarak kullanıcı bilgilerini almak için bir getUserInfo işlevi çağrılır.

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

Kullanıcı kimliğini bağımsız değişken olarak ilettikten sonra, işlev o kullanıcı kimliğiyle ilgili tüm bilgileri getirir . Not: Benim durumumda, kullanıcıyı yalnızca e-posta yoluyla oturum açabilen bir işlevi çalıştırmama izin vermek için e-postayı arıyordum.

// e-posta ile giriş yap

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

Merhaba @ Pang, şimdi kontrol edebilirsiniz, bunun yardımcı olabileceğini düşünüyorum. ama daha da iyisi, daha fazla konu hakkında yorum yapabilirsiniz.
Delino

+ kahraman durumu, yalnızca belgelerde belirtilmeyen '/' + userId + '/? alanları = id, ad, e-posta' için
sağda

5

E-posta adresini oturum açmış kullanıcının profilinden alabilirsiniz. İşte kod pasajı

<?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
Bu benim için çalışmıyor. $user_profilee-posta içermiyor
zed Blackbeard

3

Kullanıcı uygulamanızdan oturum açtığında e-posta izinleri talep ettiğinizi ve geçerli bir jetonunuz olduğunu varsayarsak,

API getirme ile şunları yapabilirsiniz:

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

sonuç:

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

id yine de iade edilecektir.

Alanlara sorgu parametresi daha fazla şey ekleyebilirsiniz, ancak bunlar genel profilde değilse (ad geneldir) bunlar için izinlere ihtiyacınız vardır.

?fields=name,email,user_birthday&token=

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


Gerekli olmayan bir SDK kullanımını varsaymayan bir cevabı sevin.
Lilleman


1

Profildeki e-posta, genişletilmiş izin kullanılarak elde edilebilir, ancak sanırım fb oturum açmak için kullanılan e-postayı almak mümkün değil. Uygulamamda, bir kullanıcının birden fazla fb hesabını bir listede görüntülemek istedim, fb hesaplarının giriş e-postalarını ilgili hesapların benzersiz bir tanımlayıcısı olarak göstermek istedim ancak bunu fb'den alamadım, tüm sahip olduğum kullanıcı profilindeki birincil e-posta, ancak benim durumumda giriş e-postam ve birincil e-postam farklı.


1

İlk olarak, Facebook Geliştirici merkezinde uygulamanızı etkinleştirin . Geliştirme modundaki uygulamaların e-posta alanını almasına izin verilmez.

Kullanıcı oturum açmamışsa, oturum açmanız ve uygulamanızın / sitenizin e-posta alanına ihtiyaç duyacağını belirtmeniz gerekir.

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

Ardından, oturum açtıktan sonra veya kullanıcı zaten oturum açtıysa, alan e-postasını belirterek Facebook API'sini kullanarak e-postayı alın:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});

0

Facebook uygulamanızın yayınlandığından emin olun. E-posta, public_profile ve user_friends verilerini alabilmek için uygulamanızın herkese açık hale getirilmesi gerekir.

Daha sonra geliştirme amacıyla devre dışı bırakabilir ve yine de e-posta alanı alabilirsiniz.



0

Tamamen gibi bir şey olarak API sürüm numarasını belirtmek için emin olun "v2.11"ve"2.11"

Yanlışsa varsayılanın neye benzediğinden emin değilim, ancak e-postayı v.


0

Benim için PHP tarafında kullanıcının e-posta adreslerini toplamakla ilgili sorun (getGraphUser () yöntemi), facebook'ta oluşturulmuş düğmenin (WEBSIDE tarafında, xfbml = 1 ile oluşturulan) varsayılan davranışının FB.login () ile kapsam "e-posta" İÇERMEZ.

Bu ZORUNLU olduğu anlamına gelir:

1) çağrı

FB.login (...., {kapsam: e-posta})

açıkça, oturum açma sürecini başlatmak için kendi düğmenizi oluşturmak

VEYA

2) xfbml düğmesine kapsam = "e-posta" özelliği ekleyin

<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-
genişlik = "1000px" kapsam = "e-posta"> </div>

PHP tarafında e-posta adresi toplayabilme.

Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.