วิธีตรวจสอบว่าผู้ใช้ชอบหน้า Facebook หรือ URL ของฉันโดยใช้ API ของ Facebook


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ตัวเลือกสำหรับ Canvas ขั้นสูง Facebook จะส่ง$_REQUEST['signed_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
คำเตือน: อ่านแนวทางการส่งเสริมการขายของ Facebook ก่อนที่จะพยายาม "ละเมิด" เช่นนี้เช่นเพจสำหรับการเข้าร่วมการแข่งขัน "# 3 คุณต้องไม่ใช้คุณสมบัติหรือฟังก์ชันของ Facebook เป็นการลงทะเบียนหรือกลไกการเข้าร่วมโปรโมชั่นตัวอย่างเช่นการกดถูกใจเพจหรือเช็คอินสถานที่ไม่สามารถลงทะเบียนหรือป้อนผู้เข้าร่วมโปรโมชั่นโดยอัตโนมัติได้" - facebook.com/promotions_guidelines.php
Chris Jacob

1
ฉันไม่ได้รับคุณสมบัติหน้าจากวัตถุที่ส่งคืนวิธีนี้เป็นไปไม่ได้อีกต่อไปหรือ
Casey Flynn

17
@ คริส - แค่อยากจะชี้แจงคุณสามารถกำหนดเงื่อนไขการเข้าเพจที่ชอบก่อน การแสดงความชอบไม่สามารถเป็นกลไกในการเข้าร่วมได้ แต่คุณสามารถบังคับใช้ความชอบก่อนเข้าได้
Adam Pedley

4
@Adam - คำชี้แจงของคุณถูกต้อง Facebook อนุญาตให้แอป "Like Gate" เข้าถึงเนื้อหาได้ ตัวอย่างเช่น - อนุญาตให้ใช้: "ชอบเราเพื่อดูแบบฟอร์มการเข้าร่วมการแข่งขัน" และไม่อนุญาต: "ชอบเราและคุณจะเข้าร่วมการแข่งขันของเราโดยอัตโนมัติ"
Chris Jacob

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

สิ่งนั้นจะส่งคืนหนึ่งในสาม:

  • สตริงจริงสตริงเท็จ json
  • รูปแบบการตอบสนองของข้อผิดพลาดถ้าโทเค็น
  • หรือ page_id ไม่ถูกต้อง

ฉันเดาว่าวิธีเดียวที่ไม่ใช้โทเค็นในการบรรลุเป้าหมายนี้คือการโพสต์ Sign_request Jason Siffring ผู้ช่วยของฉันใช้ PHP SDK:

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

17

คุณสามารถทำได้ใน JavaScript เช่นนี้ (การสร้างจากคำตอบของ@ dwarfy สำหรับคำถามที่คล้ายกัน ):

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

มีการทำสำเนาโค้ดเล็กน้อยในนั้น แต่คุณได้รับแนวคิด สิ่งนี้จะปรากฏขึ้นในกล่องโต้ตอบการเข้าสู่ระบบในครั้งแรกที่ผู้ใช้เข้าชมเพจ (ซึ่งไม่เหมาะอย่างยิ่ง แต่ก็ใช้ได้ผล) ในการเยี่ยมชมครั้งต่อ ๆ ไปจะไม่มีอะไรปรากฏขึ้น


javascript 2.7 sdk ถูกยกเลิก
Kamal Kumar

สวัสดี @DINJAS ขอบคุณสำหรับคำตอบของคุณรหัสด้านบนใช้งานได้ดีสำหรับ Facebook มีลิงค์ไปยัง instagram, twitter และ linkdn หรือไม่
shivashankar m

@shivashankarm ฉันไม่รู้จริงๆ ฉันไม่ต้องทำอะไรแบบนี้เลยตั้งแต่ฉันโพสต์คำตอบนี้
dinjas

16

แม้ว่าโพสต์นี้จะอยู่ที่นี่มาระยะหนึ่งแล้ว แต่การแก้ปัญหาไม่ใช่ JS ที่บริสุทธิ์ แม้ว่าJasonจะตั้งข้อสังเกตว่าการขอสิทธิ์นั้นไม่เหมาะ แต่ฉันคิดว่ามันเป็นสิ่งที่ดีเนื่องจากผู้ใช้สามารถปฏิเสธได้อย่างชัดเจน ฉันยังคงโพสต์รหัสนี้แม้ว่า (เกือบ) สิ่งเดียวกันยังสามารถเห็นได้ในโพสต์อื่นโดย ifaour พิจารณารุ่นนี้เฉพาะ JS โดยไม่ต้องใส่ใจในรายละเอียดมากเกินไป

รหัสพื้นฐานค่อนข้างง่าย:

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ด้วย UserID ที่เหมาะสมของบุคคลอื่น (คุณอาจต้องแก้ไขการอนุญาตด้านล่างเพื่อดำเนินการเช่นนี้friends_likes) ดังที่ระบุไว้คุณต้องการมากกว่าสิทธิ์พื้นฐาน:

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

3

ฉันใช้ jquery เพื่อส่งข้อมูลเมื่อผู้ใช้กดปุ่ม like

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

หมายเหตุ: คุณสามารถใช้ข้อความอินพุตที่ซ่อนอยู่เพื่อรับรหัสของปุ่มของคุณในกรณีของฉันฉันนำมาจาก url เองใน "var fbl_id = h_fbl [4];" เนื่องจากมีตัวอย่าง id: url: http://mywebsite.com/post/22/some-tittle

ดังนั้นฉันจึงแยกวิเคราะห์ url เพื่อรับ id จากนั้นแทรกลงในฐานข้อมูลของฉันในไฟล์ like.php ด้วยวิธีนี้คุณไม่จำเป็นต้องขอสิทธิ์เพื่อทราบว่ามีใครกดปุ่ม like หรือไม่ แต่ถ้าคุณไม่อยากรู้ว่าใครกดปุ่มนี้จำเป็นต้องมีสิทธิ์


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