Facebook Facebook ' s API-jak sprawdzić, czy użytkownik lubi moją stronę lub adres URL na Facebooku

Chyba wariuję. Nie mogę go uruchomić.
Po prostu chcę sprawdzić, czy użytkownikowi spodobała się moja strona z javascript w aplikacji 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 :(');
        }
    }
);

To zwraca: False
Ale jestem fanem mojej strony, więc czy nie powinna ona wrócić prawda?!

Author: Igy, 2011-02-23

5 answers

Nad tym też zerwałam włosy. Twój kod działa tylko wtedy, gdy użytkownik udzielił rozszerzonej zgody na to, co nie jest idealne.

Oto inne podejście.

W skrócie, jeśli włączysz opcję OAuth 2.0 dla Canvas advanced, Facebook wyśle $_REQUEST['signed_request'] wraz z każdą stroną żądaną w aplikacji tab. Jeśli przeanalizujesz to signed_request, możesz uzyskać pewne informacje o użytkowniku, w tym, czy strona mu się spodobała, czy nie.

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!";
    }
  }
 100
Author: Jason Siffring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 22:33:06

Możesz użyć (PHP)

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

To zwróci jeden z trzech:

  • string true string false json
  • sformatowana odpowiedź błędu jeśli token
  • or page_id are not valid

Myślę, że jedynym sposobem, aby to osiągnąć, jest użycie signed_request Jason Siffring, który właśnie opublikował. Mój helper korzystający z PHP SDK:

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}
 19
Author: Tom Roggero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-04 15:50:58

Można to zrobić w JavaScript tak (budując z odpowiedź @ krasnoludka na podobne pytanie):

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

Gdzie kanał.plik html na twoim serwerze zawiera tylko linię:

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

Jest tam trochę duplikacji kodu, ale masz pomysł. Spowoduje to wyświetlenie okna dialogowego logowania przy pierwszej wizycie użytkownika na stronie (co nie jest idealne, ale działa). Przy kolejnych wizytach nic nie powinno się jednak pojawiać.

 17
Author: dinjas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:14

Choć ten post jest tutaj od dłuższego czasu, rozwiązania nie są czyste JS. Chociaż Jason zauważył, że żądanie uprawnień nie jest idealne, uważam to za dobrą rzecz, ponieważ użytkownik może je wyraźnie odrzucić. Nadal zamieszczam ten kod, choć (prawie) to samo widać również w innym poście ifaour . Rozważ to tylko wersja JS bez zbytniej dbałości o szczegóły.

Podstawowy kod jest dość prosty:

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

Alternatywnie zastąp me z odpowiednim identyfikatorem użytkownika kogoś innego (być może będziesz musiał zmienić poniższe uprawnienia, aby to zrobić, jak friends_likes), Jak wspomniano, Potrzebujesz więcej niż podstawowego uprawnienia:

FB.login(function(response) {
    //do whatever you need to do after a (un)successfull login         
}, { scope: 'user_likes' });
 16
Author: DrColossos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:01

Używam jquery do wysyłania danych, gdy użytkownik naciśnie przycisk Lubię to.

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

Uwaga: możesz użyć ukrytego tekstu wejściowego, aby uzyskać identyfikator twojego button.in mój przypadek biorę go z samego adresu url w "var fbl_id=h_fbl[4];" ponieważ jest przykład id: url: http://mywebsite.com/post/22/some-tittle

Więc analizuję adres url, aby uzyskać identyfikator, a następnie wstawiam go do mojej bazy danych w podobny sposób.plik php. w ten sposób nie musisz pytać o uprawnienia, aby wiedzieć, czy ktoś naciska jak przycisk, ale jeśli chcesz wiedzieć, kto go naciska, potrzebne są uprawnienia.

 3
Author: Agent_x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-27 23:26:51