Facebook Graph API, cách lấy email của người dùng?


86

Tôi đang sử dụng API Đồ thị, nhưng tôi không thể tìm ra cách lấy địa chỉ email người dùng đã đăng nhập.

Phần giới thiệu về Graph nêu rõ "API Graph có thể cung cấp quyền truy cập vào tất cả dữ liệu đăng ký tài khoản cơ bản mà bạn thường yêu cầu trong biểu mẫu đăng ký cho trang web của mình, bao gồm tên, địa chỉ email, ảnh hồ sơ và ngày sinh"

Tất cả đều tốt và tốt, nhưng làm cách nào để truy cập thông tin đó?

Đây là những gì tôi có cho đến nay:

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

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

3
những gì hiện var_dump($obj);ra?
Jayrox

Câu trả lời:


76

Cách duy nhất để có được địa chỉ e-mail của người dùng là yêu cầu quyền mở rộng trên trường email. Người dùng phải cho phép bạn xem thông tin này và bạn không thể lấy địa chỉ e-mail của bạn bè người dùng.

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

Bạn có thể làm điều này nếu bạn đang sử dụng Facebook connect bằng cách chuyển scope = email vào chuỗi nhận cuộc gọi của bạn tới Hộp thoại xác thực.

Tôi khuyên bạn nên sử dụng SDK thay vì file_get_contents vì nó giúp thực hiện xác thực Oauth dễ dàng hơn nhiều .


Được rồi, file_get_contents đã thay đổi. Nhưng tôi hơi bối rối về nơi tôi sẽ chuyển email req_perms =.
kylex

10
Đừng bận tâm, tôi đã tìm ra: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex

14
Nó không phải là hoàn toàn rõ ràng để tôi dựa trên câu trả lời này ... nếu bạn đang sử dụng API JavaScript, bạn muốn sử dụngFB.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
Có nơi nào đó một trang tham khảo mô tả các /metuyến đường? Tôi tiếp tục duyệt các trang trên Graph API và không thể tìm thấy nó ở bất cứ đâu :(
Radu Murzea

3
/ me locale = en_US & lĩnh vực = tên, email là cách duy nhất tôi có thể tìm ra để làm cho nó trở lại địa chỉ email, không thể tìm thấy bất kỳ tài liệu tham khảo khác để trực tuyến này?
Ashley

đây là tài liệu - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku

1
Đây là câu trả lời chính xác, mặc dù một lời giải thích đơn giản hơn có thể được tìm thấy ở đây: stackoverflow.com/questions/37349618/…
HoldOffHunger vào

cảm ơn bạn vì điều này .. không có gì khác hoạt động ngoại trừ điều này. bây giờ nó hoạt động tốt! :)
supersan

19

Mở base_facebook.php Thêm Access_token tại chức năng getLoginUrl()

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

và Sử dụng phạm vi cho phép Email

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

6

Để nhận được email người dùng, bạn phải đăng nhập người dùng bằng tài khoản Facebook của anh ta bằng emailquyền. Sử dụng SDK PHP của Facebook ( xem trên github ) như sau.

Đầu tiên hãy kiểm tra xem người dùng đã đăng nhập chưa:

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

Nếu không, bạn có thể hiển thị liên kết đăng nhập yêu cầu emailquyền:

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

Khi anh ấy đăng nhập, email có thể được tìm thấy trong $user_profilemảng.

Hy vọng rằng sẽ giúp!


6

Chỉ cần thêm khối mã này khi trả về trạng thái và bắt đầu chuyển đối tượng chuỗi truy vấn {}. Dành cho nhà phát triển JavaScript

Sau khi khởi tạo sdk của bạn.

bước 1: // lấy trạng thái đăng nhập

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

Thao tác này sẽ kiểm tra tải tài liệu và kiểm tra trạng thái đăng nhập của bạn nếu người dùng đã đăng nhập.

Sau đó, hàm checkLoginState được gọi và phản hồi được chuyển đến statusChangeCallback

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

Bước 2: Cho phép bạn nhận dữ liệu phản hồi từ trạng thái

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

Điều này cũng có userid đang được đặt thành biến, sau đó một hàm getUserInfo được gọi để tìm nạp thông tin người dùng bằng 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);
      }
    );
  }

Sau khi chuyển userid làm đối số, hàm sẽ tìm nạp tất cả thông tin liên quan đến userid đó . Lưu ý: trong trường hợp của tôi, tôi đang tìm kiếm email, vì để cho phép tôi chạy một chức năng chỉ có thể đăng nhập người dùng qua email.

