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.