web-dev-qa-db-fra.com

Comment vérifier si un utilisateur aime ma page ou mon URL Facebook à l'aide de 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 retourne: False
Mais je suis fan de ma page, elle ne devrait donc pas redevenir vraie?!

101
Patrik

Je me suis aussi déchiré les cheveux. Votre code ne fonctionne que si l'utilisateur a accordé une autorisation étendue pour ce qui n'est pas idéal.

Voici une autre approche.

En bref, si vous allumez le OAuth 2.0 pour l'option avancée Canvas, Facebook enverra un $_REQUEST['signed_request'] avec chaque page demandée dans votre application à onglet. Si vous analysez cette demande signée, vous pouvez obtenir des informations sur l'utilisateur, notamment s'il a aimé la page ou non.

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

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 renverra l'un des trois:

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

Je suppose que la seule façon de ne pas utiliser de jetons pour y parvenir est avec la demande de signature signée par Jason Siffring. Mon assistant utilisant PHP SDK:

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

Vous pouvez le faire en JavaScript comme ça (construction de réponse de @ dwarfy à 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ù le fichier channel.html sur votre serveur ne contient que la ligne:

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

Il y a un peu de duplication de code là-dedans, mais vous voyez l'idée. Cela ouvrira une boîte de dialogue de connexion la première fois que l'utilisateur visite la page (ce qui n'est pas tout à fait idéal, mais fonctionne). Lors des visites suivantes, rien ne devrait apparaître.

17
dinjas

Bien que cet article soit ici depuis un certain temps, les solutions ne sont pas purement JS. Bien que Jason ait noté que demander des autorisations n’était pas idéal, j’estime que c’est une bonne chose, étant donné que l’utilisateur peut la refuser explicitement. Je poste toujours ce code, même si (presque) la même chose peut également être vue dans n autre message de ifaour . Considérez ceci comme la seule version JS sans trop d’attention portée 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 par le nom d'utilisateur correct de quelqu'un d'autre (vous devrez peut-être modifier les autorisations ci-dessous pour ce faire, comme friends_likes) Comme indiqué, il vous faut plus que l’autorisation de base:

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

j'utilise jQuery pour envoyer les données lorsque l'utilisateur appuie sur 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 du texte d'entrée masqué pour obtenir l'identifiant de votre bouton. Dans mon cas, je le prends à partir de l'URL elle-même dans "var fbl_id = h_fbl [4];" Parce qu'il y a l'exemple id: url: http://mywebsite.com/post/22/some-tittle

donc, j'analyse l'URL pour obtenir l'ID, puis l'insère dans ma base de données dans le fichier like.php. De cette façon, vous n'avez pas besoin de demander des autorisations pour savoir si quelqu'un appuie sur le bouton J'aime, mais si vous souhaitez savoir qui appuyez sur celui-ci, des autorisations sont nécessaires.

3
Agent_x