फेसबुक ग्राफ एपीआई, उपयोगकर्ताओं को ईमेल कैसे प्राप्त करें?


86

मैं ग्राफ़ एपीआई का उपयोग कर रहा हूं, लेकिन मैं यह पता नहीं लगा सकता कि लॉग इन करने वाले उपयोगकर्ताओं को ईमेल पता कैसे दिया जाए।

ग्राफ़ के परिचय में कहा गया है "ग्राफ़ एपीआई उन सभी मूल खाता पंजीकरण डेटा तक पहुँच प्रदान कर सकता है, जिन्हें आप आम तौर पर अपनी साइट के लिए साइन-अप फ़ॉर्म में नाम, ईमेल पता, प्रोफ़ाइल चित्र और जन्मदिन" के लिए अनुरोध करेंगे।

सभी अच्छी तरह से और अच्छा है, लेकिन मैं उस जानकारी का उपयोग कैसे करूं?

अभी तक मेरे पास इतना ही है:

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

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

3
var_dump($obj);आउटपुट क्या है ?
Jayrox

जवाबों:


76

उपयोगकर्ताओं को ई-मेल पता प्राप्त करने का एकमात्र तरीका ईमेल फ़ील्ड पर विस्तारित अनुमतियों का अनुरोध करना है। उपयोगकर्ता को आपको यह देखने की अनुमति देनी चाहिए और आप उपयोगकर्ता के मित्रों के ई-मेल पते प्राप्त नहीं कर सकते।

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

यह आप तब कर सकते हैं जब आप अपने कॉल के गेट स्ट्रिंग में ई-मेल डायलॉग में स्कोप = ईमेल पास करके फेसबुक कनेक्ट का उपयोग कर रहे हैं।

मैं file_get_contents के बजाय SDK का उपयोग करने की सलाह दूंगा क्योंकि यह Oauth प्रमाणीकरण करने के लिए बहुत आसान बनाता है ।


ठीक है, बदल दिया file_get_contents। लेकिन मैं थोड़ा उलझन में हूं कि मैं req_perms = ईमेल कहां से पास करूंगा।
18

10
कोई बात नहीं, मैंने यह पता लगाया: $ facebook-> getLoginUrl (सरणी ('req_perms' => 'ईमेल'))
kylex

14
इस उत्तर के आधार पर यह मेरे लिए पूरी तरह से स्पष्ट नहीं था ... यदि आप जावास्क्रिप्ट एपीआई का उपयोग कर रहे हैं, तो आप उपयोग करना चाहते हैं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मार्ग का वर्णन करने वाला एक संदर्भ पृष्ठ है ? मैं ग्राफ़ एपीआई पर पृष्ठों को ब्राउज़ करता रहता हूं और इसे कहीं भी नहीं पा सकता :(
राडू मुरझिया

3
/ me? locale = en_US & फ़ील्ड्स = नाम, ईमेल ही एकमात्र तरीका था जिससे मैं ईमेल पता वापस करने के लिए इसे प्राप्त कर सका, इस ऑनलाइन के लिए कोई अन्य संदर्भ नहीं मिल सका
एशले

यहाँ डॉक्स हैं - Developers.facebook.com/docs/graph-api/reference/user @RaduMurzea
अर्कू

1
यह सही उत्तर है, हालांकि एक सरल व्याख्या यहां मिल सकती है: stackoverflow.com/questions/37349618/…
होल्डऑफहंगर

इसके लिए धन्यवाद .. इसके अलावा और कुछ काम नहीं किया। अब यह ठीक काम कर रहा है! :)
सुपरसन

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

उपयोगकर्ता ईमेल प्राप्त करने के लिए, आपको 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

स्टेटस रिटर्न पर बस इन कोड ब्लॉक को जोड़ें, और क्वेरी स्ट्रिंग ऑब्जेक्ट {} को पास करना शुरू करें। जावास्क्रिप्ट देवों के लिए

अपने एसडीके को इनिशियलाइज़ करने के बाद।

चरण 1: // लॉगिन स्थिति प्राप्त करें

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

यह दस्तावेज़ लोड पर जाँच करेगा और यदि उपयोगकर्ता लॉग इन कर चुका है तो अपनी लॉगिन स्थिति जाँच लें।

तब फ़ंक्शन checkLoginState को कॉल किया जाता है, और प्रतिक्रिया पास है स्थिति ChangeCallback

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 को ग्राफ-एपीआई का उपयोग करके उपयोगकर्ता जानकारी प्राप्त करने के लिए कहा जाता है।

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

उपयोगकर्ता को एक तर्क के रूप में पारित करने के बाद , फ़ंक्शन तब उस उपयोगकर्ता से संबंधित सभी जानकारी प्राप्त करता है । नोट: मेरे मामले में मैं ईमेल की तलाश कर रहा था, क्योंकि मुझे एक फ़ंक्शन चलाने की अनुमति थी जो केवल ईमेल के माध्यम से उपयोगकर्ता को लॉग इन कर सकता है।

// ईमेल के माध्यम से लॉगिन करें

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

