Come verificare se a un utente piace la mia pagina Facebook o l'URL utilizzando l'API di Facebook


102

Penso che sto impazzendo. Non riesco a farlo funzionare.
Voglio semplicemente controllare se a un utente è piaciuta la mia pagina con javascript in iFrameun'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 :(');
        }
    }
);

Ciò restituisce: Falso
Ma sono un fan della mia pagina, quindi non dovrebbe restituire vero ?!


Risposte:


101

Mi sono strappato i capelli anche su questo. Il tuo codice funziona solo se l'utente ha concesso un'autorizzazione estesa per ciò che non è l'ideale.

Ecco un altro approccio.

In poche parole, se OAuth 2.0attivi l'opzione avanzata per Canvas, Facebook invierà un $_REQUEST['signed_request']insieme a ogni pagina richiesta all'interno della tua app tab. Se analizzi quel signed_request puoi ottenere alcune informazioni sull'utente, incluso se gli è piaciuta la pagina o meno.

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
Avvertenza: leggi le Linee guida promozionali di Facebook prima di tentare di "abusare" di questa pagina, ad esempio, per partecipare al concorso. "# 3 Non devi utilizzare le caratteristiche o le funzionalità di Facebook come meccanismo di registrazione o di iscrizione di una promozione. Ad esempio, l'atto di mettere mi piace a una Pagina o fare il check-in a un Luogo non può registrare o inserire automaticamente un partecipante alla promozione." - facebook.com/promotions_guidelines.php
Chris Jacob,

1
In realtà non sto ottenendo la proprietà pages dall'oggetto restituito, questo metodo non è più possibile?
Casey Flynn

17
@ Chris - volevo solo chiarire, puoi prima condizionare la voce a piacere nella pagina. L'atto di piacere non può essere il meccanismo di accesso, ma puoi far valere il gradimento prima di entrare.
Adam Pedley

4
@Adam - il tuo chiarimento è corretto. Facebook consente alle app di accedere ai contenuti tramite "Mi piace". Ad esempio - questo è CONSENTITO: "Metti mi piace a vedere il modulo di iscrizione al concorso". E questo NON è AMMESSO: "Metti Mi piace e sarai automaticamente iscritto al nostro concorso".
Chris Jacob

3
Non stai verificando la validità del file signed_request. Questo è un approccio pericoloso. Dovresti controllarlo con il tuo segreto dell'applicazione. Controlla questa risposta per ulteriori informazioni
ifaour

19

Puoi usare (PHP)

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

Ciò restituirà uno dei tre:

  • stringa true stringa false json
  • risposta di errore formattata se token
  • o page_id non sono validi

Immagino che l'unico modo per non utilizzare token per ottenere questo risultato sia con il firmato_request Jason Siffring appena pubblicato. Il mio assistente che utilizza PHP SDK:

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

17

Puoi farlo in JavaScript in questo modo ( basandosi sulla risposta di @ dwarfy a una domanda simile ):

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

Dove il file channel.html sul tuo server contiene solo la riga:

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

C'è una piccola duplicazione del codice lì dentro, ma hai un'idea. Verrà visualizzata una finestra di dialogo di accesso la prima volta che l'utente visita la pagina (che non è esattamente l'ideale, ma funziona). Nelle visite successive non dovrebbe apparire nulla.


javascript 2.7 sdk è obsoleto
Kamal Kumar

Ciao @DINJAS Grazie per la tua risposta, il codice sopra funziona bene per Facebook. c'è qualche collegamento a instagram, twitter e linkdn
shivashankar m

@shivashankarm Onestamente non ne ho idea. Non ho dovuto fare nulla di simile da quando ho pubblicato questa risposta.
dinjas

16

Sebbene questo post sia qui da un po 'di tempo, le soluzioni non sono puro JS. Sebbene Jason abbia notato che la richiesta di autorizzazioni non è l'ideale, la considero una buona cosa poiché l'utente può rifiutarla esplicitamente. Inserisco ancora questo codice, anche se (quasi) la stessa cosa può essere vista anche in un altro post di ifaour . Considera questa l'unica versione JS senza troppa attenzione ai dettagli.

Il codice di base è piuttosto semplice:

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

In alternativa, sostituisci mecon l' ID utente corretto di qualcun altro (potresti dover modificare le autorizzazioni di seguito per farlo, come friends_likes) Come notato, hai bisogno di più dell'autorizzazione di base:

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

3

uso jquery per inviare i dati quando l'utente preme il pulsante mi piace.

<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: puoi usare del testo di input nascosto per ottenere l'id del tuo pulsante. Nel mio caso lo prendo dall'URL stesso in "var fbl_id = h_fbl [4];" perché c'è l'esempio di id: url: http://mywebsite.com/post/22/some-tittle

quindi analizzo l'URL per ottenere l'id e poi lo inserisco nel mio database nel file like.php. in questo modo non è necessario chiedere i permessi per sapere se qualcuno preme il pulsante mi piace, ma se si vuole sapere chi lo preme, sono necessari i permessi.


1
questo è l'unico modo se non si sono collegati alla tua domanda
Kevin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.