Como verificar se um usuário gosta de minha página ou URL do Facebook usando a API do Facebook


102

Acho que estou enlouquecendo. Eu não posso fazê-lo funcionar.
Só quero verificar se um usuário gostou da minha página com javascript em um iFrameaplicativo.

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

Isso retorna: False
Mas sou um fã da minha página, então ela não deveria retornar true ?!


Respostas:


101

Eu arranquei meu cabelo por cima deste também. Seu código só funciona se o usuário concedeu uma permissão estendida para o que não é ideal.

Aqui está outra abordagem.

Resumindo, se você ativar a OAuth 2.0opção avançada do Canvas, o Facebook enviará um $_REQUEST['signed_request']junto com todas as páginas solicitadas em seu aplicativo de guia. Se você analisar esse assinado_request, poderá obter algumas informações sobre o usuário, incluindo se ele gostou da página ou não.

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!";
    }
  }

12
Aviso: Leia as Diretrizes Promocionais do Facebook antes de tentar "abusar" desta página de curtidas, por exemplo, para participar da competição. "# 3 Você não deve usar os recursos ou funcionalidades do Facebook como um mecanismo de registro ou entrada de promoção. Por exemplo, o ato de curtir uma página ou fazer check-in em um local não pode registrar automaticamente ou inserir um participante da promoção." - facebook.com/promotions_guidelines.php
— Chris Jacob

1
Na verdade, não estou obtendo a propriedade pages do objeto que é retornado. Esse método não é mais possível?
— Casey Flynn de

17
@Chris - só queria esclarecer, você pode condicionar a entrada a gostar da página primeiro. O ato de gostar não pode ser o mecanismo de entrada, mas você pode forçar o gosto antes de entrar.
— Adam Pedley

4
@Adam - seu esclarecimento está correto. O Facebook permite que os aplicativos acessem o conteúdo como "Like Gate". Por exemplo - é PERMITIDO: "Faça Curtir para ver o formulário de inscrição no concurso". E NÃO É PERMITIDO: "Curta a gente e entrará automaticamente no nosso concurso".
— Chris Jacob,

3
Você não está verificando a validade do signed_request. Esta é uma abordagem perigosa. Você deve compará-lo com o segredo do seu aplicativo. Verifique esta resposta para obter mais informações
— ifaour

19

Você pode usar (PHP)

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

Isso retornará um de três:

  • string true string false json
  • resposta formatada de erro se token
  • ou page_id não são válidos

Acho que a única maneira de não usar token de conseguir isso é com o assinado_request que Jason Siffring acabou de postar. Meu ajudante usando PHP SDK:

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

17

Você pode fazer isso em JavaScript dessa maneira (a partir da resposta de @dwarfy a uma pergunta semelhante ):

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

Onde o arquivo channel.html em seu servidor contém apenas a linha:

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

Há uma pequena duplicação de código lá, mas você entendeu. Isso abrirá uma caixa de diálogo de login na primeira vez que o usuário visitar a página (o que não é exatamente ideal, mas funciona). Nas visitas subsequentes, nada deve aparecer.


javascript 2.7 sdk está suspenso
— Kamal Kumar

Olá @DINJAS Obrigado pela sua resposta, o código acima está funcionando bem para o Facebook. existe algum link para instagram, twitter e linkdn
— shivashankar

@shivashankarm Sinceramente, não faço ideia. Não tive que fazer nada parecido desde que postei esta resposta.
— dinjas de

16

Embora este post já esteja aqui há um bom tempo, as soluções não são JS puro. Embora Jason tenha notado que solicitar permissões não é o ideal, considero isso uma coisa boa, já que o usuário pode rejeitá-la explicitamente. Eu ainda posto esse código, embora (quase) a mesma coisa também possa ser vista em outro post de ifaour . Considere esta a única versão JS sem muita atenção aos detalhes.

O código básico é bastante simples:

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, substitua mepelo ID de usuário adequado de outra pessoa (pode ser necessário alterar as permissões abaixo para fazer isso, como friends_likes) Conforme observado, você precisa de mais do que a permissão básica:

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

3

eu uso o jquery para enviar os dados quando o usuário pressiona o botão like.

<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: você pode usar algum texto de entrada oculto para obter o id do seu botão. No meu caso, eu o retiro do próprio url em "var fbl_id = h_fbl [4];" porque existe o exemplo de id: url: http://mywebsite.com/post/22/some-tittle

então analiso a url para obter o id e, em seguida, insiro no meu banco de dados no arquivo like.php. desta forma, você não precisa pedir permissão para saber se alguém pressionou o botão curtir, mas se você deseja saber quem o pressionou, as permissões são necessárias.


1
esta é a única maneira se eles não se conectaram com seu aplicativo
— Kevin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.