नमस्ते @Pang, अब आप देख सकते हैं, मुझे लगता है कि यह मदद कर सकता है। लेकिन बेहतर है कि आप अभी भी अधिक मुद्दों पर टिप्पणी कर सकते हैं।
डेलिनो

+ नायक का दर्जा, बस के लिए '/' + userId + '/ क्षेत्रों = आईडी, नाम, ईमेल?' जो दस्तावेज में निर्दिष्ट नहीं है
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

यह मानकर कि जब उपयोगकर्ता आपके ऐप से लॉग इन करता है और आपके पास एक मान्य टोकन है, तो आपने ईमेल की अनुमति का अनुरोध किया है,

लाने के साथ आप सिर्फ कर सकते हैं

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

आईडी वैसे भी लौटा दी जाएगी।

आप फ़ील्ड क्वेरी को अधिक सामान में जोड़ सकते हैं, लेकिन आपको उनके लिए अनुमतियाँ चाहिए अगर वे सार्वजनिक प्रोफ़ाइल पर नहीं हैं (नाम सार्वजनिक है)।

?fields=name,email,user_birthday&token=

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


ऐसे उत्तर से प्यार करें जो SDK के उपयोग को नहीं मानता है जिसकी आवश्यकता नहीं है।
लिलमैन

1

https://graph.facebook.com/me

आपको वर्तमान में लॉग-इन किए गए उपयोगकर्ता के बारे में जानकारी देगा, लेकिन आपको एक ऊहुट टोकन की आपूर्ति करने की आवश्यकता होगी। देख:

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


13
आप इसे बिना विस्तारित अनुमति के प्राप्त नहीं कर सकते।
ग्रेगर

या क्षेत्रों पैरामीटर निर्दिष्ट किए बिना जो दस्तावेज में निर्दिष्ट नहीं है '/ मुझे / क्षेत्रों = आईडी, नाम, ईमेल?'
therightstuff

1

प्रोफाइल में ईमेल को विस्तारित अनुमति का उपयोग करके प्राप्त किया जा सकता है, लेकिन मुझे लगता है कि ईमेल को एफबी लॉगिन करने के लिए उपयोग करना संभव नहीं है। मेरे ऐप में मैं एक सूची में उपयोगकर्ता के mulitple fb खातों को प्रदर्शित करना चाहता था, मैं संबंधित खातों के विशिष्ट पहचानकर्ता के रूप में fb खातों के लॉगिन ईमेल दिखाना चाहता था, लेकिन मैं इसे fb से प्राप्त नहीं कर सका, सब मुझे मिल गया था उपयोगकर्ता प्रोफ़ाइल में प्राथमिक ईमेल लेकिन मेरे मामले में मेरा लॉगिन ईमेल और मेरा प्राथमिक ईमेल अलग हैं।


0

सुनिश्चित करें कि आपका फेसबुक एप्लिकेशन प्रकाशित है। ईमेल के लिए डेटा प्राप्त करने के लिए, public_profile और user_friends आपका ऐप सार्वजनिक करने के लिए उपलब्ध कराया जाना चाहिए।

आप इसे बाद में विकास के उद्देश्यों के लिए अक्षम कर सकते हैं और फिर भी ईमेल क्षेत्र प्राप्त कर सकते हैं।


0

विकास के दौरान निम्नलिखित उपकरण उपयोगी हो सकते हैं:

पहुँच टोकन डिबगर: विवरण के लिए एक पहुँच टोकन में चिपकाएँ

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

ग्राफ एपीआई एक्सप्लोरर: अपने पहुंच टोकन में चिपकाने के बाद ग्राफ एपीआई के लिए परीक्षण अनुरोध

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 (...., {स्कोप: ईमेल})

प्रकट रूप से, लॉगिन प्रक्रिया शुरू करने के लिए अपना खुद का बटन बनाना

या

2) xfbml बटन में गुंजाइश = "ईमेल" विशेषता जोड़ें

<div class = "fb-login-button" data-size = "बड़ा" data-button-type = "Continue_wit" बटन-
लेआउट = "राउंडेड" डेटा-ऑटो-लॉगआउट-लिंक = "गलत" डेटा-उपयोग-जारी-जैसा = "सही" डेटा-
चौड़ाई = "1000px" गुंजाइश = "ईमेल"> </ div>

PHP ओर ईमेल पता एकत्र करने में सक्षम होने के लिए।

आशा करता हूँ की ये काम करेगा।


0

सबसे पहले, फेसबुक डेवलपर केंद्र पर अपने आवेदन को सक्रिय करें । विकास मोड में अनुप्रयोगों को ई-मेल फ़ील्ड को पुनः प्राप्त करने की अनुमति नहीं है।

यदि उपयोगकर्ता लॉग इन नहीं है, तो आपको लॉगिन करने और निर्दिष्ट करने की आवश्यकता है कि आपके आवेदन / साइट को ई-मेल फ़ील्ड की आवश्यकता होगी।

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

फिर, लॉगिन के बाद, या यदि उपयोगकर्ता पहले से ही लॉग इन है, तो फेसबुक एपीआई का उपयोग करके ई-मेल प्राप्त करें, फ़ील्ड ईमेल निर्दिष्ट करें:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.