Facebook Graph API, bagaimana cara mendapatkan email pengguna?

87

Saya menggunakan API Grafik, tetapi saya tidak tahu cara mendapatkan alamat email pengguna yang masuk.

Pengantar Grafik menyatakan "API Grafik dapat memberikan akses ke semua data pendaftaran akun dasar yang biasanya Anda minta dalam formulir pendaftaran untuk situs Anda, termasuk nama, alamat email, gambar profil, dan tanggal lahir"

Semuanya baik dan bagus, tapi bagaimana cara mengakses info itu?

Inilah yang saya miliki sejauh ini:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
kylex
sumber
3
apa var_dump($obj);keluaran?
Jayrox

Jawaban:

78

Satu-satunya cara untuk mendapatkan alamat email pengguna adalah dengan meminta perpanjangan izin di bidang email. Pengguna harus mengizinkan Anda untuk melihat ini dan Anda tidak bisa mendapatkan alamat email teman pengguna.

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

Anda dapat melakukan ini jika Anda menggunakan Facebook connect dengan meneruskan scope = email di string get panggilan Anda ke Auth Dialog.

Saya akan merekomendasikan menggunakan SDK daripada file_get_contents karena membuatnya jauh lebih mudah untuk melakukan otentikasi Oauth .

Gazler
sumber
Oke, ubah file_get_contents. Tapi saya agak bingung kemana saya akan meneruskan req_perms = email.
kylex
10
Tidak apa-apa, saya menemukannya: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex
14
Tidak sepenuhnya jelas bagi saya berdasarkan jawaban ini ... jika Anda menggunakan JavaScript API, Anda ingin menggunakanFB.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']
);
masakielastik
sumber
2
Apakah ada halaman referensi yang menjelaskan /merute tersebut? Saya terus menelusuri halaman-halaman di Graph API dan tidak dapat menemukannya di mana pun :(
Radu Murzea
3
/ me? locale = en_US & field = name, email adalah satu-satunya cara yang bisa saya pikirkan untuk mengembalikan alamat email, tidak dapat menemukan referensi lain untuk ini secara online
Ashley
berikut adalah dokumennya
arku
1
Ini adalah jawaban yang benar, meskipun penjelasan yang lebih sederhana dapat ditemukan di sini: stackoverflow.com/questions/37349618/…
HoldOffHunger
terima kasih untuk ini .. tidak ada yang berhasil kecuali ini. sekarang berfungsi dengan baik! :)
supersan
19

Buka base_facebook.php Tambahkan Access_token di fungsi getLoginUrl()

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

dan Gunakan cakupan untuk Izin Email

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

Untuk mendapatkan email pengguna, Anda harus memasukkan pengguna dengan akun Facebook-nya menggunakan emailizin. Gunakan untuk itu Facebook PHP SDK ( lihat di github ) sebagai berikut.

Pertama, periksa apakah pengguna sudah masuk:

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

Jika tidak, Anda dapat menampilkan link login yang meminta emailizin:

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

Ketika dia login email dapat ditemukan di $user_profilearray.

Semoga membantu!

Quentin
sumber
6

Cukup tambahkan blok kode ini pada pengembalian status, dan mulai meneruskan objek string kueri {}. Untuk pengembang JavaScript

Setelah menginisialisasi SDK Anda.

langkah 1: // dapatkan status login

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

Ini akan memeriksa pemuatan dokumen dan mendapatkan status login Anda memeriksa apakah pengguna telah masuk.

Kemudian fungsi checkLoginState dipanggil, dan responsnya diteruskan ke statusChangeCallback

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

Langkah 2: Biarkan Anda mendapatkan data respons dari status

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

Ini juga memiliki userid yang disetel ke variabel, kemudian fungsi getUserInfo dipanggil untuk mengambil informasi pengguna menggunakan 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);
      }
    );
  }

Setelah melewatkan userid sebagai argumen, fungsi tersebut kemudian mengambil semua informasi yang berkaitan dengan userid tersebut . Catatan: dalam kasus saya, saya sedang mencari email, untuk memungkinkan saya menjalankan fungsi yang dapat login pengguna hanya melalui email.

