Bagaimana cara memeriksa apakah pengguna menyukai Halaman Facebook atau URL saya menggunakan API Facebook

102

Saya pikir saya akan gila. Saya tidak bisa membuatnya bekerja.
Saya hanya ingin memeriksa apakah pengguna menyukai halaman saya dengan javascript di iFrameaplikasi.

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

Ini mengembalikan: Salah
Tapi saya penggemar halaman saya jadi bukankah seharusnya itu kembali benar ?!

Patrik
sumber

Jawaban:

101

Aku juga merobek rambutku yang ini. Kode Anda hanya berfungsi jika pengguna telah memberikan izin yang diperpanjang untuk hal yang tidak ideal.

Inilah pendekatan lain.

Singkatnya, jika Anda mengaktifkan opsi OAuth 2.0untuk Canvas Advanced, Facebook akan mengirimkan $_REQUEST['signed_request']semua halaman yang diminta dalam aplikasi tab Anda. Jika Anda mengurai yang signed_request itu Anda bisa mendapatkan beberapa info tentang pengguna termasuk apakah mereka menyukai halaman itu atau tidak.

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!";
    }
  }
Jason Siffring
sumber
12
Peringatan: Baca Panduan Promosi Facebook sebelum mencoba untuk "menyalahgunakan" halaman seperti ini untuk entri kompetisi. "# 3 Anda tidak boleh menggunakan fitur atau fungsi Facebook sebagai pendaftaran promosi atau mekanisme entri. Misalnya, tindakan menyukai Halaman atau check-in ke suatu Tempat tidak dapat secara otomatis mendaftar atau masuk ke peserta promosi." - facebook.com/promotions_guidelines.php
Chris Jacob
1
Saya sebenarnya tidak mendapatkan properti halaman dari objek yang dikembalikan apakah metode ini tidak lagi memungkinkan?
Casey Flynn
17
@Chris - hanya ingin klarifikasi saja, anda dapat mengkondisikan entri pada halaman yang disukai terlebih dahulu. Tindakan menyukai tidak bisa menjadi mekanisme masuk, tetapi Anda bisa memaksakan rasa suka sebelum masuk.
Adam Pedley
4
@Adam - klarifikasi Anda benar. Facebook mengizinkan aplikasi untuk "Suka Gerbang" mengakses konten. Misalnya - ini DIPERBOLEHKAN: "Sukai Kami untuk melihat formulir pendaftaran kompetisi". Dan ini TIDAK DIPERBOLEHKAN: "Sukai Kami dan Anda akan secara otomatis masuk ke dalam kompetisi kami".
Chris Jacob
3
Anda tidak memeriksa validitas signed_request. Ini adalah pendekatan yang berbahaya. Anda harus memeriksanya dengan rahasia aplikasi Anda. Periksa jawaban ini untuk informasi lebih lanjut
ifaour
19

Anda dapat menggunakan (PHP)

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

Itu akan mengembalikan salah satu dari tiga:

  • string true string false json
  • respons diformat dari kesalahan jika token
  • atau page_id tidak valid

Saya kira satu-satunya cara yang tidak menggunakan token untuk mencapai ini adalah dengan signed_request Jason Siffring yang baru saja diposting. Pembantu saya menggunakan PHP SDK:

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

Anda dapat melakukannya dalam JavaScript seperti ini (Membangun dari tanggapan @ dwarfy untuk pertanyaan serupa ):

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

Di mana file channel.html di server Anda hanya berisi baris:

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

Ada sedikit duplikasi kode di sana, tetapi Anda mengerti. Ini akan memunculkan dialog login pertama kali pengguna mengunjungi halaman (yang sebenarnya tidak ideal, tetapi berfungsi). Pada kunjungan berikutnya tidak ada yang harus muncul.

dinjas
sumber
javascript 2.7 sdk itu dibatalkan
Kamal Kumar
Hai @DINJAS Terima kasih atas jawaban Anda, kode di atas berfungsi dengan baik untuk facebook. apakah ada tautan ke instagram, twitter dan linkdn
shivashankar m
@shivashankank jujur ​​saya tidak tahu. Saya belum pernah melakukan hal seperti ini sejak saya memposting jawaban ini.
dinjas
16

Meskipun postingan ini sudah cukup lama ada di sini, solusinya bukanlah JS murni. Meskipun Jason mencatat bahwa meminta izin tidak ideal, saya menganggapnya hal yang baik karena pengguna dapat menolaknya secara eksplisit. Saya tetap memposting kode ini, meskipun (hampir) hal yang sama juga dapat dilihat di posting lain oleh ifaour . Anggap ini hanya versi JS tanpa terlalu banyak perhatian pada detail.

Kode dasarnya cukup sederhana:

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

Alternatifnya, ganti medengan UserID yang tepat milik orang lain (Anda mungkin perlu mengubah izin di bawah untuk melakukan ini, seperti friends_likes) Seperti disebutkan, Anda memerlukan lebih dari izin dasar:

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

saya menggunakan jquery untuk mengirim data ketika pengguna menekan tombol suka.

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

Catatan: Anda dapat menggunakan beberapa teks masukan tersembunyi untuk mendapatkan id dari tombol Anda. Dalam kasus saya, saya mengambilnya dari url itu sendiri di "var fbl_id = h_fbl [4];" karena ada contoh idnya: url: http://mywebsite.com/post/22/some-tittle

jadi saya mengurai url untuk mendapatkan id dan kemudian memasukkannya ke databse saya di file like.php. dengan cara ini Anda tidak perlu meminta izin untuk mengetahui jika ada orang yang menekan tombol suka, tetapi jika Anda ingin tahu siapa yang menekannya, izin diperlukan.

Agent_x
sumber
1
ini adalah satu-satunya cara jika mereka belum terhubung dengan aplikasi Anda
Kevin