101 votes

Comment vérifier si un utilisateur aime ma page Facebook ou son URL en utilisant l'API de Facebook

Je pense que je deviens fou. Je n'arrive pas à le faire marcher.
Je veux simplement vérifier si un utilisateur a aimé ma page avec JavaScript dans une application 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 :(');
        }
    }
);
 

Cela renvoie: Faux
Mais je suis fan de ma page, alors ça ne devrait pas être vrai?!

100voto

Jason Siffring Points 1151

J'ai déchiré mes cheveux sur celui-là aussi. Votre code ne fonctionne que si l'utilisateur a accordé une longue permission pour ce qui n'est pas idéal.

Voici une autre approche.

En un mot, si vous activez le "OAuth 2.0 pour la Toile" option avancée, Facebook enverra un $_REQUEST['signed_request'] avec chaque page demandée dans votre onglet application. Si vous analysez que signed_request vous pouvez obtenir des informations sur l'utilisateur, notamment s'ils ont aimé la page ou pas.

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

Vous pouvez utiliser (PHP)

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

Cela retournera l'un des trois:

  • string true string false json
  • réponse formatée d'erreur si jeton
  • ou page_id ne sont pas valides

Je suppose que le seul moyen non-token-token pour y parvenir est avec la requête signed_requen que Jason Siffring vient de poster. Mon assistant utilisant PHP SDK:

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

17voto

dinjas Points 824

Vous pouvez le faire en JavaScript comme (Construction de @dwarfy la réponse à une question similaire):

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

Où l'channel.html fichier sur votre serveur contient la ligne:

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

Il y a un peu de la duplication de code, mais vous obtenez l'idée. Cela fera apparaître une boîte de dialogue de connexion la première fois que l'utilisateur visite la page (ce qui n'est pas l'idéal, mais qui fonctionne). Lors de visites ultérieures rien ne devrait apparaître.

16voto

DrColossos Points 7903

Bien que ce post a été ici pendant un certain temps, les solutions ne sont pas pure JS. Si Jason a noté qu'en demandant des autorisations n'est pas l'idéal, je considère que c'est une bonne chose car l'utilisateur peut rejeter explicitement. Je poste quand même ce code, bien que (presque) la même chose peut également être vu dans un autre post par ifaour. Considérez ceci la JS seule version sans trop d'attention aux détails.

Le code de base est plutôt simple:

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

Sinon, remplacez - me avec le bon nom d'utilisateur de quelqu'un d'autre (vous devrez peut-être modifier les autorisations ci-dessous pour faire cela, comme friends_likes) Comme indiqué, vous avez besoin de plus que la base de l'autorisation:

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

3voto

Agent_x Points 43

j'utilise jquery pour envoyer les données lorsque l'utilisateur presse le bouton j'aime.

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

Remarque:vous pouvez utiliser certains secrets de saisie de texte pour obtenir l'id de votre bouton.dans mon cas, j'ai le prendre à partir de l'url elle-même dans "var fbl_id=h_fbl[4];" car il est l'exemple d'id: url: http://mywebsite.com/post/22/some-tittle

j'ai donc d'analyser l'url pour obtenir l'id, puis l'insérer à mon databse dans le like.php fichier. de cette façon, vous n'avez pas besoin de demander l'autorisation de savoir si on presse le bouton j'aime, mais si tu veux savoir qui le presse, des autorisations sont nécessaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X