我搜索this question中突出显示的问题的解决方案。
不幸的是,已接受的解决方案(可追溯到2012年11月21日)不再适用,正如您在this demo中所做的那样。
有人知道为什么吗?
体
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
appId : '179378788777832',
status : true,
cookie : true,
xfbml : true
});
</script>
<div id="login">
You are not logged in to FB, Please click<a href="#"> here </a> to login.
</div>
<div id="container_notlike">
YOU DONT LIKE
</div>
<div id="container_like">
YOU LIKE
</div>
JS
var hideLogin = function(){
$("#login").hide();
}
var showLogin = function(){
$("#login").show();
}
var doLogin = function(){
FB.login(function(response) {
if (response.session) {
hideLogin();
checkLike(response.session.uid)
} else {
// user is not logged in
}
});
}
var checkLike = function(user_id){
var page_id = "40796308305"; //coca cola
var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
var the_query = FB.Data.query(fql_query);
the_query.wait(function(rows) {
if (rows.length == 1 && rows[0].uid == user_id) {
$("#container_like").show();
//here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.
} else {
$("#container_notlike").show();
//and here you could get the content for a non liker in ajax...
}
});
}
$(document).ready(function(){
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
hideLogin();
checkLike(response.authResponse.userID)
} else {
showLogin();
}
});
$("#login a").click(doLogin);
});
CSS
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
#container_notlike, #container_like, #login {
display:none
}
我搜索解决方案几个小时,但我找不到任何有效的方法。
谢谢你的帮助。
答案 0 :(得分:2)
不再允许Gating,这就是为什么不可能。获取该信息的唯一可靠方法是授权拥有user_likes
权限并使用/me/likes/[page-id]
的用户。但是你不会在登录评论中获得批准用于门控的许可。
人们需要喜欢某些东西,因为他们真的想要,而不是因为他们得到了一些东西:
仅激励用户登录您的应用,在应用页面上输入促销或在某个地方办理登机手续。不要激励其他行动
来源:https://developers.facebook.com/policy/
顺便说一下,您还可以订阅edge.create
事件,了解用户是否只是点击了您喜欢的按钮,但是您之前无法知道用户是否喜欢它:https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/
答案 1 :(得分:0)
该代码的问题是不推荐使用FQL。 你不能做你想做的事,这就是为什么需要改变的原因。 如果你的应用程序已经过时,你的代码就可以运行,在更改之前创建,就像不允许使用门控一样,但无论如何,你不能将它用于节目内容。您可以使用这种实现来创建交互式体验,例如您可以更改内容,说“感谢您的喜欢”..或者“与我们联系,喜欢我们的页面......”..
您还可以考虑界面,您显示页面插件,并在用户喜欢之后,您说谢谢...并隐藏页面插件...但用户必须始终能够关闭而不喜欢。
要检查用户是否喜欢某个页面,您需要使用:
FB.api加入'/ me / likes',并回复......
if (response.data[likes].name == "Coca-Cola")
或......更好
if (response.data[likes].id == "40796308305") {
}
我再说一遍,有一件事与另一件事无关...... 您可以检查用户是否喜欢某个页面,但您无法根据此类资源限制内容。
还有其他方法可以检查它,例如:
如果用户喜欢该页面,则获取对userid / likes / pageid的api调用返回页面信息,如果用户不喜欢该页面,则不返回任何内容。
您将浪费时间尝试控制内容消费。 您的应用必须获得app_likes权限,并且您更好地考虑为用户创建另一种体验,而不是提交类似的内容。
我还认为用于分享,评论和可选择的良好开放图形的内容非常有效,因为我注意到许多人在获取内容后曾经喜欢和不喜欢该页面。
如果你只是... 1分钟后提示FB.UI进行分享,例如,你将获得更多结果..将页面插件定位在战略位置,人们自然会喜欢你的页面..
你可以说改变页面插件元素: 谢谢你的喜好,请与你的朋友分享.... 谁也想...
或者使用回调来触发共享对话框..
答案 2 :(得分:0)
方法FB.Event.subscribe()允许应用程序订阅一系列事件,并定义它们触发时的回调函数,不推荐使用。
也不推荐使用FQL查询。
要检查用户是否喜欢某个页面,您需要user.likes权限,因此您可以尝试:
FB.api加入'/ me / likes',并回复......
if (response.data[likes].name == "Coca-Cola")
或......更好
if (response.data[likes].id == "40796308305") { }
还有其他方法可以检查它,例如:
如果用户喜欢该页面,则获取对userid / likes / pageid的api调用返回页面信息,如果用户不喜欢该页面,则不返回任何内容。
您可以使用此调用检查用户是否喜欢某个网页,但您无法根据此类资源限制内容。
但是现在,2018年最好的方法是设置Webhooks。
Webhooks是Facebook和您的服务器之间基于订阅的系统。您的应用程序订阅通过指定的HTTPS端点从Facebook接收更新。
这样,只要对所选主题集及其字段进行更新,您的应用就会收到通知,因此,您可以跟踪用户个人资料的大多数部分的更改,例如关于,照片,帖子,朋友和喜欢。
Webhooks更新通知作为POST请求发送到您提供的回调URL。通知可以是轻量级的,仅表示字段已更新,或者可以包含新更新的值。
webhooks user reference 您可以订阅的用户个人资料字段的完整列表,例如关于,照片,帖子,朋友和喜欢。
webhooks page reference 设置应用程序以接收Webhooks更新的最简单方法是使用App Dashboard,查看Facebook Platform文档以获取更多信息。