2011-12-24 7 views
48

Quando si condivide una delle mie pagine su FB, voglio visualizzare qualcosa di diverso. Il problema è che preferisco non usare og: elements, ma riconoscere l'user-agent di FB.Come riconoscere Facebook User-Agent

Che cos'è? Non riesco a trovarlo

Grazie

+1

'if (strpos ($ _ SERVER [ 'HTTP_USER_AGENT' ], 'facebookexternalhit')! == false) {...} ' – Xeoncross

risposta

95

Per lista di stringhe user-agent, guardare in alto here. I più utilizzati, a settembre 2015, sono facebookexternalhit/* e Facebot. Dato che non hai specificato in quale lingua stai cercando di riconoscere l'agente utente, non posso dirti più informazioni. Se si desidera riconoscere Facebook bot in PHP, utilizzare

if (
    strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false ||   
    strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false 
) { 
    // it is probably Facebook's bot 
} 
else { 
    // that is not Facebook 
} 

UPDATE: Facebook ha aggiunto Facebot alla lista dei loro possibili stringhe user-agent, così ho aggiornato il mio codice per riflettere il cambiamento. Inoltre, il codice è ora più prevedibile per possibili cambiamenti futuri.

+7

È possibile checkout [migliore pagina di pratiche di Facebook] (https://developers.facebook.com/docs/sharing/best-practices#crawl) per più e dettagli aggiornati su come rilevare i suoi crawler e scraper. Si noti che ** 'Facebot' ** è stato aggiunto all'elenco delle stringhe user-agent. – donut

+1

Il link di @ donut non include più le giuste informazioni. L'URL aggiornato è: https://developers.facebook.com/docs/sharing/webmasters/crawler – rinogo

+0

Inoltre, FWIW, sto utilizzando il seguente codice più a prova di futuro: 'if (strpos ($ _ SERVER [ "HTTP_USER_AGENT" ], "facebookexternalhit /")! == false || strpos ($ _ SERVER ["HTTP_USER_AGENT"], "Facebot")! == false) {/ * Probabilmente è bot di Facebook * /} ' – rinogo

13

Ecco il Facebook agente crawler User:

FacebookExternalHit/1.1 
FacebookExternalHit/1.0 

o

facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php) 
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 

Si noti che i numeri di versione potrebbero cambiare. Quindi usa un'espressione regolare per trovare il nome del crawler e quindi visualizzare il tuo contenuto.

Aggiornamento:

È possibile utilizzare questo codice in PHP per verificare la presenza di Facebook User Agent

if(preg_match('/^FacebookExternalHit\/.*?/i',$agent)){ 
    print "Facebook User-Agent"; 
    // process here for Facebook 
} 

Ecco il codice ASP.NET. È possibile utilizzare questa funzione per verificare se userAgent è useragent di Facebook.

public static bool IsFacebook(string userAgent) 
{ 
    userAgent = userAgent.ToLower(); 
    return userAgent.Contains("facebookexternalhit"); 
} 

Nota:

Perché si bisogno di farlo? Quando condividi un link al tuo sito su Facebook, Facebook lo scansiona e lo analizza per ottenere alcuni dati per visualizzare la miniatura, il titolo e alcuni contenuti della tua pagina, ma rimanderebbe al tuo sito.

Inoltre, penso che questo porterebbe al cloaking del sito, cioè visualizzando diversi dati all'utente e ai crawler. Cloaking non è considerato una buona pratica e può cercare motori e sito prenderne nota.

Aggiornamento: Facebook ha anche aggiunto un nuovo useragent a partire dal 28 maggio 2014

Facebot 

Si può leggere di più sul crawler facebook https://developers.facebook.com/docs/sharing/webmasters/crawler

+0

Leggi prima le Norme sulla privacy di Facebook! – mate64

+3

@msec: se Facebook non esegue la scansione della pagina, come fa a sapere i dettagli della pagina, come titolo, miniature, ecc.? –

15

"stringa UserAgent di Facebook è facebookexternalhit/1.1 (+ http://www.facebook.com/externalhit_uatext.php) ..."

Hi

piccola, ma importante, la correzione -> Facebook colpo esterno utilizza 2 diversi agenti utente:

facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php) 
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 

si Impostazione fitler a 1.1 solo può causare problemi di filtraggio con versione 1.0.

Per ulteriori informazioni su Facebook Bot (e altri bot), fare riferimento a Botopedia.org - una directory del bot basata su Comunity, fornita da Incapsula.

Oltre ai dati di user-agent, la directory offre anche un'opzione di verifica IP, che consente di effettuare una verifica incrociata di un IP/User-Agent, contribuendo così a prevenire i tentativi di impersonificazione.

3

soluzione a breve è quello di verificare modello, e non caricare tutto il caos per l'utente ogni volta

<?php 
    # Facebook optimized stuff 
    if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) { 
     $buffer.='<link rel="image_src" href="images/site_thumbnail.png" />'; 
    } 
?> 
+0

Non dimenticare un '! Empty ($ _ SERVER ['HTTP_USER_AGENT'])' poiché '$ _SERVER ['HTTP_USER_AGENT']' non è impostato quando il client non invia questa intestazione. –

1

In primo luogo non si dovrebbe usare in_array in quanto sarà necessario avere il programma utente completo e non solo un sottoinsieme , quindi si interromperà rapidamente con le modifiche (ad esempio la versione 1.2 di facebook non funzionerà se segui la risposta preferita corrente). È anche più lento iterare attraverso una matrice piuttosto che usare un modello regex.

Come senza dubbio si vorrà cercare più bot in seguito, quindi ho fornito l'esempio di seguito con 2 nomi di bot suddivisi in un pattern con il pipe | simbolo. il/i alla fine lo rende insensibile al maiuscolo/minuscolo.

Inoltre non si dovrebbe usare $ _SERVER ['HTTP_USER_AGENT']; ma dovresti filtrarlo per prima cosa nel caso in cui qualcuno sia stato un po 'brutto.

$pattern = '/(FacebookExternalHit|GoogleBot)/i'; 
$agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_ENCODED); 
    if(preg_match($pattern,$agent)){ 
     echo "found one of the patters"; 
    } 

Un codice un po 'più sicuro e più veloce.

0

Un altro approccio generico in PHP

$agent = $_SERVER['HTTP_USER_AGENT']; 
$agent = trim($agent); 
$agent = strtolower($agent); 
if (
strpos($agent,'facebookexternalhit/1.1')===0 
|| strpos($agent,'facebookexternalhit/1.0')===0 
){ 
    //probably facebook 
}else{ 
    //probably not facebook 
} 
1

E se si desidera bloccare facebook bot di accedere al sito web (supponendo che si sta usando Apache) aggiungere questo al vostro file di .htaccess:

<Limit GET POST> 
BrowserMatchNoCase "Feedfetcher-Google" feedfetcher 
BrowserMatchNoCase "facebookexternalhit" facebook 
order deny,allow 
deny from env=feedfetcher 
deny from env=facebook 
</Limit> 

Blocca anche feedfetcher di Google che può essere utilizzato anche per DDoSing a basso costo.

4

Si prega di notare che a volte l'agente è visionutils/0.2. Dovresti controllare anche per questo.

+0

C'è qualche prova per questo? –

+0

Quando stavo scrivendo uno script per rilevare Facebook e mostrargli contenuti difrent a volte l'useragent era visionutils/0.2. – Luchezar

+1

presumibilmente questo è un bot di riconoscimento facciale che si avvicina per raschiare qualsiasi immagine che potrebbe avere persone in esse. – reedstrm

1

Nella prospettiva di modifiche user-agent sul lato FB, è forse più sicuro utilizzare una regex del genere:

<?php 
if (preg_match("/facebook|facebot/i", $_SERVER['HTTP_USER_AGENT'])){ 
    do_something(); 
} 
?> 

Potete trovare ulteriori informazioni su Facebook crawler sul loro documento: https://developers.facebook.com/docs/sharing/webmasters/crawler