webentwicklung-frage-antwort-db.com.de

So überprüfen Sie mithilfe der Facebook-API, ob einem Benutzer meine Facebook-Seite oder URL gefällt

Ich glaube, ich werde verrückt. Ich kann es nicht zum Laufen bringen.
Ich möchte nur überprüfen, ob einem Benutzer meine Seite mit Javascript in einer iFrame App gefallen hat.

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

Das gibt zurück: Falsch
Aber ich bin ein Fan meiner Seite, sollte sie also nicht wahr sein ?!

101
Patrik

Auch hier habe ich mir die Haare ausgerissen. Ihr Code funktioniert nur, wenn der Benutzer eine erweiterte Berechtigung für das erteilt hat, was nicht ideal ist.

Hier ist ein anderer Ansatz.

Kurz gesagt, wenn Sie das OAuth 2.0 für die erweiterte Canvas-Option sendet Facebook ein $_REQUEST['signed_request'] zusammen mit jeder angeforderten Seite in Ihrer Tab-App. Wenn Sie diese signed_request analysieren, können Sie einige Informationen über den Benutzer abrufen, einschließlich der Frage, ob ihm die Seite gefallen 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!";
    }
  }
100
Jason Siffring

Sie können (PHP) verwenden

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

Das wird eine von drei zurückgeben:

  • string true string false json
  • formatierte Antwort auf Fehler, wenn Token
  • oder page_id sind ungültig

Ich denke, der einzige Weg, dies zu erreichen, ist mit der signierten Anfrage, die Jason Siffring gerade gepostet hat. Mein Helfer mit PHP SDK:

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

Sie können dies in JavaScript wie folgt tun (Aufbau von @dwarfys 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>

Wo die Datei channel.html auf Ihrem Server nur die folgende Zeile enthält:

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

Es gibt ein wenig Code-Duplikation, aber Sie bekommen die Idee. Dies öffnet ein Anmeldedialogfeld, wenn der Benutzer die Seite zum ersten Mal besucht (was nicht gerade ideal ist, aber funktioniert). Bei späteren Besuchen sollte jedoch nichts auftauchen.

17
dinjas

Obwohl dieser Beitrag schon eine ganze Weile hier ist, handelt es sich bei den Lösungen nicht um reine JS-Lösungen. Obwohl Jason feststellte, dass das Anfordern von Berechtigungen nicht ideal ist, halte ich es für eine gute Sache, da der Benutzer es explizit ablehnen kann. Ich poste diesen Code immer noch, obwohl (fast) dasselbe auch in ein weiterer Beitrag von ifaour zu sehen ist. Betrachten Sie dies als die einzige JS-Version ohne allzu viel Liebe zum Detail.

Der Basiscode ist ziemlich 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 können Sie me durch die richtige Benutzer-ID einer anderen Person ersetzen (möglicherweise müssen Sie dazu die folgenden Berechtigungen ändern, z. B. friends_likes) Wie bereits erwähnt, benötigen Sie mehr als die Basisberechtigung:

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

ich benutze JQuery, um die Daten zu senden, wenn der Benutzer den Like-Button 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 Ihrer Schaltfläche abzurufen. In meinem Fall entnehme ich sie der URL selbst in "var fbl_id = h_fbl [4];" Weil es das id-Beispiel gibt: url: http://mywebsite.com/post/22/some-tittle

also analysiere ich 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 nach Berechtigungen fragen, um zu erfahren, ob jemand die Schaltfläche "Gefällt mir" drückt. Wenn Sie jedoch wissen möchten, wer darauf drückt, sind Berechtigungen erforderlich.

3
Agent_x