Як перевірити, чи подобається користувачеві мою сторінку чи URL-адресу Facebook за допомогою 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 :(');
        }
    }
);

Це повертається: Неправдиво.
Але я шанувальник своєї сторінки, тому не повинен вона повертатися правдою ?!


Відповіді:


101

Я вирвав волосся над цим теж. Ваш код працює лише в тому випадку, якщо користувач надав розширений дозвіл на те, що не є ідеальним.

Ось ще один підхід.

Коротше кажучи, якщо увімкнути 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!";
    }
  }

12
Попередження: Прочитайте рекламні рекомендації Facebook перед тим, як намагатися "зловживати" цією інформацією, наприклад, як сторінка для участі у змаганнях. "Ви не повинні використовувати функції або функції Facebook як механізм реєстрації або вступу в акцію. Наприклад, акт подобання сторінки або реєстрації на місці не може автоматично зареєструвати або ввести учасника акції." - facebook.com/promotions_guidelines.php
Кріс Якоб

1
Я фактично не отримую властивості сторінок від повернутого об’єкта, чи цей метод більше не можливий?
Кейсі Флінн

17
@Chris - просто хотів уточнити, спочатку можна умовити запис, який сподобається на сторінці. Симпатія не може бути механізмом введення, але ви можете примусити себе сподобатися перед входом.
Адам Педлі

4
@Adam - ваше уточнення правильне. Facebook дозволяє програмам "Like Gate" отримувати доступ до вмісту. Наприклад - це ДОБАВЛЕНО: "Як нам, щоб побачити форму для участі у конкурсі". І це НЕ ДОПОМОГА: "Як нам, і ви автоматично входите в наш конкурс".
Кріс Якоб

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

Це поверне один із трьох:

  • string true string false json
  • відформатований відповідь на помилку, якщо маркер
  • або page_id недійсні

Я здогадуюсь, єдиний спосіб, що не використовує токена, щоб досягти цього, - це щойно розміщений підпис_запит Jason Siffring. Мій помічник із використанням 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 це призупинено
Kamal Kumar

Привіт @DINJAS Дякуємо за вашу відповідь, наведений вище код добре працює у facebook. чи є посилання на instagram, twitter та linkdn
shivashankar m

@shivashankarm Я, чесно кажучи, поняття не маю. Мені не доводилося нічого подібного робити, оскільки я опублікував цю відповідь.
дінжі

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

3

Я використовую 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. таким чином, вам не потрібно просити дозволів, щоб знати, чи хтось натискає подібну кнопку, але якщо ви хочете знати, хто її натискає, потрібні дозволи.


1
це єдиний спосіб, якщо вони не зв’язалися з вашою заявою
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.