Comment vérifier si un utilisateur aime ma page Facebook ou mon URL à l'aide de l'API de Facebook

102

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

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 fan de ma page, alors ne devrait-elle pas retourner true?!

Patrik
la source

Réponses:

101

J'ai aussi déchiré mes cheveux sur celui-ci. 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 un mot, si vous activez l' OAuth 2.0option avancée pour Canvas, Facebook enverra un $_REQUEST['signed_request']avec chaque page demandée dans votre application d'onglet. Si vous analysez cette signature_request, vous pouvez obtenir des informations sur l'utilisateur, y compris 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!";
    }
  }
Jason Siffring
la source
12
Avertissement: Lisez les directives promotionnelles de Facebook avant d'essayer d '«abuser» de cette page, par exemple, pour participer à un concours. "# 3 Vous ne devez pas utiliser les fonctionnalités ou fonctionnalités de Facebook comme mécanisme d'inscription ou d'inscription à une promotion. Par exemple, le fait d'aimer une page ou de vous enregistrer dans un lieu ne peut pas automatiquement enregistrer ou inscrire un participant à la promotion." - facebook.com/promotions_guidelines.php
Chris Jacob
1
En fait, je n'obtiens pas la propriété pages de l'objet renvoyé. Cette méthode n'est-elle plus possible?
Casey Flynn
17
@Chris - je voulais juste clarifier, vous pouvez d'abord conditionner l'entrée en aimant la page. L'acte d'aimer ne peut pas être le mécanisme d'entrée, mais vous pouvez imposer le goût avant d'entrer.
Adam Pedley
4
@Adam - votre clarification est correcte. Facebook autorise les applications à accéder au contenu comme «Like Gate». Par exemple - c'est PERMIS: "Aimez-nous pour voir le formulaire d'inscription au concours". Et ce n'est PAS PERMIS: "Aimez-nous et vous serez automatiquement inscrit à notre concours".
Chris Jacob
3
Vous ne vérifiez pas la validité du signed_request. C'est une approche dangereuse. Vous devriez le vérifier par rapport au secret de votre application. Vérifiez cette réponse pour plus d'informations
ifaour
19

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 d'erreur si jeton
  • ou page_id ne sont pas valides

Je suppose que le seul moyen de ne pas utiliser de jeton pour y parvenir est avec la requête signée Jason Siffring qui vient d'être publiée. Mon assistant utilisant le SDK PHP:

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

Vous pouvez le faire en JavaScript comme ceci (en vous 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 fichier channel.html sur votre serveur contient juste la ligne:

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

Il y a une petite duplication de code là-dedans, mais vous voyez 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 exactement idéal, mais fonctionne). Lors des visites suivantes, rien ne devrait apparaître.

dinjas
la source
javascript 2.7 sdk il est obsolète
Kamal Kumar
Salut @DINJAS Merci pour votre réponse, le code ci-dessus fonctionne bien pour Facebook. y a-t-il un lien vers instagram, twitter et linkdn
shivashankar m
@shivashankarm Honnêtement, je n'ai aucune idée. Je n'ai rien eu à faire de tel depuis que j'ai publié cette réponse.
dinjas
16

Bien que cet article existe depuis un certain temps, les solutions ne sont pas du pur JS. Bien que Jason ait noté que la demande d'autorisations n'est pas idéale, je considère que c'est une bonne chose car l'utilisateur peut la rejeter explicitement. Je poste toujours ce code, bien que (presque) la même chose puisse également être vue dans un autre article par ifaour . Considérez ceci comme la version JS uniquement 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, remplacez-le mepar l'ID utilisateur approprié de quelqu'un d'autre (vous devrez peut-être modifier les autorisations ci-dessous pour ce faire, par exemple friends_likes) Comme indiqué, vous avez besoin de plus que l'autorisation de base:

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

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 un texte d'entrée caché 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];" car il y a l'exemple d'id: url: http://mywebsite.com/post/22/some-tittle

donc j'analyse l'url pour obtenir l'identifiant, puis je 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 voulez savoir qui appuie dessus, des autorisations sont nécessaires.

Agent_x
la source
1
c'est le seul moyen s'ils ne se sont pas connectés à votre application
Kevin