2011-02-23 124 views
100

我想我会疯了。我无法让它工作。
我只是想检查用户是否喜欢我的网页与JavaScript在iFrame应用程序。如何检查用户是否喜欢我的Facebook页面或URL使用Facebook的API

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 :('); 
     } 
    } 
); 

这将返回:假
但我我的页面的粉丝所以不宜它返回true?

+1

的可能重复(http://stackoverflow.com/questions/4970439/whats-method-for-checking -user-fan-of-a-page-in-graph-api) – ifaour 2011-02-23 19:31:58

回答

96

我也把头发拉出来。您的代码仅在用户已授予对于不理想的扩展权限时才有效。

Here's another approach.

简而言之,如果你打开OAuth 2.0的帆布高级选项,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!"; 
    } 
    } 
+0

啊哈,我试过signed_request,但我从来没有得到它的工作,所以我去了JavaScript,由于某种原因,更容易,它的工作。 (但那是另一个项目)。谢谢! – Patrik 2011-02-25 09:01:35

+0

只是好奇,但你是如何用JavaScript做到的。我开始那里,但结束了这种方法在PHP中。 – 2011-02-26 05:06:45

+0

我试过这段代码。但它只适用于当我选择页面类型为fbml时。如果我选择iframe它不起作用。另外如果我选择fbml,我没有得到页面参数,它告诉页面是否被喜欢。我想我错过了一些东西。 – noobcode 2011-03-02 12:04:18

3

我使用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> 

注意:您可以使用一些隐藏输入文本,让您的button.in我的情况的ID我把它从URL本身的“VAR fbl_id = h_fbl [4]。” becasue存在ID例如: 网址: http://mywebsite.com/post/22/some-tittle

,所以我解析URL获得ID,然后将其插入到我的like.php文件DATABSE。 通过这种方式,您不需要询问是否有人按下类似按钮的权限,但如果您想知道是谁按下按钮,则需要权限。

+1

这是唯一的方法,如果他们没有与您的应用程序连接 – Kevin 2012-08-31 21:21:50

19

可以使用(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']; 
} 
17

你可以做到这一点在JavaScript像这样(楼宇断@dwarfy's response to a similar question):

<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> 

那里有一些代码重复,但你明白了。这将在用户第一次访问该页面时弹出一个登录对话框(这不完全理想,但有效)。在随后的访问中,什么都不应该弹出。

+0

javascript 2.7 sdk它被删除 – 2016-08-01 06:35:30

16

虽然这篇文章已经有一段时间了,但这些解决方案并不是纯粹的JS。尽管Jason指出请求权限并不理想,但我认为这是一件好事,因为用户可以明确拒绝它。我仍然发布此代码,但(几乎)同样的事情也可以在another post by 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)如前所述,你需要超过基本权限:?什么方法检查网页的用户风扇图形API]

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