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

IT技术 javascript facebook facebook-graph-api
2021-01-26 18:47:59

我想我快疯了。我无法让它工作。
我只是想检查用户是否喜欢我在iFrame应用程序中使用 javascript 的页面

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 吗?!

5个回答

我也把我的头发扯掉了。您的代码仅在用户授予了不理想的扩展权限时才有效。

这是另一种方法。

简而言之,如果您打开OAuth 2.0Canvas 高级选项,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!";
    }
  }
@Adam - 您的澄清是正确的。Facebook 允许应用“Like Gate”访问内容。例如 - 这是允许的:“像我们一样看到比赛报名表”。这是不允许的:“像我们一样,您将自动进入我们的比赛”。
2021-03-25 18:47:59
我实际上没有从返回的对象中获取 pages 属性,这个方法不再可能了吗?
2021-03-26 18:47:59
您没有检查signed_request. 这是一种危险的做法。您应该根据您的应用程序机密检查它。检查此答案以获取更多信息
2021-03-28 18:47:59
警告:在尝试“滥用”此例如竞赛条目的赞页面之前,请阅读 Facebook 促销指南。“#3 您不得将 Facebook 特性或功能用作促销的注册或进入机制。例如,喜欢主页或签到某个地方的行为不能自动注册或进入促销参与者。” - facebook.com/promotions_guidelines.php
2021-03-29 18:47:59
@Chris - 只是想澄清一下,您可以先在喜欢页面上设置条目。喜欢的行为不能成为进入机制,但您可以在进入之前强制执行喜欢。
2021-03-30 18:47:59

你可以使用(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 无效

我想实现这一目标的唯一不使用令牌的方法是使用刚刚发布的签名请求 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>

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

javascript 2.7 sdk 已弃用
2021-04-02 18:47:59
嗨@DINJAS 感谢您的回答上述代码适用于 facebook。有没有instagram、twitter和linkdn的链接
2021-04-08 18:47:59
@shivashankarm 我真的不知道。自从我发布这个答案以来,我不必做这样的事情。
2021-04-08 18:47:59

虽然这篇文章已经有一段时间了,但解决方案并不是纯 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 文件中。通过这种方式,您无需请求权限即可知道是否有人按下了赞按钮,但如果您想知道是谁按下了它,则需要权限。

如果他们尚未与您的应用程序连接,这是唯一的方法
2021-03-13 18:47:59