2011-12-24 40 views
48

在FB上共享我的一個頁面時,我想顯示一些不同的內容。問題是,我不想使用og:元素,而是去識別FB用戶代理。如何識別Facebook用戶代理

這是什麼?我找不到它。

感謝

+1

'如果(strpos($ _ SERVER [ 'HTTP_USER_AGENT' ],'facebookexternalhit')!== false){...}' – Xeoncross 2015-01-30 18:46:54

回答

95

對於用戶代理字符串列表,查找here。截至2015年9月,使用最多的是facebookexternalhit/*Facebot。由於您尚未說明您嘗試識別用戶代理的語言,因此我無法告訴您更多信息。如果你想認識PHP Facebook的機器人,使用

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已經增加Facebot其可能的用戶代理字符串列表,所以我已經更新了我的代碼以反映更改。此外,代碼現在可以更好地適應未來可能發生的變化。

+7

您可以結帳[Facebook的最佳實踐頁面](https://developers.facebook.com/docs/sharing/best-practices#crawl)瞭解更多以及關於如何檢測其抓取工具和刮板的最新細節。請注意,** Facebot **已被添加到用戶代理字符串列表中。 – donut 2014-12-05 23:03:21

+1

@甜甜圈的鏈接不再包含正確的信息。更新後的URL是:https://developers.facebook.com/docs/sharing/webmasters/crawler – rinogo 2015-09-16 21:08:24

+0

另外,FWIW,我使用了以下更多面向未來的代碼:'if(strpos($ _ SERVER [「HTTP_USER_AGENT」 ],「facebookexternalhit /」)!== false || strpos($ _ SERVER [「HTTP_USER_AGENT」],「Facebot」)!== false){/ *這可能是Facebook的bot * /}' – rinogo 2015-09-16 21:11:42

13

以下是Facebook的爬蟲用戶代理:

FacebookExternalHit/1.1 
FacebookExternalHit/1.0 

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

注意,版本號可能會改變。因此,請使用正則表達式來查找搜尋器名稱,然後顯示您的內容。

更新

您可以使用此代碼在PHP檢查Facebook的用戶代理

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

下面是ASP.NET代碼。你可以使用這個函數來檢查userAgent是否是Facebook的useragent。

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

注:

爲什麼你需要做的是什麼?當您在Facebook上分享您網站的鏈接時,Facebook會抓取它並解析它以獲取一些數據以顯示頁面中的縮略圖,標題和一些內容,但它會鏈接回您的網站。

此外,我認爲這會導致網站隱藏,即向用戶和爬蟲顯示不同的數據。僞裝並不被認爲是一種好的做法,搜索引擎和網站可能會記錄下來。

更新:Facebook的還增加了一個新的用戶代理爲5月28日的2014

Facebot 

你可以閱讀更多關於Facebook的履帶上https://developers.facebook.com/docs/sharing/webmasters/crawler

+0

請先閱讀Facebook的隱私政策! – mate64 2012-04-20 17:43:45

+3

@msec:如果Facebook不抓取頁面,它如何知道頁面的細節,如標題,縮略圖等? – 2012-07-26 19:48:14

15

「Facebook的用戶代理字符串facebookexternalhit/1.1(+ http://www.facebook.com/externalhit_uatext.php)...「

小,但重要的是,修正 - > Facebook的外部命中使用2個不同的用戶代理:

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

設置你fitler到1.1只可能會導致過濾問題與1.0版本。

有關Facebook Bot(以及其他機器人)的更多信息,請參考Botopedia.org - 由Incapsula提供的Comunity-Sourced bot目錄。

除了用戶代理數據,該目錄還提供IP驗證選項,允許您交叉驗證IP /用戶代理,從而有助於防止模仿企圖。

3

簡短的解決方案是檢查模式,不加載所有的爛攤子用戶每次

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

不要忘記'!empty($ _ SERVER ['HTTP_USER_AGENT'])',因爲當客戶端不發送該頭部時,未設置$ _SERVER ['HTTP_USER_AGENT']'。 – 2016-05-15 22:13:59

1

首先你不應該使用in_array,你需要有完整的用戶代理,而不僅僅是一個子集,因此會隨着更改而迅速崩潰(即如果您按照當前的首選答案,則Facebook的1.2版將無法使用)。迭代遍歷一個數組,而不是使用正則表達式模式也慢。

毫無疑問,您將在稍後尋找更多機器人,因此我給出了下面的示例,其中2個機器人名稱使用管道模式分割爲一個模式|符號。/i最後會使其不區分大小寫。

另外你不應該使用$ _SERVER ['HTTP_USER_AGENT'];但你應該先過濾一下有人曾經有過一些令人討厭的東西存在於那裏。

$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"; 
    } 

更安全快速的代碼。

0

在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

如果你想訪問你的網站阻止Facebook的機器人(假設你使用Apache)添加到您的.htaccess文件的另一種通用的方法:

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

它也阻止谷歌的feedfetcher,也可以用於廉價的DDoSing。

4

請注意,有時經紀人是visionutils/0.2。你也應該檢查一下。

+0

有沒有這方面的證據? – 2014-08-02 11:20:38

+0

當我編寫一個腳本來檢測Facebook並向他展示不同的內容時,useragent有時是visionutils/0.2。 – Luchezar 2014-08-03 16:17:22

+1

大概這是一個面部識別機器人來抓取任何可能有人在其中的圖像。 – reedstrm 2014-10-09 16:39:35