2012-05-14 119 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

相關問題