如何使用Facebook的API检查用户是否喜欢我的Facebook页面或URL

我想我疯了。 我无法得到它的工作。
我只是想检查一个用户是否喜欢我的网页与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
但我是我的页面的粉丝,所以不应该回报真实?!

我也把头发拉出来。 你的代码只有在用户授予了一个不理想的扩展权限的情况下才有效。

这是另一种方法。

简而言之,如果您打开OAuth 2.0 for Canvas高级选项,Facebook将发送$_REQUEST['signed_request']以及您的标签应用程序中所请求的每个页面。 如果你parsingsigned_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); 

这将返回三个之一:

  • string真正的string假JSON
  • 如果令牌格式化错误的响应
  • 或page_id无效

我猜想唯一没有使用令牌的方式是刚刚发布的signed_request Jason Siffring。 我的帮手使用PHP SDK:

 function isFan(){ global $facebook; $request = $facebook->getSignedRequest(); return $request['page']['liked']; } 

你可以像JavaScript一样使用JavaScript(build立在@ 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> 

那里有一些代码重复,但你明白了。 这将在用户第一次访问该页面时popup一个login对话框(这不是很理想,但工作正常)。 在随后的访问中,什么都不应该popup。

虽然这个post在这里已经有一段时间了,但是这些解决scheme并不是纯粹的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"); } }); 

或者,用其他人的正确UserIDreplaceme (您可能需要更改下面的权限来执行此操作,比如friends_likes )。如上所述,您需要的不仅仅是基本权限:

 FB.login(function(response) { //do whatever you need to do after a (un)successfull login }, { scope: 'user_likes' }); 

当用户按下类似button时,我使用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> 

注意:你可以使用一些隐藏的input文本来获取你的button的id。在我的情况下,我把它从url本身在“var fbl_id = h_fbl [4];” 因为有id的例子:url: http : //mywebsite.com/post/22/some-tittle

所以我parsing的url得到的ID,然后插入到我的数据库在like.php文件。 通过这种方式,您不需要询问是否有人按下类似button的权限,但是如果您想知道是谁按下的,则需要权限。