如何使用 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 调用获取用户帐户(页面)描述?