Facebook, как проверить, понравилась ли пользователю страница и показать контент? - PullRequest
53 голосов
/ 06 июня 2011

Я пытаюсь создать приложение Facebook iFrame.Приложение должно сначала показать изображение, и если пользователю нравится страница, он получит доступ к некоторому контенту.

Я использую RoR, поэтому не могу использовать Facebook PhP SDK.

Вот мой iFrame HTML, когда пользователю не понравилась страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="welcome.png" alt="Frontimg">
</div>

И, если пользователю понравилась страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="member.png" alt="Frontimg">
<p>You liked this page</p>

Ответы [ 6 ]

80 голосов
/ 11 июня 2011

ОБНОВЛЕНИЕ 21/11/2012 @ALL: я обновил пример, чтобы он работал лучше и учитывал замечания Криса Джейкоба и лучших практик FB, посмотрите рабочий пример здесь


Привет. Как и обещал, вот мой ответ с использованием только javascript:

Содержание ТЕЛА страницы:

<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({
    appId  : 'YOUR APP ID',
    status : true, 
    cookie : true, 
    xfbml  : true  
  });
</script>

<div id="container_notlike">
YOU DONT LIKE
</div>

<div id="container_like">
YOU LIKE
</div>

CSS:

body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}

#container_notlike, #container_like {
    display:none
}

И, наконец, JavaScript:

$(document).ready(function(){

    FB.login(function(response) {
      if (response.session) {

          var user_id = response.session.uid;
          var page_id = "40796308305"; //coca cola
          var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
          var the_query = FB.Data.query(fql_query);

          the_query.wait(function(rows) {

              if (rows.length == 1 && rows[0].uid == user_id) {
                  $("#container_like").show();

                  //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.

              } else {
                  $("#container_notlike").show();
                  //and here you could get the content for a non liker in ajax...
              }
          });


      } else {
        // user is not logged in
      }
    });

});

Так что же он делает?

Сначала он входит в FB (если у вас уже есть идентификатор USER ID, и вы уверены, что ваш пользователь уже вошел в Facebook, вы можете обойти вход в систему и заменить response.session.uid на YOUR_USER_ID (например, из вашего приложения rails)

После этого он выполняет FQL-запрос к таблице page_fan, и это означает, что если пользователь является поклонником страницы, он возвращает идентификатор пользователя, а в противном случае возвращает пустой массив, после этого и в зависимости от результаты его показывают div или другой.

Также здесь есть рабочая демоверсия: http://jsfiddle.net/dwarfy/X4bn6/

Он использует страницу кока-колы в качестве примера, попробуйте ее и, как и в отличие от страницы кока-колы , запустите снова ...

Наконец, некоторые связанные документы:

FQL page_fan table

FBJS FB.Data.query

Не стесняйтесь, если у вас есть какие-либо вопросы ..

Приветствия

ОБНОВЛЕНИЕ 2

Как сказал кто-то, jQuery требуется для работы версии javascript, НО вы можете легко удалить ее (она используется только для document.ready и show / hide).

Для document.ready вы можете заключить код в функцию и использовать body onload="your_function" или что-то более сложное, например, здесь: Javascript - Как определить, загружен ли документ (IE 7 / Firefox 3) чтобы мы заменили документ готовым.

А для показа и скрытия вы можете использовать что-то вроде: document.getElementById("container_like").style.display = "none" or "block" и для более надежных кросс-браузерных техник смотрите здесь: http://www.webmasterworld.com/forum91/441.htm

Но jQuery очень прост:)

UPDATE

Относительно комментария, который я разместил здесь ниже, есть некоторый код ruby ​​для декодирования «подписанного запроса», который facebook POST отправляет на ваш URL-адрес CANVAS, когда он выбирает его для отображения внутри facebook.

В вашем контроллере действий:

decoded_request = Canvas.parse_signed_request(params[:signed_request])

А потом нужно проверить декодированный запрос и отобразить ту или иную страницу .. (Не уверен насчет этого, мне не нравится рубин)

decoded_request['page']['liked']

А вот соответствующий класс Canvas (из библиотеки ruby ​​fbgraph ):

 class Canvas

    class << self
      def parse_signed_request(secret_id,request)
        encoded_sig, payload = request.split('.', 2)
        sig = ""
        urldecode64(encoded_sig).each_byte { |b|
          sig << "%02x" % b
        }
        data = JSON.parse(urldecode64(payload))
          if data['algorithm'].to_s.upcase != 'HMAC-SHA256'
          raise "Bad signature algorithm: %s" % data['algorithm']
        end
        expected_sig = OpenSSL::HMAC.hexdigest('sha256', secret_id, payload)
        if expected_sig != sig
          raise "Bad signature"
        end
        data
      end

      private

      def urldecode64(str)
        encoded_str = str.gsub('-','+').gsub('_','/')
        encoded_str += '=' while !(encoded_str.size % 4).zero?
        Base64.decode64(encoded_str)
      end
    end  

 end
