【问题标题】:How to check if a user likes my Facebook Page or URL using Facebook's API如何使用 Facebook 的 API 检查用户是否喜欢我的 Facebook 页面或 URL
【发布时间】:2011-07-02 21:05:38
【问题描述】:

我想我快疯了。我无法让它工作。
我只是想检查用户是否喜欢我在 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 吗?!

【问题讨论】:

标签: javascript facebook facebook-graph-api


【解决方案1】:

我也为这个扯了头发。仅当用户授予不理想的扩展权限时,您的代码才有效。

Here's another approach.

简而言之,如果您为 Canvas 高级选项打开 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!";
    }
  }

【讨论】:

  • 警告:在尝试“滥用”此内容之前,请阅读 Facebook 促销指南,例如喜欢比赛条目的页面。 “#3 不得将 Facebook 特性或功能用作促销的注册或进入机制。例如,点赞页面或签入地点的行为不能自动注册或进入促销参与者。” - facebook.com/promotions_guidelines.php
  • 我实际上没有从返回的对象中获取 pages 属性,这种方法不再可能了吗?
  • @Chris - 只是想澄清一下,您可以先以喜欢页面为条件输入。点赞的行为不能作为进入机制,但你可以在进入之前强制点赞。
  • @Adam - 您的说明是正确的。 Facebook 允许应用程序“点赞 Gate”访问内容。例如 - 这是允许的:“像我们一样查看比赛报名表”。这是不允许的:“像我们一样,您将自动进入我们的比赛”。
  • 您没有检查signed_request 的有效性。这是一种危险的做法。您应该根据您的应用程序机密检查它。查看此answer 了解更多信息
【解决方案2】:

虽然这篇文章已经有一段时间了,但解决方案并不是纯 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 替换为其他人的正确用户ID(您可能需要更改以下权限才能执行此操作,例如friends_likes)如上所述,您需要的不仅仅是基本权限:

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

【讨论】:

    【解决方案3】:

    您可以像这样在 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>
    

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

    【讨论】:

    • javascript 2.7 sdk 已弃用
    • 嗨@DINJAS 感谢您的回答,上面的代码适用于facebook。是否有任何指向 instagram、twitter 和 linkdn 的链接
    • @shivashankarm 我真的不知道。自从我发布这个答案以来,我不必做这样的事情。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      当用户按下like按钮时,我使用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 示例: 网址: http://mywebsite.com/post/22/some-tittle

      所以我解析 url 以获取 id,然后将其插入到 like.php 文件中的数据库中。 这样你就不需要请求权限来知道是否有人按下了like按钮,但是如果你想知道是谁按下了它,则需要权限。

      【讨论】:

      • 如果他们没有连接到你的应用程序,这是唯一的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2013-08-14
      • 2011-11-15
      相关资源
      最近更新 更多