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

102

Ich glaube, ich werde verrückt. Ich kann es nicht zum Laufen bringen.
Ich möchte einfach überprüfen, ob einem Benutzer meine Seite mit Javascript in einer iFrameApp 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 :(');
        }
    }
);

Dies kehrt zurück: Falsch
Aber ich bin ein Fan meiner Seite. Sollte sie nicht wahr sein?!

Patrik
quelle

Antworten:

101

Ich riss mir auch hier die Haare aus. 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 die OAuth 2.0erweiterte Option für Canvas aktivieren, sendet Facebook $_REQUEST['signed_request']zusammen mit jeder in Ihrer Tab-App angeforderten Seite eine Nachricht. Wenn Sie diese signierte_Anforderung analysieren, können Sie einige Informationen über den Benutzer erhalten, 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!";
    }
  }
Jason Siffring
quelle
12
Warnung: Lesen Sie die Facebook-Werberichtlinien, bevor Sie versuchen, diese z. B. ähnliche Seite für die Teilnahme am Wettbewerb zu "missbrauchen". "# 3 Sie dürfen Facebook-Features oder -Funktionen nicht als Registrierungs- oder Eingabemechanismus für eine Werbeaktion verwenden. Wenn Sie beispielsweise eine Seite mögen oder an einem Ort einchecken, kann sich ein Werbeteilnehmer nicht automatisch registrieren oder eingeben." - facebook.com/promotions_guidelines.php
Chris Jacob
1
Ich erhalte die Eigenschaft pages tatsächlich nicht von dem zurückgegebenen Objekt. Ist diese Methode nicht mehr möglich?
Casey Flynn
17
@Chris - wollte nur klarstellen, Sie können den Eintrag davon abhängig machen, dass Ihnen die Seite zuerst gefällt. Der Akt des Likings kann nicht der Eingabemechanismus sein, aber Sie können das Liken vor dem Betreten erzwingen.
Adam Pedley
4
@Adam - deine Klarstellung ist richtig. Facebook ermöglicht Apps den "Like Gate" -Zugriff auf Inhalte. Zum Beispiel - dies ist ERLAUBT: "Wie wir das Anmeldeformular für den Wettbewerb sehen". Und das ist NICHT ERLAUBT: "Wie wir werden Sie automatisch an unserem Wettbewerb teilnehmen".
Chris Jacob
3
Sie überprüfen nicht die Gültigkeit der signed_request. Dies ist ein gefährlicher Ansatz. Sie sollten es mit Ihrem Anwendungsgeheimnis vergleichen. Überprüfen Sie diese Antwort für weitere Informationen
ifaour
19

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 eines von drei zurückgeben:

  • string true string false json
  • formatierte Fehlerantwort beim Token
  • oder page_id sind ungültig

Ich denke, der einzige Weg, dies ohne Verwendung von Token zu erreichen, ist die gerade gepostete signierte Anfrage Jason Siffring. Mein Helfer mit PHP SDK:

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

Sie können dies in JavaScript wie folgt tun (Aufbauend auf der Antwort von @ dwarfy 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 Zeile enthält:

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

Es gibt eine kleine Codeduplizierung, 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.

Dinjas
quelle
Javascript 2.7 SDK es ist veraltet
Kamal Kumar
Hallo @DINJAS Danke für deine Antwort, der obige Code funktioniert gut für Facebook. Gibt es einen Link zu Instagram, Twitter und Linkdn
Shivashankar m
@shivashankarm Ich habe ehrlich gesagt keine Ahnung. Ich musste so etwas nicht tun, seit ich diese Antwort gepostet habe.
Dinjas
16

Obwohl dieser Beitrag schon eine ganze Weile hier ist, sind die Lösungen keine reinen JS. Obwohl Jason feststellte, dass das Anfordern von Berechtigungen nicht ideal ist, halte ich es für eine gute Sache, da der Benutzer dies explizit ablehnen kann. Ich poste diesen Code immer noch, obwohl (fast) dasselbe auch in einem anderen Beitrag von ifaour zu sehen ist . Betrachten Sie dies als die 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");
    }
});

Ersetzen Sie alternativ durch medie richtige Benutzer-ID einer anderen Person (möglicherweise müssen Sie die folgenden Berechtigungen ändern, um dies zu tun friends_likes). Wie bereits erwähnt, benötigen Sie mehr als die Grundberechtigung:

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

Ich benutze JQuery, um die Daten zu senden, wenn der Benutzer die Like-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 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 Datei like.php ein. Auf diese Weise müssen Sie nicht nach Berechtigungen fragen, um zu wissen, ob jemand die Schaltfläche "Gefällt mir" drückt. Wenn Sie jedoch wissen möchten, wer darauf drückt, sind Berechtigungen erforderlich.

Agent_x
quelle
1
Dies ist der einzige Weg, wenn sie nicht mit Ihrer Anwendung verbunden sind
Kevin