ОБНОВЛЕНИЕ 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