फेसबुक के एपीआई का उपयोग करके कोई उपयोगकर्ता मेरे फेसबुक पेज या यूआरएल को पसंद करता है या नहीं, इसकी जांच कैसे करें


102

मुझे लगता है मुझे पागल हो जाना है। मैं इसे काम नहीं कर सकता।
मैं बस यह जांचना चाहता हूं कि किसी iFrameऐप में किसी यूजर ने मेरे पेज को जावास्क्रिप्ट के साथ पसंद किया है या नहीं ।

FB.api({
    method:     "pages.isFan",
    page_id:        my_page_id,
},  function(response) {
        console.log(response);
        if(response){
            alert('You Likey');
        } else {
            alert('You not Likey :(');
        }
    }
);

यह रिटर्न: गलत
लेकिन मैं अपने पेज का प्रशंसक हूं इसलिए इसे वापस नहीं लौटना चाहिए?


जवाबों:


101

मैंने इस पर भी अपने बाल उखाड़ दिए। आपका कोड केवल तभी काम करता है जब उपयोगकर्ता ने उसके लिए एक विस्तारित अनुमति दी हो जो आदर्श नहीं है।

यहाँ एक और दृष्टिकोण है।

संक्षेप में, यदि आप OAuth 2.0कैनवस उन्नत विकल्प के लिए चालू करते हैं, तो फेसबुक $_REQUEST['signed_request']आपके टैब ऐप के भीतर अनुरोध किए गए प्रत्येक पृष्ठ के साथ भेज देगा । यदि आप उस हस्ताक्षर किए गए_प्रेसेज़ को पार्स करते हैं, तो आप उपयोगकर्ता के बारे में कुछ जानकारी प्राप्त कर सकते हैं, जिसमें उन्हें पृष्ठ पसंद है या नहीं।

function parsePageSignedRequest() {
    if (isset($_REQUEST['signed_request'])) {
      $encoded_sig = null;
      $payload = null;
      list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
      $sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
      $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
      return $data;
    }
    return false;
  }
  if($signed_request = parsePageSignedRequest()) {
    if($signed_request->page->liked) {
      echo "This content is for Fans only!";
    } else {
      echo "Please click on the Like button to view this tab!";
    }
  }

12
चेतावनी: प्रतियोगिता के प्रवेश के लिए पृष्ठ जैसे "दुरुपयोग" की कोशिश करने से पहले फेसबुक प्रचार संबंधी दिशानिर्देश पढ़ें। "# 3 आपको प्रचार या पंजीकरण या प्रविष्टि तंत्र के रूप में फेसबुक सुविधाओं या कार्यक्षमता का उपयोग नहीं करना चाहिए। उदाहरण के लिए, किसी पृष्ठ को पसंद करने या किसी स्थान पर जांचने का कार्य स्वचालित रूप से पंजीकरण प्रतिभागी को पंजीकृत या दर्ज नहीं कर सकता है।" - facebook.com/promotions_guidelines.php
क्रिस जैकब

1
मैं वास्तव में वापस आ गई वस्तु से पृष्ठों की संपत्ति नहीं प्राप्त कर रहा हूं क्या यह विधि अब संभव नहीं है?
केसी फ्लिन

17
@ क्रिस - बस स्पष्ट करना चाहते थे, आप पहले पेज को पसंद करने पर प्रवेश की शर्त लगा सकते हैं। पसंद करने का कार्य प्रवेश तंत्र नहीं हो सकता है, लेकिन आप प्रवेश करने से पहले पसंद को लागू कर सकते हैं।
एडम पेडले

4
@ अदम - आपका स्पष्टीकरण सही है। फेसबुक ऐप्स को "लाइक गेट" कंटेंट तक पहुंच की अनुमति देता है। उदाहरण के लिए - यह अनुमति है: "प्रतियोगिता प्रविष्टि फॉर्म को देखने के लिए हमें पसंद करें"। और यह अनुमति नहीं है: "हमें पसंद है और आप स्वचालित रूप से हमारी प्रतियोगिता में प्रवेश करेंगे"।
क्रिस जैकब

3
आप की वैधता की जाँच नहीं कर रहे हैं signed_request। यह एक खतरनाक दृष्टिकोण है। आपको इसे अपने आवेदन के रहस्य के खिलाफ जांचना चाहिए। अधिक जानकारी के लिए इस उत्तर को जांचें
ifaour

19

आप (PHP) का उपयोग कर सकते हैं

$isFan = file_get_contents("https://api.facebook.com/method/pages.isFan?format=json&access_token=" . USER_TOKEN . "&page_id=" . FB_FANPAGE_ID);

वह तीन में से एक लौटेगा:

  • string true string झूठी जान
  • यदि टोकन में त्रुटि की स्वरूपित प्रतिक्रिया
  • या page_id मान्य नहीं हैं

मुझे लगता है कि इसे प्राप्त करने का एकमात्र एकमात्र उपयोग करने वाला टोकन नहीं है, यह सिर्फ पोस्ट किए गए हस्ताक्षर किए गए जेसन सिफ्रिंग के साथ है। PHP SDK का उपयोग करने वाला मेरा सहायक:

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}

17

