Как распознать Facebook User-Agent - PullRequest
53 голосов
/ 25 декабря 2011

Когда я делюсь одной из моих страниц на FB, я хочу показать что-то другое. Проблема в том, что я предпочитаю не использовать элементы og:, а распознавать пользовательский агент FB.

Что это? Я не могу найти это.

Ответы [ 11 ]

103 голосов
/ 25 декабря 2011

Список строк user-agent ищите здесь . Наиболее используемыми по состоянию на сентябрь 2015 года являются facebookexternalhit/* и Facebot. Поскольку вы не указали, на каком языке вы пытаетесь распознать пользовательский агент, я не могу рассказать вам больше информации. Если вы хотите узнать бота Facebook в 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 в список возможных строк агента пользователя, поэтому я обновил свой код, чтобы отразить это изменение. Кроме того, код теперь более предсказуем для возможных будущих изменений.

16 голосов
/ 14 августа 2012

"Строка агента пользователя 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) 

Установка только для вас фитлера 1.1 может вызвать проблемы с фильтрацией в версии 1.0.

Для получения дополнительной информации о боте Facebook (и других ботах), пожалуйста, обратитесь к Botopedia.org - каталог ботов из Comunity-Sourced, работающий на Incapsula.

Помимо данных агента пользователя, в каталоге также имеется опция проверки IP, позволяющая перекрестную проверку IP / агента пользователя, что помогает предотвратить попытки олицетворения.

14 голосов
/ 25 декабря 2011

Вот пользовательский агент сканеров 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 сканирует ее и анализирует, чтобы получить некоторые данные для отображения миниатюры, заголовка и некоторого содержимого на вашей странице, но при этом будет возвращаться ссылка на ваш сайт.

ТакжеЯ думаю, это привело бы к маскировке сайта, то есть отображению различных данных для пользователя и сканеров.Клоакинг не считается хорошей практикой и может быть замечен поисковыми системами и сайтом.

Обновление : Facebook также добавил новый пользовательский агент с 28 мая 2014 года

Facebot

Подробнее о сканере facebook можно узнать на https://developers.facebook.com/docs/sharing/webmasters/crawler

4 голосов
/ 18 мая 2014

Обратите внимание, что иногда агент visionutils/0.2. Вы должны проверить это тоже.

3 голосов
/ 13 апреля 2013

Короткое решение - проверять шаблон, а не загружать весь беспорядок пользователю каждый раз

<?php
    # Facebook optimized stuff
    if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) {
        $buffer.='<link rel="image_src" href="images/site_thumbnail.png" />';
    }
?>
1 голос
/ 07 мая 2015

Агентами пользователей 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 User-Agent в PHP, и он работает как задумано:

$agent = $_SERVER['HTTP_USER_AGENT'];
if(stristr($agent, 'FacebookExternalHit')){
    //Facebook User-Agent
}else{
    //Other User-Agent
}
1 голос
/ 29 апреля 2015

С точки зрения модификации пользовательского агента на стороне FB, возможно, безопаснее использовать регулярное выражение, подобное этому:

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

Более подробную информацию о сканере Facebook вы можете найти в их документе: https://developers.facebook.com/docs/sharing/webmasters/crawler

1 голос
/ 27 апреля 2014

И если вы хотите заблокировать доступ бота из 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>

Он также блокирует фидчер Google, который также может бытьиспользуется для дешевого DDoSing.

1 голос
/ 06 января 2014

Во-первых, вы не должны использовать in_array, так как вам понадобится полный пользовательский агент, а не просто подмножество, поэтому он быстро порвет с изменениями (т. Е. Версия 1.2 с Facebook не будет работать, если вы будете следовать текущему предпочтительному ответу). Также итерация массива выполняется медленнее, чем использование шаблона регулярных выражений.

Поскольку, без сомнения, вы захотите поискать больше ботов позже, поэтому я привел приведенный ниже пример с двумя именами ботов, разделенными по шаблону с помощью pipe | условное обозначение. / 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 голосов
/ 16 июля 2019

У вас уже есть ответ для 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

...