7

我最初使用的方法是:

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>我的投资组合中的所有实例。然后检查应用程序是否仍在页面上。如果应用程序在页面上,它将提供一个链接,否则保持标签不变。

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

4

4 回答 4

7

这是查看 Facebook 页面是否安装了该应用程序的官方方法。

请参阅http://developers.facebook.com/docs/reference/api/page/

测试应用安装

您可以通过向PAGE_ID/tabs/APP_ID.

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

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

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

于 2012-05-14T23:26:56.727 回答
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
于 2012-07-28T07:52:02.417 回答
2

您可以检查您请求的页面的 http 响应并搜索字符串pagelet_app_APPID(其中 APPID 是实际的应用程序 ID)

这解决了问题 1,因为如果请求的页面实际上不是选项卡应用程序,则该字符串将不存在于页面上。

针对问题 2,如果出现 301,请遵循重定向并在重定向页面的响应中搜索此字符串。

已于 2012 年 10 月 29 日编辑

我只是进一步研究了这个问题。匿名用户无法访问首页的原因。这是由于页面管理员设置的一些权限限制。正是由于这些限制,facebook 要求用户在看到页面之前进行身份验证。当您使用 cURL 时,facebook 将此请求视为匿名用户并将请求重定向到登录页面。第二个应用程序没有这个问题。

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

于 2012-10-25T07:53:48.427 回答
-4

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

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

});

</script>
于 2012-08-02T08:49:41.423 回答