आप इसे जावास्क्रिप्ट में ऐसा कर सकते हैं ( एक समान प्रश्न के लिए @ बौने की प्रतिक्रिया का निर्माण ):

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <style type="text/css">
      div#container_notlike, div#container_like {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'YOUR_APP_ID', // App ID
          channelUrl : 'http(s)://YOUR_APP_DOMAIN/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        FB.getLoginStatus(function(response) {
          var page_id = "YOUR_PAGE_ID";
          if (response && response.authResponse) {
            var user_id = response.authResponse.userID;
            var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
            FB.Data.query(fql_query).wait(function(rows) {
              if (rows.length == 1 && rows[0].uid == user_id) {
                console.log("LIKE");
                $('#container_like').show();
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            });
          } else {
            FB.login(function(response) {
              if (response && response.authResponse) {
                var user_id = response.authResponse.userID;
                var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
                FB.Data.query(fql_query).wait(function(rows) {
                  if (rows.length == 1 && rows[0].uid == user_id) {
                    console.log("LIKE");
                    $('#container_like').show();
                  } else {
                    console.log("NO LIKEY");
                    $('#container_notlike').show();
                  }
                });
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            }, {scope: 'user_likes'});
          }
        });
      };

      // Load the SDK Asynchronously
      (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
      }(document));
    </script>

    <div id="container_notlike">
      YOU DON'T LIKE ME :(
    </div>

    <div id="container_like">
      YOU LIKE ME :)
    </div>

  </body>
</html>

जहाँ आपके सर्वर पर channel.html फ़ाइल में केवल पंक्ति है:

 <script src="//connect.facebook.net/en_US/all.js"></script>

वहाँ थोड़ा कोड दोहराव है, लेकिन आप विचार प्राप्त करते हैं। यह उपयोगकर्ता द्वारा पृष्ठ पर जाने (जो बिल्कुल आदर्श नहीं है, लेकिन काम करता है) पर पहली बार एक लॉगिन संवाद पॉप अप करेगा। बाद की यात्राओं पर कुछ भी नहीं करना चाहिए।


जावास्क्रिप्ट २. it sdk यह सही है
कमल कुमार

हाय @DINJAS आपके उत्तर के लिए धन्यवाद उपरोक्त कोड फेसबुक के लिए ठीक काम कर रहा है। क्या इंस्टाग्राम, ट्विटर और लिंकडेन के लिए कोई लिंक है
शिवशंकर मी

@ शिवशंकरम I का ईमानदारी से कोई पता नहीं है। जब से मैंने यह उत्तर पोस्ट किया है मुझे ऐसा कुछ नहीं करना पड़ा।
दिनजा

16

हालांकि यह पद यहां काफी समय से है, लेकिन समाधान शुद्ध जेएस नहीं हैं। हालांकि जेसन ने कहा कि अनुमति का अनुरोध करना आदर्श नहीं है, मैं इसे एक अच्छी बात मानता हूं क्योंकि उपयोगकर्ता इसे स्पष्ट रूप से अस्वीकार कर सकता है। मैं अभी भी इस कोड को पोस्ट करता हूं, हालांकि (लगभग) एक ही चीज को इफोर द्वारा किसी अन्य पोस्ट में भी देखा जा सकता है । विस्तार पर बहुत अधिक ध्यान दिए बिना केवल जेएस संस्करण पर विचार करें।

मूल कोड बल्कि सरल है:

FB.api("me/likes/SOME_ID", function(response) {
    if ( response.data.length === 1 ) { //there should only be a single value inside "data"
        console.log('You like it');
    } else {
        console.log("You don't like it");
    }
});

बाह्य रूप से, meकिसी अन्य व्यक्ति के उचित उपयोगकर्ता नाम के साथ प्रतिस्थापित करें (आपको ऐसा करने के लिए नीचे दी गई अनुमतियों को बदलने की आवश्यकता हो सकती है, जैसे friends_likes) जैसा कि उल्लेख किया गया है, आपको मूल अनुमति से अधिक की आवश्यकता है:

FB.login(function(response) {
    //do whatever you need to do after a (un)successfull login         
}, { scope: 'user_likes' });

3

जब उपयोगकर्ता उपयोगकर्ता जैसा बटन दबाता है तो मैं डेटा भेजने के लिए jquery का उपयोग करता हूं।

<script>
  window.fbAsyncInit = function() {
    FB.init({appId: 'xxxxxxxxxxxxx', status: true, cookie: true,
             xfbml: true});

                 FB.Event.subscribe('edge.create', function(href, widget) {
$(document).ready(function() { 

var h_fbl=href.split("/");
var fbl_id= h_fbl[4]; 


 $.post("http://xxxxxx.com/inc/like.php",{ idfb:fbl_id,rand:Math.random() } )

}) });
  };

</script>

नोट: आप अपने बटन की आईडी प्राप्त करने के लिए कुछ छिपे हुए इनपुट टेक्स्ट का उपयोग कर सकते हैं। मेरा मामला मैं इसे "var fbl_id = h_fbl [4];" में url से ही लेता हूं। इस कारण से आईडी का उदाहरण है: url: http://mywebsite.com/post/22/some-tittle

इसलिए मैं आईडी प्राप्त करने के लिए यूआरएल को पार्स करता हूं और फिर उसे मेरे डेटाबेस में डाल देता हूं जैसे कि। php फ़ाइल। इस तरह से आपको यह जानने के लिए अनुमतियों की आवश्यकता नहीं है कि क्या कोई एक जैसा बटन दबाता है, लेकिन यदि आप यह जानना चाहते हैं कि कौन इसे दबाता है, तो अनुमतियों की आवश्यकता होती है।


1
यह एकमात्र तरीका है यदि वे आपके आवेदन से जुड़े नहीं हैं
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.