53 votes

Facebook : comment vérifier si l'utilisateur a aimé la page et afficher le contenu ?

J'essaie de créer une application Facebook iFrame. L'application doit d'abord montrer une image et si l'utilisateur aime la page, il aura accès à un certain contenu.

J'utilise RoR, donc je ne peux pas utiliser le SDK de Facebook PhP.

Voici mon iFrame HTML lorsque l'utilisateur n'a pas aimé la page :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="welcome.png" alt="Frontimg">
</div>

Et, si l'utilisateur a aimé la page :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="member.png" alt="Frontimg">
<p>You liked this page</p>

80voto

dwarfy Points 2793

MISE À JOUR 21/11/2012 @ALL : J'ai mis à jour l'exemple afin qu'il fonctionne mieux et qu'il prenne en compte les remarques de Chris Jacob et les meilleures pratiques de FB, jetez un œil à l'exemple fonctionnel. aquí


Bonjour. Comme promis, voici ma réponse en utilisant uniquement javascript :

Le contenu du BODY de la page :

<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({
    appId  : 'YOUR APP ID',
    status : true, 
    cookie : true, 
    xfbml  : true  
  });
</script>

<div id="container_notlike">
YOU DONT LIKE
</div>

<div id="container_like">
YOU LIKE
</div>

Le CSS :

body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}

#container_notlike, #container_like {
    display:none
}

Et enfin le javascript :

$(document).ready(function(){

    FB.login(function(response) {
      if (response.session) {

          var user_id = response.session.uid;
          var page_id = "40796308305"; //coca cola
          var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
          var the_query = FB.Data.query(fql_query);

          the_query.wait(function(rows) {

              if (rows.length == 1 && rows[0].uid == user_id) {
                  $("#container_like").show();

                  //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.

              } else {
                  $("#container_notlike").show();
                  //and here you could get the content for a non liker in ajax...
              }
          });

      } else {
        // user is not logged in
      }
    });

});

Alors, qu'est-ce que ça fait ?

Tout d'abord, il se connecte à FB (si vous avez déjà l'USER ID, et que vous êtes sûr que votre utilisateur est déjà connecté à Facebook, vous pouvez contourner le processus de connexion et remplacer response.session.uid avec VOTRE_USER_ID (de votre application rails par exemple)

Après cela, il effectue une requête FQL sur le site de la page_fan et la signification est que si l'utilisateur est un fan de la page, il retourne l'id de l'utilisateur et sinon il retourne un tableau vide, après cela et en fonction des résultats, il montre un div ou l'autre.

Il existe également une démo fonctionnelle ici : http://jsfiddle.net/dwarfy/X4bn6/

Il utilise la page de Coca-Cola comme exemple, essayez-le et aimez/n'aimez pas. la page coca cola et le relancer ...

Enfin, quelques documents connexes :

Table FQL page_fan

FBJS FB.Data.query

N'hésitez pas à nous contacter si vous avez des questions

Cheers

MISE À JOUR 2

Comme indiqué par quelqu'un, jQuery est nécessaire pour que la version javascript fonctionne MAIS vous pouvez facilement le supprimer (il n'est utilisé que pour le document.ready et show/hide).

Pour le document.ready, vous pourriez envelopper votre code dans une fonction et utiliser body onload="your_function" ou quelque chose de plus compliqué comme ici : Javascript - Comment détecter si le document est chargé (IE 7/Firefox 3) afin que nous remplacions le document prêt.

Et pour l'affichage et la dissimulation, vous pouvez utiliser quelque chose comme : document.getElementById("container_like").style.display = "none" or "block" et pour des techniques plus fiables de croisement de navigateurs, voir ici : http://www.webmasterworld.com/forum91/441.htm

Mais jQuery est si facile :)

UPDATE

Par rapport au commentaire que j'ai posté ici, voici du code ruby pour décoder le "signed_request" que facebook POST à votre URL CANVAS quand il la récupère pour l'afficher dans facebook.

Dans votre contrôleur d'action :

decoded_request = Canvas.parse_signed_request(params[:signed_request])

