Как проверить, нравится ли пользователь моей Facebook-странице или URL-адресу с помощью Facebook API
Думаю, я схожу с ума. Я не могу заставить его работать.
Я просто хочу проверить, понравилась ли пользователю моя страница с 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
Но я поклонник моей страницы, поэтому не должен ли он возвращаться?!
Ответы
Ответ 1
Я разорвал свои волосы и над этим. Ваш код работает только в том случае, если пользователь предоставил расширенное разрешение для того, что не является идеальным.
Здесь другой подход.
Вкратце, если вы включите опцию 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!";
}
}
Ответ 2
Вы можете использовать (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'];
}
Ответ 3
Вы можете сделать это на 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>
Там есть небольшое дублирование кода, но вы получаете идею. Появится диалоговое окно входа в систему при первом посещении пользователем страницы (что не совсем идеально, но работает). При последующих посещениях ничего не должно всплывать.
Ответ 4
Хотя этот пост уже давно существует, решения не являются чистыми 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
на правильный идентификатор пользователя другого пользователя (для этого вам может потребоваться изменить разрешения ниже, например friends_likes
). Как уже отмечалось, вам нужно больше, чем базовое разрешение:
FB.login(function(response) {
//do whatever you need to do after a (un)successfull login
}, { scope: 'user_likes' });
Ответ 5
Я использую 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.
таким образом вам не нужно запрашивать разрешения, чтобы узнать, нажали ли кто-нибудь одну кнопку, но если вы хотите узнать, кто ее нажимает, необходимы разрешения.