Facebook Graph API วิธีรับอีเมลของผู้ใช้


87

ฉันใช้ Graph API แต่หาวิธีรับที่อยู่อีเมลของผู้ใช้ที่ล็อกอินไม่ได้

ข้อมูลเบื้องต้นเกี่ยวกับกราฟระบุว่า "Graph API สามารถให้การเข้าถึงข้อมูลการลงทะเบียนบัญชีพื้นฐานทั้งหมดที่คุณมักจะขอในแบบฟอร์มการลงทะเบียนสำหรับไซต์ของคุณรวมถึงชื่อที่อยู่อีเมลรูปโปรไฟล์และวันเกิด"

ทั้งดีและดี แต่ฉันจะเข้าถึงข้อมูลนั้นได้อย่างไร

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

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

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

3
สิ่งที่ไม่var_dump($obj);เอาท์พุท?
Jayrox

คำตอบ:


78

วิธีเดียวที่จะได้รับที่อยู่อีเมลของผู้ใช้คือการขอสิทธิ์เพิ่มเติมในฟิลด์อีเมล ผู้ใช้ต้องอนุญาตให้คุณเห็นสิ่งนี้และคุณไม่สามารถรับที่อยู่อีเมลของเพื่อนของผู้ใช้

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

คุณสามารถทำได้หากคุณใช้ Facebook connect โดยส่ง scope = email ในสตริงรับสายของคุณไปยัง Auth Dialog

ฉันขอแนะนำให้ใช้SDKแทน file_get_contents เนื่องจากจะทำให้การตรวจสอบสิทธิ์Oauthง่ายขึ้นมาก


โอเคเปลี่ยน file_get_contents แต่ฉันสับสนเล็กน้อยว่าฉันจะส่งอีเมล req_perms = ไปที่ใด
kylex

10
ไม่เป็นไรฉันคิดออกแล้ว: $ facebook-> getLoginUrl (array ('req_perms' => 'email'))
kylex

14
ไม่ชัดเจนสำหรับฉันจากคำตอบนี้ ... ถ้าคุณใช้ JavaScript API คุณต้องการใช้FB.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
มีหน้าอ้างอิงที่อธิบาย/meเส้นทางหรือไม่ ฉันเรียกดูหน้าเว็บในGraph APIและไม่พบที่ใดเลย :(
Radu Murzea

3
/ me? locale = th_US & fields = name อีเมลเป็นวิธีเดียวที่ฉันจะหาได้เพื่อส่งคืนที่อยู่อีเมลไม่พบข้อมูลอ้างอิงอื่นใดในทางออนไลน์นี้
Ashley

นี่คือเอกสาร - developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
arku

1
นี่เป็นคำตอบที่ถูกต้องแม้ว่าจะมีคำอธิบายที่ง่ายกว่านี้: stackoverflow.com/questions/37349618/…
HoldOffHunger

ขอบคุณสำหรับสิ่งนี้ .. ไม่มีอะไรได้ผลนอกจากนี้ ตอนนี้ใช้งานได้ดี! :)
supersan

19

เปิด base_facebook.php เพิ่ม Access_token ที่ฟังก์ชัน getLoginUrl()

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

และใช้ขอบเขตการอนุญาตอีเมล

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

6

ในการรับอีเมลของผู้ใช้คุณต้องเข้าสู่ระบบผู้ใช้ด้วยบัญชี Facebook ของเขาโดยใช้emailสิทธิ์ ใช้สำหรับ Facebook PHP SDK ( ดูใน github ) ดังต่อไปนี้

ขั้นแรกให้ตรวจสอบว่าผู้ใช้เข้าสู่ระบบแล้วหรือไม่:

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

หากเขาไม่ใช่คุณสามารถแสดงลิงค์เข้าสู่ระบบเพื่อขอemailอนุญาต:

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

เมื่อเขาเข้าสู่ระบบอีเมลสามารถพบได้ใน$user_profileอาร์เรย์

หวังว่าจะช่วยได้!


6

เพียงเพิ่มบล็อกโค้ดเหล่านี้ในการส่งคืนสถานะและเริ่มส่งออบเจ็กต์สตริงการสืบค้น {} สำหรับ JavaScript devs

หลังจากเริ่มต้น sdk.

ขั้นตอนที่ 1: // รับสถานะการเข้าสู่ระบบ

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

การดำเนินการนี้จะตรวจสอบการโหลดเอกสารและรับสถานะการเข้าสู่ระบบของคุณว่าผู้ใช้เข้าสู่ระบบหรือไม่

จากนั้นฟังก์ชันcheckLoginStateจะถูกเรียกใช้และการตอบกลับจะถูกส่งไปยังstatusChangeCallback

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

ขั้นตอนที่ 2: ให้คุณรับข้อมูลการตอบกลับจากสถานะ

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

นอกจากนี้ยังมีหมายเลขผู้ใช้ซึ่งจะถูกตั้งค่าให้กับตัวแปรแล้วgetUserInfo func เรียกว่าสามารถดึงข้อมูลข้อมูลของผู้ใช้โดยใช้กราฟ 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);
      }
    );
  }

หลังจากส่งuseridเป็นอาร์กิวเมนต์แล้วฟังก์ชันจะดึงข้อมูลทั้งหมดที่เกี่ยวข้องกับuseridนั้น หมายเหตุ: ในกรณีของฉันฉันกำลังมองหาอีเมลเนื่องจากอนุญาตให้ฉันเรียกใช้ฟังก์ชันที่สามารถล็อกอินผู้ใช้ผ่านอีเมลเท่านั้น

// เข้าสู่ระบบทางอีเมล

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

+ สถานะพระเอกเพียงสำหรับ '/' + หมายเลขผู้ใช้ + '/ เขต id = ชื่ออีเมลได้หรือไม่' ซึ่งไม่ได้ระบุไว้ในเอกสาร
therightstuff

