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

Posted

技术标签:

【中文标题】如何使用 Facebook 的 API 检查用户是不是喜欢我的 Facebook 页面或 URL【英文标题】: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 吗?!

【问题讨论】:

What's method for checking user fan of a page in 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按钮,但是如果你想知道是谁按下了它,则需要权限。

【讨论】:

如果他们没有连接到你的应用程序,这是唯一的方法

以上是关于如何使用 Facebook 的 API 检查用户是不是喜欢我的 Facebook 页面或 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用一个 Facebook API 调用获取用户帐户(页面)描述?

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

Facebook API - uids和电子邮件[关闭]

Facebook Messenger ID匹配API仅适用于管理员

如何在 Facebook API ios 中获取用户名?

Facebook Graph API 分页如何工作以及如何使用它来迭代 facebook 用户提要?