// masuk melalui email

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
sumber
Halo @Pang, Anda dapat memeriksa sekarang, saya rasa ini mungkin membantu. tapi lebih baik lagi Anda masih bisa berkomentar lebih banyak masalah.
Delino
+ status pahlawan, hanya untuk '/' + userId + '/? fields = id, name, email' yang tidak ditentukan dalam dokumentasi
kanan pada
5

Anda dapat mengambil alamat email dari profil pengguna yang masuk. Ini cuplikan kodenya

<?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
sumber
4
Ini tidak berhasil untuk saya. $user_profiletidak berisi email
zed Blackbeard
3

Dengan asumsi Anda telah meminta izin email saat pengguna masuk dari aplikasi Anda dan Anda memiliki token yang valid,

Dengan fetch api Anda bisa

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

hasilnya adalah:

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

id akan tetap dikembalikan.

Anda dapat menambahkan lebih banyak hal ke bidang kueri param, tetapi Anda memerlukan izin untuk mereka jika mereka tidak ada di profil publik (nama publik).

?fields=name,email,user_birthday&token=

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

Gabriel P.
sumber
Suka jawaban yang tidak mengasumsikan penggunaan SDK yang tidak diperlukan.
Lilleman
1

https://graph.facebook.com/me

akan memberi Anda info tentang pengguna yang saat ini masuk, tetapi Anda harus memberikan token oauth. Lihat:

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

Bobby Jack
sumber
13
Anda tidak bisa mendapatkannya tanpa izin tambahan.
abu
atau tanpa menentukan parameter bidang '/ me /? fields = id, name, email' yang tidak ditentukan dalam dokumentasi
kanan
1

Email di profil dapat diperoleh menggunakan izin diperpanjang tetapi saya kira tidak mungkin untuk mendapatkan email yang digunakan untuk login fb. Di aplikasi saya, saya ingin menampilkan beberapa akun fb pengguna dalam daftar, saya ingin menampilkan email masuk akun fb sebagai pengenal unik dari masing-masing akun tetapi saya tidak bisa melepaskannya dari fb, yang saya dapatkan hanyalah email utama di profil pengguna tetapi dalam kasus saya, email untuk masuk dan email utama saya berbeda.

Karthik Sekar
sumber
1

Pertama, aktifkan aplikasi Anda di Pusat Pengembang Facebook . Aplikasi dalam mode pengembangan tidak diizinkan untuk mengambil kolom email.

Jika pengguna tidak masuk, Anda perlu masuk dan menentukan bahwa aplikasi / situs Anda memerlukan bidang email.

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

Kemudian, setelah login, atau jika pengguna sudah login, ambil email menggunakan API Facebook, tentukan kolom email:

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

Pastikan aplikasi Facebook Anda dipublikasikan. Untuk menerima data untuk email, public_profile dan user_friends, aplikasi Anda harus tersedia untuk publik.

Anda dapat menonaktifkannya nanti untuk tujuan pengembangan dan masih mendapatkan bidang email.

Didzis
sumber
0

Pastikan untuk sepenuhnya menentukan nomor versi API sebagai sesuatu yang disukai "v2.11"dan tidak"2.11"

Saya tidak yakin apa defaultnya jika ini salah, tetapi saya mendapat beberapa kesalahan aneh mencoba mengambil email ketika saya melewatkan v.

Simon_Weaver
sumber
0

Bagi saya masalah dengan mengumpulkan alamat email pengguna di sisi PHP (metode getGraphUser ()) adalah, bahwa perilaku default tombol yang dirender facebook (di sisi SITUS WEB, dibuat dengan xfbml = 1) adalah implikasi memanggil FB.login () dengan cakupannya TIDAK termasuk "email".

Itu artinya Anda HARUS:

1) panggilan

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

secara nyata, membuat tombol Anda sendiri untuk memulai proses login

ATAU

2) tambahkan atribut scope = "email" ke tombol 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>

untuk dapat mengumpulkan alamat email di sisi PHP.

Semoga membantu.

Marek Wysmułek
sumber