如何识别Facebook用户代理

时间:2011-12-24 20:49:04

标签: facebook user-agent

在FB上分享我的一个页面时,我希望显示不同的内容。问题是,我不想使用og:elements,而是识别FB用户代理。

这是什么?我找不到了。

由于

11 个答案:

答案 0 :(得分:103)

要查看用户代理字符串列表,请查找here。截至2015年9月,最常用的是facebookexternalhit/*Facebot。由于您尚未说明您尝试识别用户代理的语言,因此我无法告诉您更多信息。如果您确实想要在PHP中识别Facebook bot,请使用

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
}

更新:Facebook已将Facebot添加到其可能的用户代理字符串列表中,因此我更新了我的代码以反映更改。此外,代码现在更容易被未来可能的变化所预测。

答案 1 :(得分:16)

  

“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提供支持的社区来源机器人目录。

除了用户代理数据外,该目录还提供IP验证选项,允许您交叉验证IP /用户代理,从而有助于防止模拟尝试。

答案 2 :(得分:14)

以下是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的使用者。

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

注意:

你为什么要这样做?当您在Facebook上共享指向您网站的链接时,Facebook会对其进行抓取并对其进行解析,以获取一些数据以显示您网页上的缩略图,标题和部分内容,但它会链接回您的网站。

此外,我认为这会导致隐藏网站,即向用户和抓取工具显示不同的数据。伪装不被认为是一种好的做法,搜索引擎和网站可能会注意到它。

更新:截至2014年5月28日,Facebook还添加了新的用户

Facebot

您可以在https://developers.facebook.com/docs/sharing/webmasters/crawler

上阅读有关facebook抓取工具的更多信息

答案 3 :(得分:4)

请注意有时代理是visionutils/0.2。你也应该检查一下。

答案 4 :(得分:3)

简短的解决方案是检查模式,而不是每次都将所有混乱加载到用户

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

答案 5 :(得分: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"; 
   }

更安全,更快速的代码。

答案 6 :(得分:1)

如果你想阻止facebook bot访问你的网站(假设你正在使用Apache),请将其添加到你的.htaccess文件中:

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

它还会阻止google的feedfetcher,它也可以用于廉价的DDoSing。

答案 7 :(得分:1)

从FB方面的用户代理修改的角度来看,使用这样的正则表达式可能更安全:

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

您可以在他们的文档中找到有关Facebook抓取工具的更多信息:https://developers.facebook.com/docs/sharing/webmasters/crawler

答案 8 :(得分:1)

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)
facebookexternalhit/1.0 (+https://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1 (+https://www.facebook.com/externalhit_uatext.php)

我使用下面的代码在PHP中检测FB User-Agent,它按预期工作:

$agent = $_SERVER['HTTP_USER_AGENT'];
if(stristr($agent, 'FacebookExternalHit')){
    //Facebook User-Agent
}else{
    //Other User-Agent
}

答案 9 :(得分: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
}

答案 10 :(得分:0)

您已经在上面找到了针对Facebook的答案,但是获取任何用户代理的一种方法是在您的网站上放置一个脚本,该脚本在访问该网站时就会向您发送邮件。例如,在您的域上,例如https://example.com/user-agent.php上创建此文件:

<?php
    mail('you@youremail.com', 'User Agent', $_SERVER['HTTP_USER_AGENT']);

然后,访问Facebook,并在此处键入指向脚本的链接,然后按空格键。实际上,您不必共享任何内容,只需输入链接,空格将使Facebook获取预览。然后,您应该收到Facebook用户代理的电子邮件。


Enter the link on Facebook

Get an email with the user agent