5

คุณสามารถดึงที่อยู่อีเมลจากโปรไฟล์ของผู้ใช้ที่ล็อกอิน นี่คือข้อมูลโค้ด

<?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
นี่ใช้ไม่ได้สำหรับฉัน $user_profileไม่มีอีเมล
zed Blackbeard

3

สมมติว่าคุณได้ขอสิทธิ์อีเมลเมื่อผู้ใช้เข้าสู่ระบบจากแอปของคุณและคุณมีโทเค็นที่ถูกต้อง

ด้วยAPI การดึงข้อมูลคุณสามารถทำได้

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

ผลลัพธ์จะเป็น:

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

id จะถูกส่งกลับอยู่ดี

คุณสามารถเพิ่มลงในฟิลด์ค้นหาพารามิเตอร์เพิ่มเติมได้ แต่คุณต้องมีสิทธิ์สำหรับฟิลด์เหล่านี้หากไม่ได้อยู่ในโปรไฟล์สาธารณะ (ชื่อเป็นแบบสาธารณะ)

?fields=name,email,user_birthday&token=

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


ชอบคำตอบที่ไม่ถือว่าใช้ SDK ที่ไม่จำเป็น
Lilleman

1

https://graph.facebook.com/me

จะให้ข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน แต่คุณจะต้องจัดหาโทเค็น oauth ดู:

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


13
คุณไม่สามารถรับได้หากไม่ได้รับอนุญาตเพิ่มเติม
grayger

หรือโดยไม่ได้ระบุพารามิเตอร์สาขาที่ไม่ได้ระบุไว้ในเอกสาร '/ ME / เขต id = ชื่ออีเมลได้หรือไม่'
therightstuff

1

อีเมลในโปรไฟล์สามารถรับได้โดยใช้การอนุญาตเพิ่มเติม แต่ฉันเดาว่าไม่สามารถรับอีเมลที่ใช้ในการเข้าสู่ระบบ fb ได้ ในแอปของฉันฉันต้องการแสดงบัญชี fb หลายบัญชีของผู้ใช้ในรายการฉันต้องการแสดงอีเมลสำหรับเข้าสู่ระบบของบัญชี fb เป็นตัวระบุเฉพาะของบัญชีที่เกี่ยวข้อง แต่ฉันไม่สามารถลบออกจาก fb ได้ทั้งหมดที่ฉันได้รับคือ อีเมลหลักในโปรไฟล์ผู้ใช้ แต่ในกรณีของฉันอีเมลสำหรับเข้าสู่ระบบและอีเมลหลักของฉันต่างกัน


1

ครั้งแรกที่เปิดใช้งานแอพลิเคชันที่ศูนย์ผู้พัฒนา Facebook ไม่อนุญาตให้แอปพลิเคชันในโหมดการพัฒนาดึงข้อมูลอีเมล

หากผู้ใช้ไม่ได้เข้าสู่ระบบคุณจะต้องเข้าสู่ระบบและระบุว่าแอปพลิเคชัน / ไซต์ของคุณจะต้องใช้ฟิลด์อีเมล

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

จากนั้นหลังจากเข้าสู่ระบบหรือหากผู้ใช้เข้าสู่ระบบแล้วให้ดึงอีเมลโดยใช้ Facebook API โดยระบุอีเมลฟิลด์:

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

0

ตรวจสอบให้แน่ใจว่ามีการเผยแพร่แอปพลิเคชัน Facebook ของคุณ ในการรับข้อมูลสำหรับอีเมล public_profile และ user_friends แอปของคุณจะต้องเปิดเผยต่อสาธารณะ

คุณสามารถปิดใช้งานได้ในภายหลังเพื่อวัตถุประสงค์ในการพัฒนาและยังคงได้รับฟิลด์อีเมล


0

เครื่องมือต่อไปนี้มีประโยชน์ในระหว่างการพัฒนา:

Access Token Debugger: วางโทเค็นการเข้าถึงเพื่อดูรายละเอียด

https://developers.facebook.com/tools/debug/accesstoken/

Graph API Explorer: ทดสอบคำขอไปยัง API กราฟหลังจากวางในโทเค็นการเข้าถึงของคุณ

https://developers.facebook.com/tools/explorer


0

ตรวจสอบให้แน่ใจว่าได้ระบุหมายเลขเวอร์ชันของ API อย่างครบถ้วนว่าเหมือน"v2.11"หรือไม่"2.11"

ฉันไม่แน่ใจว่าค่าเริ่มต้นเป็นอย่างไรหากสิ่งนี้ไม่ถูกต้อง แต่ฉันได้รับข้อผิดพลาดแปลก ๆ ที่พยายามดึงอีเมลเมื่อฉันพลาดไฟล์v.


0

สำหรับฉันปัญหาในการรวบรวมที่อยู่อีเมลของผู้ใช้ทางฝั่ง PHP (เมธอด getGraphUser ()) คือพฤติกรรมเริ่มต้นของปุ่มที่แสดงผล facebook (ที่ฝั่ง WEBSIDE ที่สร้างด้วย xfbml = 1) คือการเรียก FB.login () ด้วย ขอบเขตไม่รวมถึง "อีเมล"

นั่นหมายความว่าคุณต้อง:

1) โทร

FB.login (.... , {ขอบเขต: email})

อย่างชัดเจนการสร้างปุ่มของคุณเองเพื่อเริ่มกระบวนการเข้าสู่ระบบ

หรือ

2) เพิ่มขอบเขต = "email" แอตทริบิวต์ที่ปุ่ม xfbml

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

เพื่อให้สามารถรวบรวมที่อยู่อีเมลในฝั่ง PHP

หวังว่าจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.