Facebook如何检查用户是否喜欢页面并显示内容?

IT技术 javascript jquery ruby-on-rails ruby-on-rails-3 facebook
2021-01-14 17:22:07

我正在尝试创建一个 Facebook iFrame 应用程序。该应用程序应首先显示图像,如果用户喜欢该页面,他将可以访问某些内容。

我使用 RoR,因此我不能使用 Facebook PhP SDK。

当用户不喜欢该页面时,这是我的 iFrame HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/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;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="welcome.png" alt="Frontimg">
</div>

并且,如果用户喜欢该页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/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;}
</style>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<body>
<div id="container">
<img src="member.png" alt="Frontimg">
<p>You liked this page</p>

6个回答

2012 年 11 月21日更新 @ALL:我已经更新了示例,以便它更好地工作,并考虑了 Chris Jacob 和 FB Best Practices 的评论,看看这里的工作示例


嗨,正如所Promise的,这是我仅使用 javascript 的答案:

页面BODY的内容:

<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(如果您已经拥有用户 ID,并且您确定您的用户已经登录到 Facebook,您可以绕过登录内容并替换response.session.uid为 YOUR_USER_ID(例如来自您的 rails 应用程序)

之后它对表进行 FQL 查询page_fan,意思是如果用户是页面的粉丝,它返回用户 id,否则返回一个空数组,然后根据结果显示一个 div或另一个。

这里还有一个工作演示:http : //jsfiddle.net/dwarfy/X4bn6/

它以可口可乐页面为例,尝试去喜欢/不喜欢可口可乐页面并再次运行它......

最后是一些相关的文档:

FQL page_fan 表

FBJS FB.Data.query

如果您有任何问题,请不要犹豫..

干杯

更新 2

正如某人所说,javascript 版本需要 jQuery 才能工作,但您可以轻松删除它(它仅用于 document.ready 和显示/隐藏)。

对于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 太简单了 :)

更新

相对于我在下面发布的评论,这里有一些 ruby​​ 代码,用于解码 facebook POST 到您的 CANVAS URL 的“signed_request”,当它获取它以在 facebook 内显示时。

在您的动作控制器中:

decoded_request = Canvas.parse_signed_request(params[:signed_request])

然后是检查解码的请求并显示一页或另一页..(不确定这个,我对 ruby​​ 不满意)

decoded_request['page']['liked']

这是相关的 Canvas 类(来自fbgraph ruby​​ 库):

 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
实际上,虽然在 javascript 中查看如何执行此操作仍然很有趣,但正如您在 iframe 应用程序中一样,您应该考虑将 facebook 发送到您的页面signed_request作为 POST 参数进行解码,当它获取它以显示在 iframe 中时。
2021-03-18 17:22:07
@kel :我很抱歉这么说,但没有办法绕过权限。我的意思是用户必须接受一次。如果您的用户已经通过您的网站登录 facebook,那么您可以使用他们的 access_token 而无需进行 JS 登录,否则不会。用户是否已经通过您的网站登录了 Facebook?
2021-03-25 17:22:07
在 JS 方面,当我尝试您的演示时,它会弹出请求权限框。有没有办法解决这个问题?我正在尝试在网站上执行此操作,以查看他们是否喜欢我们的粉丝页面并且它没有显示一些不同的内容,但如果有弹出请求许可,那么他们可能会离开该网站。
2021-04-01 17:22:07
@dwarfy 不,不要登录我的网站。Facebook 点赞框如何知道您是否喜欢某个页面?仅仅是因为它是facebook吗?
2021-04-01 17:22:07
请参阅我的更新...它应该可以解决问题(可能是比 javascript 更好的解决方案)
2021-04-10 17:22:07

您需要编写一些 PHP 代码。当用户第一次单击选项卡时,您可以检查他是否喜欢该页面。下面是示例代码

include_once("facebook.php");

    // Create our Application instance.
    $facebook = new Facebook(array(
      'appId'  => FACEBOOK_APP_ID,
      'secret' => FACEBOOK_SECRET,
      'cookie' => true,
    ));

$signed_request = $facebook->getSignedRequest();

