it-roy-ru.com

Как проверить, нравится ли пользователю моя страница Facebook или URL, используя API Facebook

Я думаю, что схожу с ума. Я не могу заставить его работать.
Я просто хочу проверить, понравился ли пользователь моей странице с javascript в приложении iFrame.

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

Это возвращает: Ложь
Но я фанат моей страницы, поэтому разве она не должна возвращаться?

101
Patrik

Я тоже сорвал с него волосы. Ваш код работает, только если пользователь предоставил расширенное разрешение для того, что не идеально.

Вот другой подход.

В двух словах: если вы включите расширенный параметр OAuth 2.0 для Canvas, Facebook будет отправлять $_REQUEST['signed_request'] вместе со всеми страницами, запрошенными в приложении с вкладками. Если вы проанализируете подписанный запрос, вы можете получить некоторую информацию о пользователе, в том числе, понравилась ли ему страница или нет.

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

Вы можете использовать (PHP)

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

Это вернет одно из трех:

  • строка true строка false json
  • отформатированный ответ об ошибке, если токен
  • или page_id не действительны

Я предполагаю, что единственный способ не использовать токен для достижения этой цели - подписать только что подписанный Jason Siffring. Мой помощник использует PHP SDK:

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

Вы можете сделать это в JavaScript следующим образом (Построение из ответ @ dwarfy на похожий вопрос ):

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

Где файл channel.html на вашем сервере просто содержит строку:

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

Там есть небольшое дублирование кода, но вы поняли идею. Это откроет диалоговое окно входа в систему при первом посещении страницы пользователем (что не совсем идеально, но работает). При последующих посещениях ничего не должно появляться.

17
dinjas

Хотя этот пост был здесь довольно давно, решения не являются чистым JS. Хотя Джейсон отметил, что запрос разрешений не идеален, я считаю это хорошей идеей, поскольку пользователь может явно отклонить это. Я до сих пор публикую этот код, хотя (почти) то же самое можно увидеть и в еще одно сообщение от ifaour . Считайте, что это версия только для JS без особого внимания к деталям.

Основной код довольно прост:

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

В качестве альтернативы, замените me на правильный UserID кого-то другого (для этого вам может потребоваться изменить указанные ниже разрешения, например friends_likes). Как уже отмечалось, вам нужно больше, чем базовое разрешение:

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

я использую jquery для отправки данных, когда пользователь нажимает кнопку "Мне нравится".

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

Примечание: вы можете использовать некоторый скрытый текст для ввода идентификатора вашей кнопки. В моем случае я беру его из самого URL в "var fbl_id = h_fbl [4];" потому что есть пример id: url: http://mywebsite.com/post/22/some-tittle

поэтому я анализирую URL, чтобы получить идентификатор, а затем вставляю его в базу данных в файле like.php. Таким образом, вам не нужно запрашивать разрешения, чтобы узнать, нажал ли кто-нибудь кнопку "Мне нравится", но если вам нужно знать, кто нажимает ее, необходимы разрешения.

3
Agent_x