103 Stimmen

Wie kann ich mit der Facebook-API prüfen, ob einem Nutzer meine Facebook-Seite oder URL gefällt?

Ich glaube, ich werde verrückt. Ich kann es nicht zum Laufen bringen.
Ich möchte einfach überprüfen, ob ein Benutzer meine Seite mit Javascript in einer iFrame app.

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

Dies führt zurück: False
Aber ich bin ein Fan meiner Seite, also sollte es nicht wahr sein?!

100voto

Jason Siffring Punkte 1321

Ich habe mir darüber auch die Haare gerauft. Ihr Code funktioniert nur, wenn der Benutzer eine erweiterte Berechtigung dafür erteilt hat, was nicht ideal ist.

Hier ist ein anderer Ansatz.

Kurz gesagt, wenn Sie die OAuth 2.0 für die erweiterte Option Canvas, sendet Facebook eine $_REQUEST['signed_request'] zusammen mit jeder angeforderten Seite innerhalb Ihrer Registerkarten-App. Wenn Sie diese signed_request analysieren, können Sie einige Informationen über den Benutzer erhalten, z. B. ob er die Seite geliked hat oder nicht.

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

19voto

Tom Roggero Punkte 5388

Sie können verwenden (PHP)

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

Das Ergebnis ist eines von drei:

  • string true string false json
  • formatierte Antwort des Fehlers, wenn Token
  • oder page_id sind nicht gültig

Ich schätze, die einzige Möglichkeit, dies zu erreichen, ist die sign_request, die Jason Siffring gerade gepostet hat. Mein Helfer mit PHP SDK:

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

17voto

dinjas Punkte 2087

Sie können dies in JavaScript wie folgt tun (aufbauend auf @dwarfy's Antwort auf eine ähnliche Frage ):

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

In der Datei channel.html auf Ihrem Server steht nur die Zeile:

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

Es gibt eine kleine Code-Duplizierung, aber Sie verstehen die Idee. Wenn der Benutzer die Seite zum ersten Mal besucht, wird ein Anmeldedialog angezeigt (was nicht gerade ideal ist, aber funktioniert). Bei späteren Besuchen sollte jedoch nichts mehr angezeigt werden.

16voto

DrColossos Punkte 12136

Obwohl dieser Beitrag hier schon eine ganze Weile steht, sind die Lösungen nicht rein JS. Obwohl Jason Ich habe festgestellt, dass das Anfordern von Genehmigungen nicht ideal ist, aber ich halte es für eine gute Sache, da der Benutzer es ausdrücklich ablehnen kann. Ich poste diesen Code trotzdem, obwohl (fast) das Gleiche auch in anderer Beitrag von ifaour . Betrachten Sie dies die JS nur Version ohne zu viel Liebe zum Detail.

Der grundlegende Code ist recht einfach:

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

ALternativ ersetzen Sie me mit der richtigen UserID einer anderen Person (dazu müssen Sie eventuell die unten stehenden Berechtigungen ändern, wie friends_likes ) Wie bereits erwähnt, benötigen Sie mehr als nur die Grundgenehmigung:

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

3voto

Agent_x Punkte 84

Ich verwende Jquery, um die Daten zu senden, wenn der Benutzer die Gefällt mir-Taste drückt.

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

Hinweis: Sie können einen versteckten Eingabetext verwenden, um die ID Ihres Buttons zu erhalten. In meinem Fall entnehme ich sie der Url selbst in "var fbl_id=h_fbl[4];", weil dort das Beispiel für die ID steht: url: http://mywebsite.com/post/22/some-tittle

Ich analysiere also die URL, um die ID zu erhalten und füge sie dann in meine Datenbank in der like.php-Datei ein. Auf diese Weise müssen Sie nicht um Berechtigungen bitten, um zu wissen, ob jemand den Like-Button gedrückt hat, aber wenn Sie wissen wollen, wer ihn gedrückt hat, sind Berechtigungen erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X