Как распознать Facebook-агент

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

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

Ответ 1

Для списка строк пользовательского агента найдите здесь. Наиболее используемыми по состоянию на сентябрь 2015 года являются facebookexternalhit/* и Facebot. Поскольку вы не указали, на каком языке вы пытаетесь распознать пользовательский агент, я не могу рассказать вам больше информации. Если вы хотите распознать Facebook-бот в PHP, используйте

if (
    strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false ||          
    strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false
) {
    // it is probably Facebook bot
}
else {
    // that is not Facebook
}

ОБНОВЛЕНИЕ. Facebook добавил Facebot в список своих возможных строк пользовательского агента, поэтому я обновил свой код, чтобы отразить это изменение. Кроме того, код теперь более предсказуем для возможных будущих изменений.

Ответ 2

"Пользовательская строка пользователя 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 Bot (и других ботах), пожалуйста, обратитесь к Botopedia.org - директорию ботов, принадлежащей Comunity-Sourced, на базе Incapsula.

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

Ответ 3

Вот пользовательский агент Google Crawlers:

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 User Agent

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

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

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

Facebot

Вы можете узнать больше об искателе facebook на https://developers.facebook.com/docs/sharing/webmasters/crawler

Ответ 4

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

Ответ 5

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

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

Ответ 6

Во-первых, вы не должны использовать 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"; 
   }

Более безопасный и быстрый код.

Ответ 7

И если вы хотите заблокировать ботов 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 FeedFetcher, который также может использоваться для дешевого DDoSing.

Ответ 8

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

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

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

Ответ 9

Агенты пользователей 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
}

Ответ 10

Другой общий подход в 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
}

Ответ 11

У вас уже есть ответ для Facebook выше, но один из способов получить любого пользовательского агента - это разместить скрипт на вашем сайте, который будет отправлять вам письма при его посещении. Например, создайте этот файл в своем домене, например, по адресу https://example.com/user-agent.php:

<?php
    mail('[email protected]', 'User Agent', $_SERVER['HTTP_USER_AGENT']);

Затем зайдите на Facebook, введите там ссылку на скрипт и нажмите пробел. Вам на самом деле ничего не нужно делиться, просто набрав ссылку, и пробел заставит Facebook получить предварительный просмотр. Затем вы должны получить электронное письмо с пользовательским агентом Facebook.


Enter the link on Facebook

Get an email with the user agent