使用Facebook PHP SDK如何确定用户是否已经喜欢我的页面?

3

我的搜索结果为空,因为当您搜索“Facebook”和“like”时,我得到了各种其他结果。

我有一个应用程序,只在公司的Facebook页面上。在该应用程序中,我需要知道用户是否喜欢公司的页面。如果没有,我会显示一件事情,如果有,我会显示另一件事情。如何使用Facebook PHP SDK v.3.1.1来实现这一点?


1
你所说的是“Like-gate”(点赞闸门)的概念。可以参考这个之前的问题:https://dev59.com/XG435IYBdhLWcg3wlRIf。 - Lix
5个回答

4
可以这样做:
<?php
    require('facebook.php');
    $config = array(
         'appId' => 'your facebook app id',
         'secret' => 'your facebook app secret code',

        'allowSignedRequest' => false
    );
    $facebook = new Facebook($config);
    $user_id = $facebook->getUser();
    if (isset($user_id)) {
        try {           
            $likes = $facebook->api('/me/likes/your_facebook_page_id_here', 'GET');             

            if (!empty($likes['data'])) // if user has liked the page then $likes['data'] wont be empty otherwise it will be empty
            {
                echo 'Thank you for liking our fan page!';                   

            }             
            else {                                       
                 //show something else                   
            }
        } catch (FacebookApiException $e) {
            $login_url = $facebook->getLoginUrl();
            echo '<a href="' . $login_url . '">Please click here to login into your Facebook account.</a>';
            error_log($e->getType());
            error_log($e->getMessage());
        }
    } else {
        $login_url = $facebook->getLoginUrl();
        echo '<a href="' . $login_url . '">Please lick here to login into your Facebook account</a>';
    }
    ?>

用户将点击“请点击此处登录您的Facebook账户”文本,该文本将重定向到Facebook应用程序权限页面。一旦用户允许您的应用程序获得权限,代码将获取用户数据并显示您想要的任何内容(如果用户未喜欢您的粉丝页面)。请保留HTML标记。

3
您可以使用FQL来实现此操作。您还需要确保已设置user_likes权限。
我从一个已下线的旧应用程序中提取了此示例,根据Facebook在最新一轮更新中所做的更改可能需要进行更改。最近我一直在使用JavaScript,并订阅edge.create事件...只需将page_id替换为您的页面ID并尝试即可。
$checkIfUserLikePage =  $facebook->api(array(
    "method"    => "fql.query",
    "query"     => "select uid from page_fan where uid=me() and page_id=1234567"
));
$checkIfUserLikePage = sizeof($checkIfUserLikePage) == 1 ? true : false;

这似乎在最新的API中不再起作用了,无论如何还是谢谢。 - Brent Deneau

2

这个应该对你有用!我曾经做过很多类似的页面,所以我创建了一种非常简单的方式来创建像门控页面一样的页面。https://github.com/DrewDahlman/FBVersion

享受吧!


谢谢,但这也不起作用。签名请求中没有包含任何关于喜欢页面的数据。 - Brent Deneau
它会为您完成所有事情,只需有喜欢和不喜欢的php页面,剩下的工作就交给它了。脚本将确定用户是否喜欢他们当前所在的选项卡。 - Drew Dahlman
2
抱歉,我不能提供帮助,也许你没有正确地解释你的问题... 这里的示例 http://www.facebook.com/apps/application.php?id=177674102290105&sk=app_177674102290105 显示了一个非喜欢页面,当你点击“喜欢”时,它会显示一个喜欢页面... - Drew Dahlman
实际上,该链接给我一个警告,指出您的应用程序不支持安全浏览,因此无论是喜欢还是不喜欢,我都无法使用它。 - Brent Deneau
哦,你只需要有一个https版本,我的应用程序没有这个。一些用户的隐私设置不允许他们查看不安全的应用程序,例如这个例子,但是这个例子正好做到了你想要的。你只需要在你的FB应用程序设置中启用HTTPS版本即可。 - Drew Dahlman

1
$signed_request = $_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) {

            $this->assign('verify', $signed_request->page->liked);
            } 
            else {
                echo "Please click on the Like button to view our Coupons!";
                jexit();
            }
    } 

我希望这会对你有所帮助 :)

0

虽然这是一个老话题,但我想发表一下自己的看法,因为我最近学到了很多关于如何做到这一点,并不得不将其付诸实践。

请查看此链接:http://nickring.com/blog/2012/11/facebook-fan-gate-using-php/。它使用signed_request变量,就像其他一些响应所示,但它显示了如何不需要通过$_REQUEST请求signed_request变量。

唯一需要记住的一件事是,只有在Facebook内运行访问signed_request的PHP脚本时,signed_request才可用。如果您在Facebook之外运行此脚本,尝试使用Facebook API,则会返回一个空数组。

以下是一个示例 - 当您访问此地址时,以下脚本将运行:https://www.facebook.com/yourFacebookPage/app_xxxxxxxxxxxxxxx,其中“xxxxxxxxxxxxxxxx”是应用程序ID。

// Check if the user has liked us on Facebook, require the Facebook SDK
require_once('linked/facebook/facebook.php');

// Setup the Config
$config = array(
    'appId' => 'xxxxxxxxxxxxxxxxx',
    'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    'cookie' => true
);

// Create a Facebook SDK instance
$facebook = new Facebook($config);

// Get the signed_request variable that we so desparately need
$signed_request = $facebook->getSignedRequest();
$like_status = $signed_request["page"]["liked"];

// Make sure that it worked
if (!empty($signed_request))
{
    // Get the signed_request information
    if ($like_status == 1)
    {
        // Wo0t! Show the FB fan only page stuff here
        
    }
    else
    {
        // Show the 'Please like us page'
        $page = file_get_contents('pages/facebookLikeUs.html');
        
        // Finish the page
        echo $page;
        exit();
        
    } // End if ($like_status == 1) ELSE Clause and IF
    
} // End if (!empty($signed_request)) IF Clause
else
{
    // Damn, it didn't work. Show an error
}

上述脚本是从应用程序设置中的“Facebook应用程序”部分中设置的Canvas URL调用的脚本。 facebookLikeUs.html页面只是一个要求用户点击“赞”以继续的页面。如果我想让他们重定向回需要Facebook赞的网站,我只需将// Wo0t!部分替换为类似于以下内容的内容:

    // Wo0t! They're all set, establish some cookies, get a cookie, and redirect back to the PHD program site
    setcookie('fbls', $signed_request['page']['id'] . '-' . $signed_request['user_id'], time() + 300);
    $redirectURL = "http://www.myurl.com/theScriptIWantToReceiveTheUserFromFB.php";
    
    // Since Facebook really wants to keep us in the page, we need to create a page that will automatically break out of FB
    $page = file_get_contents('pages/facebookRedirectBack.html');
    
    // Replace some stuff
    $page = str_replace('$redirectURL', $redirectURL, $page);
    
    // Output the page
    echo $page;
    exit();

有了facebookRedirectBack.html页面:

<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
window.top.location.href = '$redirectURL';
</script>
</body>
</html>

如果您想在此方面增加一些安全性,可以让重定向的 PHP 脚本编写一些 cookie 并将它们附加到 URL 上,以便接收脚本必须比较 cookie 和 URL 参数,然后在读取完毕后删除 cookie。

希望这可以帮助您,因为我个人没有找到关于这个主题的一致信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接