Et ensuite il s'agit de vérifier la requête décodée et d'afficher une page ou une autre (Je ne suis pas sûr de cela, je ne suis pas à l'aise avec ruby)

decoded_request['page']['liked']

Et voici la classe Canvas correspondante (à partir de bibliothèque ruby fbgraph ) :

 class Canvas

    class << self
      def parse_signed_request(secret_id,request)
        encoded_sig, payload = request.split('.', 2)
        sig = ""
        urldecode64(encoded_sig).each_byte { |b|
          sig << "%02x" % b
        }
        data = JSON.parse(urldecode64(payload))
          if data['algorithm'].to_s.upcase != 'HMAC-SHA256'
          raise "Bad signature algorithm: %s" % data['algorithm']
        end
        expected_sig = OpenSSL::HMAC.hexdigest('sha256', secret_id, payload)
        if expected_sig != sig
          raise "Bad signature"
        end
        data
      end

      private

      def urldecode64(str)
        encoded_str = str.gsub('-','+').gsub('_','/')
        encoded_str += '=' while !(encoded_str.size % 4).zero?
        Base64.decode64(encoded_str)
      end
    end  

 end

19voto

mani Points 1275

Vous devez écrire un peu de code PHP. Lorsque l'utilisateur clique pour la première fois sur l'onglet, vous pouvez vérifier s'il aime la page ou pas. Voici l'exemple de code

include_once("facebook.php");

    // Create our Application instance.
    $facebook = new Facebook(array(
      'appId'  => FACEBOOK_APP_ID,
      'secret' => FACEBOOK_SECRET,
      'cookie' => true,
    ));

$signed_request = $facebook->getSignedRequest();

// Return you the Page like status
$like_status = $signed_request["page"]["liked"];

if($like_status)
{
    echo 'User Liked the page';
    // Place some content you wanna show to user

}else{
    echo 'User do not liked the page';
    // Place some content that encourage user to like the page
}

5voto

Alexey Khrenov Points 31

Voici un exemple de travail, qui est une fourchette de cette réponse :

$(document).ready(function(){
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;

            FB.api({
                method: 'fql.query',
                query: fql_query
            },
            function(response){
                if (response[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            }
            );    
        } else {
        // user is not logged in
        }
    });
});

J'ai utilisé la méthode FB.api (JavaScript SDK), au lieu de FB.Data.query, qui est obsolète. Vous pouvez également utiliser l'API Graphique, comme dans cet exemple :

$(document).ready(function() {
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id=" + page_id + " and uid=" + user_id;

            FB.api('/me/likes/'+page_id, function(response) {
                if (response.data[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            });
        } else {
            // user is not logged in
        }
    });
});​

2voto

karora Points 123

Certaines modifications doivent être apportées au code JavaScript pour gérer le rendu en fonction du fait que l'utilisateur aime ou n'aime pas la page, comme l'exige le passage de Facebook à l'autorisation Auth2.0.

Le changement est assez simple :-

sessions doit être remplacé par authResponse et uid par userID

De plus, étant donné l'exigence du code et certains problèmes rencontrés par les gens (dont moi) en général avec FB.login, l'utilisation de FB.getLoginStatus est une meilleure alternative. Il enregistre la requête à FB dans le cas où l'utilisateur est connecté et a authentifié votre application.

Reportez-vous à la section Objet de la réponse et des sessions pour savoir comment cela peut sauvegarder la requête au serveur FB. http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

Problèmes avec FB.login et ses solutions en utilisant FB.getLoginStatus. http://forum.developers.facebook.net/viewtopic.php?id=70634

Voici le code posté ci-dessus avec les modifications qui ont fonctionné pour moi.

$(document).ready(function(){
    FB.getLoginStatus(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; //coca cola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id =" + page_id + " and uid=" + user_id;
            var the_query = FB.Data.query(fql_query);

            the_query.wait(function(rows) {

                if (rows.length == 1 && rows[0].uid == user_id) {
                    $("#container_like").show();

                    //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.

                } else {
                    $("#container_notlike").show();
                    //and here you could get the content for a non liker in ajax...
                }
            });
        } else {
            // user is not logged in
        }
    });

});

1voto

Sofia Khwaja Points 41

Avec Javascript SDK, vous pouvez changer le code comme ci-dessous, ceci doit être ajouté après l'appel FB.init.

     // Additional initialization code such as adding Event Listeners goes here
FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
        // the user is logged in and has authenticated your
        // app, and response.authResponse supplies
        // the user's ID, a valid access token, a signed
        // request, and the time the access token 
        // and signed request each expire
        var uid = response.authResponse.userID;
        var accessToken = response.authResponse.accessToken;
        alert('we are fine');
      } else if (response.status === 'not_authorized') {
        // the user is logged in to Facebook, 
        // but has not authenticated your app
        alert('please like us');
         $("#container_notlike").show();
      } else {
        // the user isn't logged in to Facebook.
        alert('please login');
      }
     });

FB.Event.subscribe('edge.create',
function(response) {
    alert('You liked the URL: ' + response);
      $("#container_like").show();
}

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