我如何检查用户是否有Facebook时间线?

我如何检查用户是否有Facebook时间线?,facebook,facebook-graph-api,facebook-timeline,Facebook,Facebook Graph Api,Facebook Timeline,我只想为具有“发布操作”权限和时间线的用户启用某些功能。如何检测用户是否启用了时间线?1)部分解决方案是检查用户是否有名为“封面照片”的相册。虽然不是所有的,但大多数激活了timeline的用户都会拥有这张相册 2) 一个确定的方法是实际检索用户配置文件的html内容,并检查它是否有时间线 目前没有API方法检查用户是否启用了时间线 您可以尝试将(传递publish_操作作为perms)与结合使用 订阅auth.login,auth.authResponseChange和/或auth.statu

我只想为具有“发布操作”权限和时间线的用户启用某些功能。如何检测用户是否启用了时间线?

1)部分解决方案是检查用户是否有名为“封面照片”的相册。虽然不是所有的,但大多数激活了timeline的用户都会拥有这张相册


2) 一个确定的方法是实际检索用户配置文件的html内容,并检查它是否有时间线

目前没有API方法检查用户是否启用了时间线

您可以尝试将(传递
publish_操作
作为
perms
)与结合使用

订阅
auth.login
auth.authResponseChange
和/或
auth.statusChange
事件,并检查传递给事件侦听器的
response
属性,一旦触发事件且用户连接
后,您可以成功地将用户标记为已安装时间线的用户

然而,这也有一些缺点:

  • 最好不要要求用户在“添加到时间线”社交插件以外的流中执行
    publish\u操作
    ,以确保他们同时拥有时间线和权限
  • 您应该发布操作,以确保他们已授予这样做的权限,因为这些事件可以是其他用户操作(如密码更改或Facebook用户切换等)

最终(很可能在不久的将来)每个人的个人资料都会转到Timeline,因此facebook似乎没有提供可靠的方法来检测启用Timeline的应用程序。

以下潜在解决方案不需要额外的权限请求。如果您在隐藏的DIV中添加了Facebook timeline插件代码,那么您可以等到FB Canvas加载完成(或在web页面中添加xfml)之后,再测试该元素的CSS高度。如果用户没有时间线,它将是0px。否则,它将是250px(正如我所包括的)这仅适用于Facebook应用程序(不适用于Facebook集成网页)

如果用户未通过将元素样式高度设置为0激活timeline,Facebook将隐藏此插件元素

将此添加到您的应用程序页面:

<div id="timeline-hidden" style="display:none">
  <div class="fb-add-to-timeline" data-show-faces="true"></div>
</div>
<div id="timeline-test"></div>

然后,在javascript中(使用jQuery,仅供参考):

window.fbAsyninit=函数(){
FB.init({…});//在FB.init代码之后
FB.Canvas.setDoneLoading(
功能(结果){
var-str_时间线;
var tlsrc=$(“#时间线隐藏”).find(“iframe”).first().css(“高度”);
如果(“0px”==tlsrc)
str_timeline='此用户没有时间线';
其他的
str_timeline=“此用户没有时间线。”;
$(“#timeline test”).html(str#u timeline+”,timeline插件css高度:“+tlsrc+”,加载时间:“+result.time_delta_ms);
}
);
};
由于潜在的网络延迟,Web集成的以下内容在某种程度上不太可靠,但可以将该概念修改为一些可行的解决方案:

由于在包含FB集成的网站上未调用FB.Canvas.setDoneLoading,请修改上面的FB.Canvas.setDoneLoading函数以订阅xfbml.render操作,并在测试中设置超时:

window.fbAsyninit=函数(){ FB.init({…});//在FB.init代码之后

$(document).ready(function () {
    FB.Event.subscribe('xfbml.render',
  function () {
    setTimeout( function(){
        var str_timeline;
        var tlsrc = $("#timeline-hidden").find("iframe").first().css("height");

        if("0px"==tlsrc)
            str_timeline = '<strong><span style="color:red">This user DOES NOT have timeline.</span></strong>';
        else
            str_timeline = "<strong>This user DOES have timeline.</strong>";


        $("#timeline-test").html(str_timeline + ", timeline plugin css height:" + tlsrc);
    }, 250);
  }
);

});
$(文档).ready(函数(){
FB.Event.subscribe('xfbml.render',
函数(){
setTimeout(函数(){
var-str_时间线;
var tlsrc=$(“#时间线隐藏”).find(“iframe”).first().css(“高度”);
如果(“0px”==tlsrc)
str_timeline='此用户没有时间线。;
其他的
str_timeline=“此用户没有时间线。”;
$(“#timeline test”).html(str#u timeline+”,timeline插件css高度:“+tlsrc”);
}, 250);
}
);
});
})

我在测试中发现,将FB.Event.subscribe('xfbml.render',移动到$(document.ready(function(){…});有助于减少应用程序嵌入Facebook页面时的延迟(加载时间稍长)。刚开始测试,因此它可能会支持,也可能不会支持进一步的测试

$(document).ready(function () {
    FB.Event.subscribe('xfbml.render',
  function () {
    setTimeout( function(){
        var str_timeline;
        var tlsrc = $("#timeline-hidden").find("iframe").first().css("height");

        if("0px"==tlsrc)
            str_timeline = '<strong><span style="color:red">This user DOES NOT have timeline.</span></strong>';
        else
            str_timeline = "<strong>This user DOES have timeline.</strong>";


        $("#timeline-test").html(str_timeline + ", timeline plugin css height:" + tlsrc);
    }, 250);
  }
);

});