2012-05-14 18 views
7

L'approccio che ho usato inizialmente era:Come sapere se l'app di Facebook è su una pagina?

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

Il problema di questo approccio è:

  1. Se la pagina non esiste affatto, Facebook tornerà 200 intestazione, piuttosto che 404 (ad esempio http://www.facebook.com/pages/Test/DominosPizza?sk=app_311706258843058).
  2. Se la pagina ha un nome utente, questa richiesta restituirà la risposta 301 risposta.

Sto costruendo una sceneggiatura che occasionalmente attraversa tutte le istanze di <div data-page="130414917005937" data-app="299770086775725"></div> nel mio portafoglio. Quindi controlla se l'app è ancora sulla pagina. Se l'app è presente sulla pagina, fornirà un link, altrimenti lascia il tag com'era.

Sto cercando una soluzione che non richiede token di accesso.

+0

sei amministratore della pagina? – avs099

+0

@ avs099, no. Né dell'app. – Gajus

+0

A cosa serve/Test/parte? – phwd

risposta

2

A meno che Facebook cambia il loro schema URL, questo funziona.

Si noti che questo metodo invia una richiesta HEAD anziché GET. Pertanto, nessun contenuto viene scaricato. Per ulteriori spiegazioni, come/perché questo funziona, fare riferimento a http://anuary.com/47/keeping-facebook-portfolio-up-to-date.

Prendere nota che se le impostazioni della privacy della pagina limitano gli utenti non autenticati, è necessario falsificare l'autenticazione dell'utente affinché funzioni.

$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

Questo metodo non è più affidabile Facebook reindirizzerà il client sospetto alla pagina principale – Gajus

7

Ecco il modo ufficiale per scoprire se su una pagina di Facebook è installata l'app.

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

Test App Installa

È possibile verificare se un app specifica è installato su una scheda profilo pagina l'emissione di un HTTP GET a PAGE_ID/tabs/APP_ID.

Questa richiesta funzionerà per qualsiasi APP_ID e restituire i campi sopra indicati è l'app è installata nella pagina. Se l'app non è installata sulla pagina , questa richiesta restituirà un array di dati [] vuoto.

È anche possibile rilasciare questa stessa query con un token di accesso all'app. In questo caso , puoi interrogare qualsiasi PAGE_ID e i campi sopra riportati saranno restituiti se la tua app è installata nella pagina specificata. Un array di dati [] vuoto viene restituito come di consueto se l'app non è installata nella pagina specificata .

quindi è un semplice HTTP GET per http://graph.facebook.com/PAGE_ID/tabs/APP_ID

+1

L'unico problema con questo approccio è che richiede un token di accesso. – Gajus

+8

Non è un problema, è un __requirement__. – DMCS

+0

Non ho chiesto come ottenere questo risultato quando è disponibile token di accesso (come chiaramente indicato nei commenti). Pertanto, la tua soluzione è irrilevante. – Gajus

-4

Il seguente codice ti aiuterà a scoprire se l'app viene caricata tramite una pagina di Facebook.

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

}); 

</script> 
+6

Che non ha nulla a che fare con la domanda – Gajus

2

È possibile esaminare la risposta HTTP della pagina si richiede e cercare la stringa pagelet_app_APPID (dove APPID è l'applicazione id effettivo)

questo affronta problema 1 perché questa stringa non esisterà sulla pagina se la pagina richiesta non è in realtà l'applicazione di tabulazione.

in risposta al problema 2, nel caso di un 301, seguire il reindirizzamento e cercare la risposta della pagina reindirizzata per questa stringa.

Edited 10/29/12

Ho appena guardato in questo problema un po 'più avanti. La ragione per cui la prima pagina non è disponibile per gli utenti anonimi. Ciò è dovuto ad alcune restrizioni sulle autorizzazioni impostate dall'amministratore della pagina. È a causa di queste restrizioni che Facebook richiede ad un utente di autenticarsi prima che la pagina venga vista. Quando usi cURL, Facebook vede questa richiesta come utente anonimo e sta reindirizzando la richiesta alla pagina di accesso. La seconda app non ha questo problema.

Per risolvere questo problema, suggerirei di ispezionare i cookie di Facebook dopo aver effettuato l'accesso utilizzando il browser e inviarli come parte della richiesta cURL.

+0

Se vedi la mia risposta, questo purtroppo non funziona perché Facebook potrebbe reindirizzare anche te su http://facebook.com/ con 301 anche quando l'app è sulla pagina. – Gajus

+0

Questo va bene perché pagelet_app_APPID non sarà sulla pagina se si viene reindirizzati su Facebook.com. Finché controlli la risposta HTML della pagina di chiusura per quella stringa, puoi essere certo che la pagina che hai trovato abbia l'app. – Fisch

+0

Hai un esempio di dove una pagina ha l'app e il reindirizzamento si verifica ancora? – Fisch

Problemi correlati