19 голосов
/ 08 июня 2011

Вам нужно написать немного кода PHP.Когда пользователь впервые нажимает на вкладку, вы можете проверить, нравится ему страница или нет.Ниже приведен пример кода

include_once("facebook.php");

    // Create our Application instance.
    $facebook = new Facebook(array(
      'appId'  => FACEBOOK_APP_ID,
      'secret' => FACEBOOK_SECRET,
      'cookie' => true,
    ));

$signed_request = $facebook->getSignedRequest();

// Return you the Page like status
$like_status = $signed_request["page"]["liked"];

if($like_status)
{
    echo 'User Liked the page';
    // Place some content you wanna show to user

}else{
    echo 'User do not liked the page';
    // Place some content that encourage user to like the page
}
5 голосов
/ 05 февраля 2012

Вот рабочий пример, который является форком этого ответа :

$(document).ready(function(){
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;

            FB.api({
                method: 'fql.query',
                query: fql_query
            },
            function(response){
                if (response[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            }
            );    
        } else {
        // user is not logged in
        }
    });
});

Я использовал метод FB.api (JavaScript SDK) вместо FB.Data.query, который устарел. Или вы можете использовать Graph API, как в следующем примере:

$(document).ready(function() {
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id=" + page_id + " and uid=" + user_id;

            FB.api('/me/likes/'+page_id, function(response) {
                if (response.data[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            });
        } else {
            // user is not logged in
        }
    });
});​
2 голосов
/ 11 января 2012

В код JavaScript требуется внести некоторые изменения, чтобы обрабатывать рендеринг в зависимости от того, нравится ли ему пользователь, или не нравится страница, санкционированная Facebook при переходе на авторизацию Auth2.0.

Изменить довольно просто: -

сеансы должны быть заменены authResponse и uid на userID

Кроме того, учитывая требования кода и некоторые проблемы, с которыми сталкиваются люди (включая меня) в целом с FB.login, использование FB.getLoginStatus является лучшей альтернативой. Он сохраняет запрос в FB, если пользователь вошел в систему и аутентифицировал ваше приложение.

Обратитесь к разделу Объект ответа и сеансов для получения информации о том, как это могло бы сохранить запрос на сервер FB. http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

Проблемы с FB.login и его исправлениями при использовании FB.getLoginStatus. http://forum.developers.facebook.net/viewtopic.php?id=70634

Ниже приведен код с изменениями, которые у меня сработали.

$(document).ready(function(){
    FB.getLoginStatus(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; //coca cola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id =" + page_id + " and uid=" + user_id;
            var the_query = FB.Data.query(fql_query);

            the_query.wait(function(rows) {

                if (rows.length == 1 && rows[0].uid == user_id) {
                    $("#container_like").show();

                    //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.

                } else {
                    $("#container_notlike").show();
                    //and here you could get the content for a non liker in ajax...
                }
            });
        } else {
            // user is not logged in
        }
    });

});
1 голос
/ 13 ноября 2012

С помощью Javascript SDK вы можете изменить код, как показано ниже, его следует добавить после вызова FB.init.

     // Additional initialization code such as adding Event Listeners goes here
FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
        // the user is logged in and has authenticated your
        // app, and response.authResponse supplies
        // the user's ID, a valid access token, a signed
        // request, and the time the access token 
        // and signed request each expire
        var uid = response.authResponse.userID;
        var accessToken = response.authResponse.accessToken;
        alert('we are fine');
      } else if (response.status === 'not_authorized') {
        // the user is logged in to Facebook, 
        // but has not authenticated your app
        alert('please like us');
         $("#container_notlike").show();
      } else {
        // the user isn't logged in to Facebook.
        alert('please login');
      }
     });

FB.Event.subscribe('edge.create',
function(response) {
    alert('You liked the URL: ' + response);
      $("#container_like").show();
}
0 голосов
/ 06 июня 2011

Здесь есть статья, которая описывает вашу проблему

http://www.hyperarts.com/blog/facebook-fan-pages-content-for-fans-only-static-fbml/

    <fb:visible-to-connection>
       Fans will see this content.
       <fb:else>
           Non-fans will see this content.
       </fb:else>
    </fb:visible-to-connection>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...