// Return you the Page like status
$like_status = $signed_request["page"]["liked"];

if($like_status)
{
    echo 'User Liked the page';
    // Place some content you wanna show to user

}else{
    echo 'User do not liked the page';
    // Place some content that encourage user to like the page
}
@mani,我从像我这样的病人那里收到了很多 -1,这让我在回答之前更仔细地阅读了问题和标签......对不起,如果你觉得受伤很严重
2021-03-25 17:22:07
@mani 我很高兴你发布了这个解决方案!虽然它可能没有回答 Rails 初学者的确切问题,但它是我从 Google SERP 登陆这里的问题的完美解决方案。
2021-03-31 17:22:07
你在某处看到“php”标签了吗?这家伙想要一些 ruby​​ 或 javascript 的东西..
2021-04-01 17:22:07
我不是 ROR 专家,尽管您可以在 facebook 的 ROR API 中找到类似的东西,就好像他们为 PHP 提供它一样,它们肯定也为 ROR 提供。
2021-04-04 17:22:07
尽管它与 OP 的问题有点偏离主题,但我很高兴这些信息在这里,因为它对我的情况有帮助。
2021-04-10 17:22:07

这是一个工作示例,它是这个答案的一个分支

$(document).ready(function(){
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;

            FB.api({
                method: 'fql.query',
                query: fql_query
            },
            function(response){
                if (response[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            }
            );    
        } else {
        // user is not logged in
        }
    });
});

我使用了 FB.api 方法(JavaScript SDK),而不是已弃用的 FB.Data.query。或者你可以像这个例子一样使用 Graph API:

$(document).ready(function() {
    FB.login(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola
            var fql_query = "SELECT uid FROM page_fan WHERE page_id=" + page_id + " and uid=" + user_id;

            FB.api('/me/likes/'+page_id, function(response) {
                if (response.data[0]) {
                    $("#container_like").show();
                } else {
                    $("#container_notlike").show();
                }
            });
        } else {
            // user is not logged in
        }
    });
});​

需要对 JavaScript 代码进行一些更改,以根据用户喜欢或不喜欢 Facebook 迁移到 Auth2.0 授权所强制要求的页面来处理呈现。

改变相当简单:-

session 必须由 authResponse 替换,uid 由 userID 替换

此外,考虑到代码的要求以及人们(包括我)在使用 FB.login 时面临的一些问题,使用 FB.getLoginStatus 是更好的选择。如果用户登录并验证了您的应用程序,它会将查询保存到 FB。

有关如何将查询保存到 FB 服务器的信息,请参阅响应和会话对象部分。http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

FB.login 的问题及其使用 FB.getLoginStatus 的修复。 http://forum.developers.facebook.net/viewtopic.php?id=70634

这是上面发布的代码,其中包含对我有用的更改。

$(document).ready(function(){
    FB.getLoginStatus(function(response) {
        if (response.status == 'connected') {
            var user_id = response.authResponse.userID;
            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
        }
    });

});

使用 Javascript SDK,您可以更改如下代码,这应该在 FB.init 调用之后添加。

     // Additional initialization code such as adding Event Listeners goes here
FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
        // the user is logged in and has authenticated your
        // app, and response.authResponse supplies
        // the user's ID, a valid access token, a signed
        // request, and the time the access token 
        // and signed request each expire
        var uid = response.authResponse.userID;
        var accessToken = response.authResponse.accessToken;
        alert('we are fine');
      } else if (response.status === 'not_authorized') {
        // the user is logged in to Facebook, 
        // but has not authenticated your app
        alert('please like us');
         $("#container_notlike").show();
      } else {
        // the user isn't logged in to Facebook.
        alert('please login');
      }
     });

FB.Event.subscribe('edge.create',
function(response) {
    alert('You liked the URL: ' + response);
      $("#container_like").show();
}
不适用于回访者,因为 edge.create 仅在创建时触发,如果用户以前喜欢则不会触发。
2021-03-13 17:22:07
谢谢索菲亚!这应该移到顶部,因为它适用于当前的 FB API。
2021-03-30 17:22:07