Comment vérifier si un utilisateur aime ma Page Facebook ou URL en utilisant L'API Facebook

je crois que je deviens fou. Je ne peux pas le faire fonctionner.

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: False,

Mais je suis un fan de ma page, alors ne devrait-elle pas revenir vraie?!

100
demandé sur Igy 2011-02-23 19:01:47

5 réponses

j'ai arraché mes cheveux sur celui-ci 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 l'option OAuth 2.0 pour Canvas advanced, Facebook enverra un $_REQUEST['signed_request'] avec chaque page demandée dans votre application de tabulation. Si vous analysez que signed_request vous pouvez obtenir des informations sur l'utilisateur, y compris si 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!";
    }
  }
96
répondu Jason Siffring 2015-04-17 22:33:06

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

qui retournera l'un des trois:

  • chaîne de caractères chaîne de caractères true false json
  • réponse au format de l'erreur si le jeton
  • ou page_id ne sont pas valables

je suppose que le seul moyen de ne pas utiliser de token pour y parvenir est avec la signed_request Jason Siffring vient de poster. Mon assistant utilisant PHP SDK:

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}
19
répondu Tom Roggero 2011-06-04 15:50:58

vous pouvez le faire en JavaScript comme si (en se basant sur la 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 canal.fichier html sur votre serveur contient 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 avez l'idée. Cela affichera un dialogue de connexion la première fois que l'utilisateur visite la page (ce qui n'est pas exactement idéal, mais fonctionne). Lors des visites suivantes, rien une fenêtre devrait apparaître.

17
répondu dinjas 2017-05-23 12:02:14

bien que ce post ait été ici pendant un certain temps, les solutions ne sont pas pures JS. Bien que Jason ait noté que demander des permissions n'est pas idéal, je considère que c'est une bonne chose puisque l'utilisateur peut le rejeter explicitement. Je poste encore ce code, bien que (presque) la même chose peut être vue dans un autre poste par ifaour . Considérez cela comme la seule version de JS sans trop d'attention aux détails.

le code de base est assez 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");
    }
});

alternativement, remplacer me par le nom D'utilisateur approprié de quelqu'un d'autre (vous pourriez avoir besoin de modifier les permissions ci-dessous, comme friends_likes ) comme indiqué, vous avez besoin de plus que la permission de base:

FB.login(function(response) {
    //do whatever you need to do after a (un)successfull login         
}, { scope: 'user_likes' });
16
répondu DrColossos 2017-05-23 12:26:01

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>

Note: Vous pouvez utiliser du texte caché pour obtenir l'id de votre bouton.dans mon cas, je le prends 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

j'ai donc d'analyser l'url pour obtenir l'id, puis l'insérer à mon databse.fichier php. de cette façon, vous 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.

3
répondu Agent_x 2011-02-27 23:26:51