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

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 .


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

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

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!


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

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

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

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


Suka jawaban yang tidak mengasumsikan penggunaan SDK yang tidak diperlukan.
Lilleman


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.


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

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.



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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.