【发布时间】:2012-01-27 10:45:49
【问题描述】:
在 FB 上分享我的一个页面时,我想展示一些不同的东西。问题是,我不喜欢使用 og: 元素,而是要识别 FB 用户代理。
这是什么?没找到。
【问题讨论】:
-
if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') !== false) { ... }
标签: facebook user-agent
在 FB 上分享我的一个页面时,我想展示一些不同的东西。问题是,我不喜欢使用 og: 元素,而是要识别 FB 用户代理。
这是什么?没找到。
【问题讨论】:
if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') !== false) { ... }
标签: facebook user-agent
您已经获得了上述 Facebook 的答案,但获得任何用户代理的一种方法是在您的网站上放置一个脚本,当您访问它时,它会向您发送邮件。例如,在您的域上创建此文件,例如 https://example.com/user-agent.php:
<?php
mail('you@youremail.com', 'User Agent', $_SERVER['HTTP_USER_AGENT']);
然后,访问 Facebook,在其中键入脚本的链接,然后按空格键。您实际上不必分享任何内容,只需输入链接和空格即可让 Facebook 获取预览。然后,您应该会收到一封包含 Facebook 用户代理的电子邮件。
【讨论】:
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
}
【讨论】:
这里是 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 会抓取并解析它以获取一些数据以显示您页面中的缩略图、标题和一些内容,但它会链接回您的网站。
另外,我认为这会导致网站伪装,即向用户和爬虫显示不同的数据。伪装不被认为是一种好的做法,搜索引擎和网站可能会注意到它。
更新:自 2014 年 5 月 28 日起,Facebook 还添加了新的用户代理
Facebot
您可以在https://developers.facebook.com/docs/sharing/webmasters/crawler 上阅读有关 Facebook 爬虫的更多信息
【讨论】:
有关用户代理字符串的列表,请查找 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 添加到可能的用户代理字符串列表中,因此我更新了代码以反映更改。此外,代码现在更容易预测未来可能发生的变化。
【讨论】:
Facebot 已添加到用户代理字符串列表中。
if(strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false || strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false) { /* It's probably Facebook's bot */ }
从 FB 端的用户代理修改的角度来看,使用这样的正则表达式可能更安全:
<?php
if (preg_match("/facebook|facebot/i", $_SERVER['HTTP_USER_AGENT'])){
do_something();
}
?>
您可以在他们的文档中找到有关 Facebook 爬虫的更多信息:https://developers.facebook.com/docs/sharing/webmasters/crawler
【讨论】:
首先,您不应该使用 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";
}
更安全、更快的代码。
【讨论】:
请注意有时代理是visionutils/0.2。你也应该检查一下。
【讨论】:
如果您想阻止 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>
它还阻止了谷歌的 feedfetcher,它也可用于廉价的 DDoSing。
【讨论】:
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
}
【讨论】:
简短的解决方案是检查模式,而不是每次都将所有混乱都加载给用户
<?php
# Facebook optimized stuff
if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) {
$buffer.='<link rel="image_src" href="images/site_thumbnail.png" />';
}
?>
【讨论】:
!empty($_SERVER['HTTP_USER_AGENT']),因为在客户端不发送此标头时未设置$_SERVER['HTTP_USER_AGENT']。
“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/用户代理,从而有助于防止假冒尝试。
【讨论】: