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

102

Я думаю, что схожу с ума. Я не могу заставить его работать.
Я просто хочу проверить, понравилась ли пользователю моя страница с помощью 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 :(');
        }
    }
);

Это возвращает: False
Но я фанат своей страницы, так что разве это не должно возвращать true ?!

Патрик
источник

Ответы:

101

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

Вот еще один подход.

Вкратце, если вы включите OAuth 2.0расширенный параметр для Canvas, Facebook будет отправлять сообщение $_REQUEST['signed_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!";
    }
  }
Джейсон Сиффринг
источник
12
Предупреждение: прочтите Правила продвижения Facebook, прежде чем пытаться «злоупотреблять» этой страницей лайков для участия в конкурсе. «# 3 Вы не должны использовать функции или функции Facebook в качестве механизма регистрации или участия в рекламной акции. Например, акция« лайкнуть »Страницу или отметиться в Месте не может автоматически регистрировать или вводить участника акции». - facebook.com/promotions_guidelines.php
Крис Джейкоб
1
На самом деле я не получаю свойство страниц из возвращенного объекта, этот метод больше невозможен?
Кейси Флинн
17
@Chris - просто хотел уточнить, вы можете сначала указать, что вам нравится страница. Акт симпатии не может быть механизмом входа, но вы можете принудить его перед тем, как войти.
Адам Педли
4
@Adam - ваше разъяснение верно. Facebook разрешает приложениям получать доступ к контенту «Нравится». Например - РАЗРЕШЕНО: «Поставьте лайк для просмотра формы заявки на участие». И это НЕ ДОПУСКАЕТСЯ: «Поставьте лайк и вы автоматически попадете в наш конкурс».
Крис Джейкоб
3
Вы не проверяете действительность файла signed_request. Это опасный подход. Вы должны сравнить его с секретом вашего приложения. Проверьте этот ответ для получения дополнительной информации
ifaour
19

Вы можете использовать (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 недействительны

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

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}
Том Роггеро
источник
17

Вы можете сделать это в 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>

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

динджас
источник
javascript 2.7 sdk он устарел
Камаль Кумар
Привет @DINJAS Спасибо за ваш ответ, приведенный выше код отлично работает для Facebook. есть ли ссылка на инстаграм, твиттер и линкдн
shivashankar m
@shivashankarm Я, честно говоря, понятия не имею. Мне не приходилось делать ничего подобного с тех пор, как я опубликовал этот ответ.
dinjas
16

Хотя этот пост был здесь довольно давно, решения не являются чистым 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' });
DrColossos
источник
3

Я использую jquery для отправки данных, когда пользователь нажимает кнопку 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>

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

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

Agent_x
источник
1
это единственный способ, если они не связаны с вашим приложением
Кевин