Как распознать Facebook User-Agent
при совместном использовании одной из моих страниц на FB Я хочу отобразить что-то другое. Проблема в том, что я предпочитаю не использовать OG: elements, а распознавать пользовательский агент FB.
Что это? Я не могу его найти.
спасибо
10 ответов
для списка строк user-agent найдите здесь. Наиболее часто используемые, по состоянию на сентябрь 2015 года,facebookexternalhit/*
и Facebot
. Поскольку вы не указали, на каком языке вы пытаетесь распознать user-agent, я не могу сообщить вам больше информации. Если вы хотите распознать Facebook bot в PHP, используйте
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
чтобы перечислить их возможные строки пользовательского агента, поэтому я обновил свой код, чтобы отразить изменение. Кроме того, код теперь более предсказуемы для возможных будущих изменений.
" строка пользовательского агента 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 - comunity-Sourced каталог бот, питание от Incapsula.
помимо данных агента пользователя, каталог также предлагает опцию проверки IP, позволяющую перекрестную проверку IP / агента пользователя, что помогает предотвратить попытки олицетворения.
вот пользовательский агент искателей 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 также добавил новый useragent по состоянию на 28 мая 2014
Facebot
вы можете узнать больше о Facebook crawler на https://developers.facebook.com/docs/sharing/webmasters/crawler
короткое решение-проверить шаблон, а не загружать весь беспорядок пользователю каждый раз
<?php
# Facebook optimized stuff
if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) {
$buffer.='<link rel="image_src" href="images/site_thumbnail.png" />';
}
?>
и если вы хотите заблокировать Facebook bot от доступа к вашему сайту (при условии, что вы используете Apache), добавьте это в свой :
<Limit GET POST>
BrowserMatchNoCase "Feedfetcher-Google" feedfetcher
BrowserMatchNoCase "facebookexternalhit" facebook
order deny,allow
deny from env=feedfetcher
deny from env=facebook
</Limit>
Он также блокирует feedfetcher google, который также может быть использован для дешевого DDoSing.
во-первых, вы не должны использовать in_array, поскольку вам нужно будет иметь полный пользовательский агент, а не только подмножество, таким образом, быстро сломается с изменениями (т. е. версия 1.2 от facebook не будет работать, если вы будете следовать текущему предпочтительному ответу). Также медленнее выполнять итерацию через массив, а не использовать шаблон регулярного выражения.
Как, без сомнения, вы захотите найти больше ботов позже, поэтому я привел пример ниже с 2 именами ботов, разбитыми на шаблон с трубой | символом. я в конец делает его нечувствительным к регистру.
также вы не должны использовать $_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";
}
немного более безопасный и быстрый код.
С точки зрения модификаций пользовательского агента на стороне FB, возможно, безопаснее использовать регулярное выражение:
<?php
if (preg_match("/facebook|facebot/i", $_SERVER['HTTP_USER_AGENT'])){
do_something();
}
?>
вы можете найти более подробную информацию о Facebook crawler на их doc:https://developers.facebook.com/docs/sharing/webmasters/crawler
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)
Я использую приведенный ниже код для обнаружения пользовательского агента FB в PHP, и он работает по назначению:
$agent = $_SERVER['HTTP_USER_AGENT'];
if(stristr($agent, 'FacebookExternalHit')){
//Facebook User-Agent
}else{
//Other User-Agent
}
другой общий подход в 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
}