Bir kullanıcının Facebook API'sını kullanarak Facebook Sayfamı veya URL'mi beğenip beğenmediğini kontrol etme


102

Sanırım, çıldırıyorum. Çalışmasını sağlayamıyorum.
Bir kullanıcının bir iFrameuygulamada javascript ile sayfamı beğenip beğenmediğini kontrol etmek istiyorum .

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

Bu şunu döndürür: Yanlış
Ama sayfamın hayranıyım, bu yüzden doğru dönmemeli mi ?!


Yanıtlar:


101

Bunun için de saçımı yırttım. Kodunuz yalnızca, kullanıcı ideal olmayan şey için genişletilmiş bir izin verdiyse çalışır.

İşte başka bir yaklaşım.

Özetle, OAuth 2.0Canvas için gelişmiş seçeneğini açarsanız , Facebook, $_REQUEST['signed_request']sekme uygulamanızda istenen her sayfayla birlikte bir yol gönderir . Bu imzalı yeniden sorgulamayı ayrıştırırsanız, sayfayı beğenip beğenmedikleri de dahil olmak üzere kullanıcı hakkında bazı bilgiler alabilirsiniz.

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
Uyarı: Bu, örneğin yarışma girişi için beğenme sayfasını "kötüye kullanmadan" önce Facebook Promosyon Yönergelerini okuyun. "# 3 Facebook özelliklerini veya işlevlerini bir promosyonun kayıt veya giriş mekanizması olarak kullanmamalısınız. Örneğin, bir Sayfayı beğenme veya bir Yerde check-in yapma eylemi, bir promosyon katılımcısını otomatik olarak kaydedemez veya giremez." - facebook.com/promotions_guidelines.php
Chris Jacob,

1
Aslında döndürülen nesneden pages özelliğini alamıyorum, bu yöntem artık mümkün değil mi?
Casey Flynn

17
@Chris - sadece açıklığa kavuşturmak istedim, girişi önce sayfanın beğenisine şartlandırabilirsiniz. Sevme eylemi giriş mekanizması olamaz, ancak girmeden önce beğenmeyi uygulayabilirsiniz.
Adam Pedley

4
@Adam - açıklamanız doğru. Facebook, uygulamaların içeriğe "Kapıyı Beğenmesine" izin verir. Örneğin - buna İZİN VERİLİR: "Yarışma giriş formunu görmek için Bizim gibi". Ve buna İZİN VERİLMEZ: "Bizi Beğenin ve otomatik olarak yarışmamıza katılacaksınız".
Chris Jacob

3
Geçerliliğini kontrol etmiyorsunuz signed_request. Bu tehlikeli bir yaklaşımdır. Uygulama sırrınıza göre kontrol etmelisiniz. Daha fazla bilgi için bu yanıtı kontrol edin
ifaour

19

(PHP) kullanabilirsiniz

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

Bu, üçünden birini döndürür:

  • dize doğru dize yanlış json
  • belirteç ise biçimlendirilmiş hata yanıtı
  • veya page_id geçerli değil

Sanırım bunu kullanmanın tek kullanmama yolu, imzalı istek Jason Siffring'in az önce yayınladığı işarettir. PHP SDK kullanan yardımcım:

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

17

Bunu JavaScript'te şu şekilde yapabilirsiniz ( @ cüce'nin benzer bir soruya verdiği yanıttan yola çıkarak ):

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

Sunucunuzdaki channel.html dosyası yalnızca şu satırı içerir:

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

Orada küçük bir kod kopyası var, ama fikri anladınız. Bu, kullanıcı sayfayı ilk kez ziyaret ettiğinde bir oturum açma iletişim kutusu açar (bu tam olarak ideal değildir, ancak işe yarar). Sonraki ziyaretlerde yine de hiçbir şey açılmamalıdır.


javascript 2.7 sdk kullanımdan kaldırıldı
Kamal Kumar

Merhaba @DINJAS Cevabınız için teşekkürler, yukarıdaki kod facebook için iyi çalışıyor. instagram, twitter ve linkdn için herhangi bir bağlantı var mı
shivashankar m

@shivashankarm Gerçekten hiçbir fikrim yok. Bu cevabı yayınladığımdan beri böyle bir şey yapmak zorunda kalmadım.
dinjas

16

Bu gönderi uzun süredir burada olmasına rağmen, çözümler saf JS değil. Gerçi Jason izinleri talep eden ideal olmadığını kaydetti, ben kullanıcı açıkça reddedebilirsiniz beri iyi bir şey düşünün. Yine de bu kodu gönderiyorum , ancak (neredeyse) aynı şey başka bir gönderide ifaour tarafından da görülebilir. . Bunu ayrıntılara çok fazla dikkat etmeden yalnızca JS sürümü olarak düşünün.

Temel kod oldukça basittir:

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

Alternatif olarak, mebaşka birinin uygun Kullanıcı Kimliği ile değiştirin (bunu yapmak için aşağıdaki izinleri değiştirmeniz gerekebilir friends_likes) Belirtildiği gibi, temel izninden daha fazlasına ihtiyacınız var:

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

3

Kullanıcı beğen düğmesine bastığında verileri göndermek için jquery kullanıyorum.

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

Not: düğmenizin kimliğini almak için bazı gizli giriş metinleri kullanabilirsiniz. Benim durumumda onu "var fbl_id = h_fbl [4]" içindeki url’nin kendisinden alıyorum; çünkü id örneği var: url: http://mywebsite.com/post/22/some-tittle

bu yüzden kimliği almak için url'yi ayrıştırıyorum ve sonra like.php dosyasındaki veritabanıma ekliyorum. bu şekilde, beğen düğmesine basıldığında bilmek için izin istemenize gerek kalmaz, ancak buna kimin bastığını bilmek isterseniz izinler gerekir.


1
başvurunuzla bağlantı
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.