2012-05-14 118 views
7

我一直在使用最初的方法是:如何判断Facebook应用是否在页面上?

http_head('http://www.facebook.com/pages/Test/' . $input['fb_page_id'] . '?sk=app_' . $input['fb_id']), 'HTTP/1.1 301 Moved Permanently') 

这种方法的问题是:

  1. 如果页面根本不存在,Facebook将返回200头,而不是404(例如http://www.facebook.com/pages/Test/DominosPizza?sk=app_311706258843058)。
  2. 如果页面有用户名,此请求将返回响应301响应。

我正在构建一个脚本,偶尔会在我的投资组合中通过<div data-page="130414917005937" data-app="299770086775725"></div>的所有实例。然后检查应用程序是否仍在页面上。如果应用在页面上,则会提供链接,否则将标签保持原样。

我正在寻找一个不需要访问令牌的解决方案。

+0

你是该页面的管理员吗? – avs099

+0

@ avs099,no。也不是应用程序。 – Gajus

+0

什么是/测试/部分? – phwd

回答

2

除非Facebook上改变了他们的URL方案,这个工程。

请注意,此方法发出HEAD请求,而不是GET。因此,没有下载内容。为进一步解释如何/为什么这项工作参考http://anuary.com/47/keeping-facebook-portfolio-up-to-date

请注意,如果页面隐私设置限制未经身份验证的用户,则需要伪造用户身份验证才能使其正常工作。

$fn_is_app_on_page = function($page_id, $app_id) 
{ 
    $ch   = curl_init(); 

    curl_setopt_array($ch, 
    [ 
     CURLOPT_USERAGENT  => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11', 
     CURLOPT_URL    => 'https://www.facebook.com/pages/anuary/' . $page_id . '?sk=app_' . $app_id, 
     CURLOPT_FOLLOWLOCATION => TRUE, 
     CURLOPT_HEADER   => FALSE, 
     CURLOPT_NOBODY   => TRUE 
    ]); 

    $response = curl_exec($ch); 

    $info  = curl_getinfo($ch); 

    curl_close($ch); 

    if($info['http_code'] == '404') 
    { 
     return FALSE; 
    } 

    if(strpos($info['url'], (string) $app_id) !== FALSE) 
    { 
     return TRUE; 
    } 

    return FALSE; 
}; 

$fn_is_app_on_page(130414917005937, 299770086775725); // TRUE 
$fn_is_app_on_page(1, 299770086775725); // FALSE 
$fn_is_app_on_page(130414917005937, 1); // FALSE 
+1

这种方法已不再可靠,Facebook会将可疑客户端重定向到主页面 – Gajus

7

下面是官方的方式来找出Facebook页面上是否安装了应用程序。

http://developers.facebook.com/docs/reference/api/page/

测试应用安装

如果安装一个页面的个人资料选项卡上的特定应用程序通过 发出HTTP GET到PAGE_ID/tabs/APP_ID你可以测试。

此请求将适用于任何APP_ID,并返回上述字段为 该应用安装在页面上。如果应用程序未安装在 页面上,则此请求将返回一个空的数据[]数组。

您也可以使用应用程序访问令牌发出相同的查询。在这个 的情况下,您可以查询任何PAGE_ID,如果您的应用安装在指定页面上,则上述字段将返回 。如果未在指定的 页面上安装应用程序,则会像往常一样返回空数据[]数组 。

所以这是一个简单的HTTP GET来http://graph.facebook.com/PAGE_ID/tabs/APP_ID

+1

这种方法唯一的问题是它需要访问令牌。 – Gajus

+8

这不是问题,它是__requirement__。 – DMCS

+0

当访问令牌可用时,我没有询问如何完成此操作(如评论中明确指出的那样)。因此,您的解决方案是无关紧要的。 – Gajus

-4

以下代码将帮助您了解应用程序是否通过Facebook页面加载。

<script> 
    $(document).ready(function(){ 
    var isInIFrame = (window.location != window.parent.location) ? true : false; 
    if (isInIFrame == true){ 
     //enter your code here 
    } 

}); 

</script> 
+6

这与问题没有任何关系 – Gajus

2

您可以检查您所请求的页面的HTTP响应,并搜索字符串pagelet_app_APPID(其中APPID是真正的应用ID)

因为这个串不会对存在这个解决问题1页面,如果请求的页面实际上不是标签页应用程序。

对于问题2的回应,如果是301,请按照重定向并搜索重定向页面对此字符串的响应。

编辑12年10月29日

我只是看着这个问题远一点。第一页不适用于匿名用户的原因。这是由于页面管理员设置了一些权限限制。正是由于这些限制,脸书要求用户在查看页面之前进行身份验证。当您使用cURL时,facebook会将此请求视为匿名用户,并将请求重定向到登录页面。第二个应用没有这个问题。

要解决这个问题,我建议您在使用浏览器登录后检查您的Facebook Cookie,并将其作为cURL请求的一部分发送。

+0

如果你看到我的答案,这可惜不起作用,因为即使应用程序在页面上,Facebook也可能将你重定向到http://facebook.com/ 301。 – Gajus

+0

这很好,因为如果您重定向到Facebook.com,pagelet_app_APPID将不会在页面上。只要您检查该字符串的终止页面的HTML响应,就可以确定您找到的页面具有该应用程序。 – Fisch

+0

你有没有一个页面有应用程序并且重定向仍然存在的例子? – Fisch

相关问题