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

Patrik
fonte

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!";
    }
  }
Jason Siffring
fonte
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'];
}
Tom Roggero
fonte
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.

dinjas
fonte
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' });
DrColossos
fonte
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.

Agent_x
fonte
1
esta é a única maneira se eles não se conectaram com seu aplicativo
Kevin