// đăng nhập qua 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 !');
      }
    });
  }

Xin chào @Pang, bạn có thể kiểm tra ngay bây giờ, tôi nghĩ điều này có thể hữu ích. nhưng tốt hơn hết bạn vẫn có thể bình luận nhiều vấn đề hơn.
Delino

+ trạng thái anh hùng, chỉ dành cho '/' + userId + '/? fields = id, name, email' mà không được chỉ định trong tài liệu
therightstuff

5

Bạn có thể lấy địa chỉ email từ hồ sơ của người dùng đã đăng nhập. Đây là đoạn mã

<?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
Điều này không làm việc cho tôi. $user_profilekhông chứa email
zed Blackbeard,

3

Giả sử bạn đã yêu cầu quyền email khi người dùng đăng nhập từ ứng dụng của bạn và bạn có mã thông báo hợp lệ,

Với api tìm nạp, bạn chỉ có thể

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

kết quả sẽ là:

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

id vẫn sẽ được trả lại.

Bạn có thể thêm vào các trường truy vấn tham số nhiều thứ hơn, nhưng bạn cần quyền cho chúng nếu chúng không có trong hồ sơ công khai (tên là công khai).

?fields=name,email,user_birthday&token=

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


Yêu thích một câu trả lời không giả định việc sử dụng SDK không cần thiết.
Lilleman

1

https://graph.facebook.com/me

sẽ cung cấp cho bạn thông tin về người dùng hiện đang đăng nhập, nhưng bạn sẽ cần cung cấp mã thông báo oauth. Xem:

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


13
bạn không thể lấy nó nếu không có sự cho phép mở rộng.
greyger

hoặc không có quy định cụ thể các thông số lĩnh vực mà không được quy định trong tài liệu hướng dẫn '/ me / lĩnh vực = id, tên, email?'
therightstuff

1

Email trong hồ sơ có thể được lấy bằng quyền mở rộng nhưng tôi đoán không thể lấy email được sử dụng để đăng nhập fb. Trong ứng dụng của mình, tôi muốn hiển thị nhiều tài khoản fb của một người dùng trong một danh sách, tôi muốn hiển thị email đăng nhập của các tài khoản fb làm số nhận dạng duy nhất của các tài khoản tương ứng nhưng tôi không thể lấy nó ra khỏi fb, tất cả những gì tôi có là email chính trong hồ sơ người dùng nhưng trong trường hợp của tôi, email đăng nhập và email chính của tôi khác nhau.


0

Đảm bảo rằng ứng dụng Facebook của bạn đã được xuất bản. Để nhận dữ liệu cho email, public_profile và user_friends ứng dụng của bạn phải được cung cấp công khai.

Bạn có thể vô hiệu hóa nó sau này cho mục đích phát triển và vẫn nhận được trường email.



0

Đảm bảo chỉ định đầy đủ số phiên bản của API giống như "v2.11"và không"2.11"

Tôi không chắc nó mặc định là gì nếu điều này không chính xác, nhưng tôi đã gặp một số lỗi kỳ lạ khi cố gắng truy xuất email khi tôi bỏ lỡ v.


0

Đối với tôi, vấn đề với việc thu thập địa chỉ email của người dùng ở phía PHP (phương thức getGraphUser ()) là hành vi mặc định của nút được kết xuất trên facebook (ở phía WEBSIDE, được tạo bằng xfbml = 1) là gọi FB.login () với phạm vi KHÔNG bao gồm "email".

Điều đó có nghĩa là bạn PHẢI:

1) cuộc gọi

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

rõ ràng, tạo nút của riêng bạn để bắt đầu quá trình đăng nhập

HOẶC LÀ

2) thêm thuộc tính scope = "email" vào nút xfbml

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

để có thể thu thập địa chỉ email bên PHP.

Hy vọng nó giúp.


0

Đầu tiên, kích hoạt ứng dụng của bạn tại trung tâm Nhà phát triển Facebook . Các ứng dụng ở chế độ phát triển không được phép truy xuất trường e-mail.

Nếu người dùng chưa đăng nhập, bạn cần đăng nhập và chỉ định rằng ứng dụng / trang web của bạn sẽ cần trường e-mail.

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

Sau đó, sau khi đăng nhập hoặc nếu người dùng đã đăng nhập, hãy truy xuất e-mail bằng API Facebook, chỉ định email trường:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.