101 votos

Cómo comprobar si un usuario le gusta mi Facebook Page o URL usando Facebook ' s API

Creo que me estoy volviendo loco. No consigo que funcione.
Simplemente quiero comprobar si un usuario ha gustado mi página con javascript en un iFrame app.

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 :(');
        }
    }
);

Esto devuelve: falso
Pero yo soy un fan de mi página así que no debería devolver true.

100voto

Jason Siffring Puntos 1151

Me rompí mis pelos con este también. El código sólo funciona si el usuario ha concedido un permiso extendido por la que no es la ideal.

He aquí otro enfoque.

En pocas palabras, si se activa el "OAuth 2.0 para el Lienzo" opciones avanzadas, Facebook enviará un $_REQUEST['signed_request'], junto con cada página solicitada dentro de su pestaña de la aplicación. Si se analiza que signed_request usted puede obtener algo de información sobre el usuario, incluso si te ha gustado la página o no.

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

Se puede utilizar (PHP)

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

Uno de los tres devolverá:

  • cadena cadena verdadero falso json
  • formato de respuesta de error si token
  • o añade no son válidos

Creo que el sólo no-usando-token de manera de lograr esto es con el signed_request Jason Siffring sólo publicada. Mi ayudante usando PHP SDK:

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

17voto

dinjas Puntos 824

Usted puede hacerlo en JavaScript como así (Edificio de @dwarfy la respuesta a una pregunta similar):

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

Donde el channel.html archivo en su servidor contiene la línea:

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

Hay un poco de duplicación de código, pero usted consigue la idea. Aparecerá un diálogo de inicio de sesión la primera vez que el usuario visita la página (que no es exactamente el ideal, pero funciona). En las subsiguientes visitas nada de pop-up, aunque.

16voto

DrColossos Puntos 7903

A pesar de que este post ha estado aquí por un buen tiempo, las soluciones no son puros JS. A pesar de que Jason señaló que la solicitud de permisos no es lo ideal, considero que es una buena cosa ya que el usuario puede rechazar de manera explícita. Yo aún después de este código, a pesar de que (casi) la misma cosa también puede ser visto en otro post por ifaour. Consideramos este como el JS sólo versión sin demasiada atención a los detalles.

El código básico es bastante 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");
    }
});

Alternativamente, reemplace me con el apropiado nombre de usuario de otra persona (puede que necesite modificar los permisos de abajo para hacer esto, como friends_likes) Como se ha señalado, se necesita más que el permiso básico:

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

3voto

Agent_x Puntos 43

yo uso jquery para enviar los datos cuando el usuario presiona el botón me gusta.

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

Nota:puede utilizar algunos de los secretos de entrada de texto para obtener el identificador de tu botón.en mi caso lo tomo de la propia dirección url en "var fbl_id=h_fbl[4];" porque no es el id ejemplo: url: http://mywebsite.com/post/22/some-tittle

así que me analizar la dirección url para obtener el id y, a continuación, insertar a mi databse en el like.php archivo. de esta manera usted no tiene que pedir permisos para saber si alguien presiona el botón me gusta, pero si quieren saber de prensa de la oms, los permisos son necesarios.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X