Cómo verificar si a un usuario le gusta mi página de Facebook o URL usando la API de Facebook

102

Creo que me estoy volviendo loco. No puedo conseguir que funcione.
Simplemente quiero comprobar si a un usuario le ha gustado mi página con javascript en una iFrameaplicación.

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 soy fan de mi página, ¿no debería volver a ser verdad?

Patrik
fuente

Respuestas:

101

También me tiré el pelo por este. Su código solo funciona si el usuario ha otorgado un permiso extendido para lo que no es ideal.

Aquí hay otro enfoque.

En pocas palabras, si OAuth 2.0activa la opción avanzada de Canvas, Facebook enviará un mensaje $_REQUEST['signed_request']junto con cada página solicitada dentro de su aplicación de pestaña. Si analiza la solicitud firmada, puede obtener información sobre el usuario, incluso si le 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!";
    }
  }
Jason Siffring
fuente
12
Advertencia: lea las Pautas promocionales de Facebook antes de intentar "abusar" de esta página, por ejemplo, me gusta para participar en el concurso. "# 3 No debe usar las funciones o funciones de Facebook como mecanismo de registro o entrada de una promoción. Por ejemplo, el acto de dar me gusta a una página o registrarse en un lugar no puede registrar o ingresar automáticamente a un participante de la promoción". - facebook.com/promotions_guidelines.php
Chris Jacob
1
De hecho, no obtengo la propiedad de las páginas del objeto que se devuelve, ¿este método ya no es posible?
Casey Flynn
17
@Chris: solo quería aclarar, puede condicionar la entrada a que le guste la página primero. El acto de gustar no puede ser el mecanismo de entrada, pero puedes imponer el agrado antes de entrar.
Adam Pedley
4
@ Adam: tu aclaración es correcta. Facebook permite que las aplicaciones accedan "Me gusta Gate" al contenido. Por ejemplo, esto ESTÁ PERMITIDO: "Me gusta para ver el formulario de inscripción al concurso". Y esto NO ESTÁ PERMITIDO: "Me gusta y entrarás automáticamente en nuestro concurso".
Chris Jacob
3
No está comprobando la validez del signed_request. Este es un enfoque peligroso. Debe compararlo con el secreto de su aplicación. Consulte esta respuesta para obtener más información
ifaour
19

Puede usar (PHP)

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

Eso devolverá uno de tres:

  • cadena verdadera cadena falsa json
  • respuesta formateada de error si token
  • o page_id no son válidos

Supongo que la única forma de no usar token para lograr esto es con la solicitud firmada que Jason Siffring acaba de publicar. Mi ayudante usando PHP SDK:

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

Puede hacerlo en JavaScript así ( basándose en la respuesta de @ dwarfy 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 archivo channel.html en su servidor solo contiene la línea:

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

Hay una pequeña duplicación de código ahí, pero entiendes la idea. Aparecerá un cuadro de diálogo de inicio de sesión la primera vez que el usuario visite la página (que no es exactamente lo ideal, pero funciona). Sin embargo, en visitas posteriores no debería aparecer nada.

dinjas
fuente
javascript 2.7 sdk está obsoleto
Kamal Kumar
Hola @DINJAS Gracias por tu respuesta, el código anterior funciona bien para Facebook. ¿Hay algún enlace a instagram, twitter y linkdn?
shivashankar m
@shivashankarm Sinceramente, no tengo ni idea. No he tenido que hacer nada como esto desde que publiqué esta respuesta.
dinjas
16

Aunque esta publicación ha estado aquí durante bastante tiempo, las soluciones no son JS puro. Aunque Jason señaló que solicitar permisos no es ideal, lo considero algo bueno ya que el usuario puede rechazarlo explícitamente. Todavía publico este código, aunque (casi) lo mismo también se puede ver en otra publicación de ifaour . Considere esto como la única versión de JS 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, reemplácelo mecon el ID de usuario adecuado de otra persona (es posible que deba modificar los permisos a continuación para hacer esto, como friends_likes) Como se señaló, 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' });
DrColossos
fuente
3

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 usar algún texto de entrada oculto para obtener la identificación de su botón. En mi caso, lo tomo de la URL en "var fbl_id = h_fbl [4];" porque existe el ejemplo de identificación: url: http://mywebsite.com/post/22/some-tittle

así que analizo la URL para obtener la identificación y luego la inserto en mi base de datos en el archivo like.php. de esta manera no necesita pedir permisos para saber si alguien presiona el botón Me gusta, pero si quiere saber quién lo presiona, se necesitan permisos.

Agent_x
fuente
1
esta es la única forma si no se han conectado con su aplicación
Kevin