Jak sprawdzić, czy użytkownik lubi moją stronę na Facebooku lub adres URL za pomocą interfejsu API Facebooka

102

Chyba wariuję. Nie mogę zmusić tego do pracy.
Chcę po prostu sprawdzić, czy użytkownik polubił moją stronę z javascriptem w iFrameaplikacji.

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

To zwraca: Fałsz
Ale jestem fanem mojej strony, więc czy nie powinno zwrócić prawdy ?!

Patrik
źródło

Odpowiedzi:

101

Z tego też wyrwałem sobie włosy. Twój kod działa tylko wtedy, gdy użytkownik udzielił rozszerzonych uprawnień na to, co nie jest idealne.

Oto inne podejście.

Krótko mówiąc, jeśli włączysz OAuth 2.0opcję zaawansowaną dla kanwy, Facebook wyśle $_REQUEST['signed_request']wraz z każdą stroną żądaną w aplikacji karty. Jeśli przeanalizujesz to signed_request, możesz uzyskać informacje o użytkowniku, w tym o tym, czy polubił stronę, czy nie.

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
źródło
12
Ostrzeżenie: Przeczytaj Wytyczne dotyczące promocji Facebooka przed próbą „nadużycia” tej strony, np. Polubienia w konkursie. „# 3 Nie wolno używać funkcji lub funkcji Facebooka jako mechanizmu rejestracji lub rejestracji promocji. Na przykład polubienie Strony lub zarejestrowanie się w Miejscu nie może automatycznie zarejestrować ani wprowadzić uczestnika promocji”. - facebook.com/promotions_guidelines.php
Chris Jacob
1
Właściwie nie pobieram właściwości pages z zwracanego obiektu. Czy ta metoda nie jest już możliwa?
Casey Flynn
17
@Chris - chciałem tylko wyjaśnić, możesz najpierw uzależnić wpis od polubienia strony. Akt polubienia nie może być mechanizmem wejścia, ale możesz wymusić sympatię przed wejściem.
Adam Pedley,
4
@Adam - Twoje wyjaśnienie jest poprawne. Facebook umożliwia aplikacjom dostęp do treści w trybie „Like Gate”. Na przykład - jest to DOZWOLONE: „Polub nas, aby zobaczyć formularz zgłoszenia konkursowego”. I NIE JEST DOZWOLONE: „Polub nas, a automatycznie zostaniesz zgłoszony do naszego konkursu”.
Chris Jacob
3
Nie sprawdzasz ważności signed_request. To niebezpieczne podejście. Powinieneś sprawdzić to w tajemnicy swojej aplikacji. Sprawdź tę odpowiedź, aby uzyskać więcej informacji
ifaour
19

Możesz użyć (PHP)

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

To zwróci jeden z trzech:

  • string true string false json
  • sformatowana odpowiedź na błąd w przypadku tokena
  • lub page_id są nieprawidłowe

Wydaje mi się, że jedynym sposobem na osiągnięcie tego celu bez użycia tokena jest wysłanie właśnie wysłanego podpisanego_żądania Jason Siffring. Mój pomocnik używający PHP SDK:

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}
Tom Roggero
źródło
17

Możesz to zrobić w JavaScript w ten sposób ( opierając się na odpowiedzi @ dwarfy na podobne pytanie ):

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

Gdzie plik channel.html na twoim serwerze zawiera tylko wiersz:

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

Jest tam małe powielenie kodu, ale masz pomysł. Spowoduje to wyświetlenie okna dialogowego logowania, gdy użytkownik po raz pierwszy odwiedza stronę (co nie jest do końca idealne, ale działa). Jednak przy kolejnych wizytach nic nie powinno się pojawiać.

dinjas
źródło
javascript 2.7 sdk został usunięty
Kamal Kumar
Cześć @DINJAS Dzięki za odpowiedź. Powyższy kod działa dobrze na Facebooku. czy jest jakiś link do instagram, twitter i linkdn
shivashankar m
@shivashankarm Szczerze nie mam pojęcia. Nie musiałem robić nic takiego, odkąd opublikowałem tę odpowiedź.
dinjas
16

Chociaż ten post jest już od dłuższego czasu, rozwiązania nie są czystym JS. Chociaż Jason zauważył, że żądanie uprawnień nie jest idealne, uważam to za dobrą rzecz, ponieważ użytkownik może je wyraźnie odrzucić. Nadal wysyłam ten kod, chociaż (prawie) to samo można zobaczyć w innym poście przez ifaour . Potraktuj to jako jedyną wersję JS bez zbytniej dbałości o szczegóły.

Podstawowy kod jest raczej prosty:

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

Alternatywnie, zastąp mewłaściwym ID użytkownika innej osoby (może być konieczna zmiana poniższych uprawnień, aby to zrobić, na przykład friends_likes) Jak wspomniano, potrzebujesz czegoś więcej niż uprawnienia podstawowe:

FB.login(function(response) {
    //do whatever you need to do after a (un)successfull login         
}, { scope: 'user_likes' });
Dr Colossos
źródło
3

używam jquery do wysyłania danych, gdy użytkownik naciśnie podobny przycisk.

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

Uwaga: możesz użyć ukrytego tekstu wejściowego, aby uzyskać identyfikator swojego przycisku. W moim przypadku biorę go z samego adresu URL w "var fbl_id = h_fbl [4];" ponieważ istnieje przykład identyfikatora: url: http://mywebsite.com/post/22/some-tittle

więc analizuję adres URL, aby uzyskać identyfikator, a następnie wstawiam go do mojej bazy danych w pliku like.php. w ten sposób nie musisz pytać o uprawnienia, aby wiedzieć, czy ktoś naciska przycisk „Lubię to”, ale jeśli chcesz wiedzieć, kto go naciska, potrzebne są uprawnienia.

Agent_x
źródło
1
to jedyny sposób, jeśli nie połączyli się z Twoją aplikacją
Kevin