미쳐가는 것 같아요. 작동하지 않습니다.
사용자가 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를 반환해야하지 않습니까?!
답변
이것도 머리를 찢었습니다. 사용자가 이상적이지 않은 것에 대한 확장 권한을 부여한 경우에만 코드가 작동합니다.
간단히 말해 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!";
}
}
답변
(PHP)를 사용할 수 있습니다
$isFan = file_get_contents("https://api.facebook.com/method/pages.isFan?format=json&access_token=" . USER_TOKEN . "&page_id=" . FB_FANPAGE_ID);
다음 세 가지 중 하나를 반환합니다.
- 문자열 참 문자열 거짓 json
- 토큰 인 경우 형식화 된 오류 응답
- 또는 page_id가 유효하지 않습니다.
이것을 달성하기 위해 토큰을 사용하지 않는 유일한 방법은 방금 게시 된 signed_request Jason Siffring을 사용하는 것입니다. PHP SDK를 사용하는 내 도우미 :
function isFan(){
global $facebook;
$request = $facebook->getSignedRequest();
return $request['page']['liked'];
}
답변
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>
거기에 약간의 코드 중복이 있지만 아이디어를 얻습니다. 사용자가 페이지를 처음 방문 할 때 로그인 대화 상자가 나타납니다 (정확히 이상적은 아니지만 작동 함). 이후 방문에서는 아무 것도 나타나지 않습니다.
답변
이 게시물은 꽤 오랫동안 여기에 있었지만 솔루션은 순수한 JS가 아닙니다. Jason 은 권한 요청이 이상적이지 않다고 언급 했지만 사용자가 명시 적으로 거부 할 수 있기 때문에 좋은 일이라고 생각합니다. 나는 여전히이 코드를 게시하지만 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
다른 사람의 적절한 사용자 ID로 바꾸십시오 (예 :이 작업을 수행하려면 아래 권한을 변경해야 할 수도 있습니다 friends_likes
). 앞서 언급 한대로 기본 권한 이상이 필요합니다.
FB.login(function(response) {
//do whatever you need to do after a (un)successfull login
}, { scope: 'user_likes' });
답변
사용자가 좋아요 버튼을 누르면 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>
참고 : 일부 숨겨진 입력 텍스트를 사용하여 버튼의 ID를 가져올 수 있습니다. 제 경우에는 “var fbl_id = h_fbl [4];”의 URL 자체에서 가져옵니다. id 예제가 있기 때문에 : url :
http://mywebsite.com/post/22/some-tittle
그래서 URL을 구문 분석하여 ID를 얻은 다음 like.php 파일의 내 databse에 삽입합니다. 이런 식으로 누군가가 좋아요 버튼을 눌렀는지 알기 위해 권한을 요청할 필요가 없지만 누가 누를 것인지 알고 싶다면 권한이 필요합니다.