ГлавнаяСтатьиФотографияМатериалыКарта узлаО себе(версия для печати)

PHP-сценарий для распознавания типа клиента по User-Agent заголовку

Для подсчета статистики посещяемости сайта иногда интересна статистика типов клиентских приложений. Каждое пользовательское приложение вправе формировать произвольную строку User-Agent в HTTP-заголовке. Но большинство популярных навигаторов придерживается своих традиций, поэтому зачастую удается уверенно распознать на стороне сервера то или иное клиентское приложение.

Описание

Ниже приведена функция GetAgentName (Group,Agent), которая распознает тип клиентского приложения по строке User-Agent в заголовке HTTP-запроса. В случае успеха функция возвращает true и записывает в переменную Agent имя и номер версии клиентского приложения, а в переменную Group — название группы, к которой оно относится.

Для сканирующих роботов выделены 2 группы: Search engines и Advert optimizers.

function GetAgentName ( & $GroupName, & $AgentName )
{
  global $_SERVER;
  $GroupName = 'other';
  $AgentName = 'other agents';
 
  $BrowsCaps = array (
    'Search engines' => array (
      'Aport' => array (
        '^Mozilla/5\.0 \(compatible; AportWorm/(.)+\)$',
      ),
      'Cuil' => array (
        '^Mozilla/5.0 \(Twiceler-0.9 http://www.cuil.com/twiceler/robot.html\)$',
      ),
      'Google' => array (
        '^(.)*Googlebot(.)*',
        '^FeedFetcher-Google(.)*',
        '^Googlebot-Image(.)*',
      ),
      'Hatena' => array (
        '^Hatena Antenna(.)+',
      ),
      'Mail.Ru' => array (
        '^Mail.Ru/(.)+',
      ),
      'MSN search bot' => array (
        '^msnbot(.)*',
      ),
      'Rambler' => array (
        '^StackRambler(.)+',
      ),
      'Yahoo!' => array (
        '^Mozilla/5\.0(.)+Yahoo!(.)+Slurp(.)+',
      ),
      'Yandex' => array (
        '^Yandex(.)+',
      )
    ),
 
    'Advert optimizer' => array (
      'Google advert optimizer' => array (
        '^Mediapartners-Google(.)*',
      ),
    ),
 
    'Chrome' => array (
      'Chrome 1.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Chrome/1(.)+ Safari/(.)+',
      ),
      'Chrome 2.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Chrome/2(.)+ Safari/(.)+',
      ),
      'Chrome 3.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Chrome/3(.)+ Safari/(.)+',
      ),
      'Chrome 4.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Chrome/4(.)+ Safari/(.)+',
      ),
      'Chrome 5.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Chrome/5(.)+ Safari/(.)+',
      ),
    ),
 
    'Konqueror' => array (
      'Konqueror 1.x' => array (
        '^(.)+Konqueror(.)+',
      ),
      'Konqueror 2.x' => array (
        '^(.)+Konqueror/2(.)+',
      ),
      'Konqueror 3.x' => array (
        '^(.)+Konqueror/3(.)+',
      ),
      'Konqueror 4.x' => array (
        '^(.)+Konqueror/4(.)+',
      ),
    ),
 
    'Netscape Navigator' => array (
      'Netscape 2.x' => array (
        '^Mozilla/2\.(\d)+\((.)+\)$',
      ),
      'Netscape 3.x' => array (
        '^Mozilla/3\.(\d)+\((.)+\)$',
      ),
      'Netscape 4.x' => array (
        '^Mozilla/4\.(\d)+\((.)+\)$',
      ),
      'Netscape 6.x' => array (
        '^Mozilla/5\.0(.)*Netscape6/6\.(.)+',
      ),
      'Netscape 7.x' => array (
        '^Mozilla/5\.0(.)*Netscape*/7\.(.)+',
      ),
    ),
 
    'FireFox' => array (
      'FireFox 1.x' => array (
        '^(.)*Firefox/1(.)+',
       ),
      'FireFox 2.x' => array (
        '^(.)*Firefox/2(.)+',
       ),
      'FireFox 3.x' => array (
        '^(.)*Firefox/3(.)+',
       ),
    ),
 
    'Opera' => array (
      'Opera 4.x' => array (
        '^(.)+Opera 4\.(.)+',
      ),
      'Opera 5.x' => array (
        '^(.)+Opera 5\.(.)+',
      ),
      'Opera 6.x' => array (
        '^(.)+Opera 6\.(.)+',
        '^Opera/6\.(.)*',
      ),
      'Opera 7.x' => array (
        '^Mozilla/(.)*Opera 7\.(.)+',
        '^Opera/7\.(.)+',
      ),
      'Opera 8.x' => array (
        '(.)*Opera 8\.(.)+',
        '(.)*Opera/8\.(.)+',
      ),
      'Opera 9.x' => array (
        '(.)*Opera/9\.(.)+',
      ),
      'Opera 10.x' => array (
        '(.)*Opera/10\.(.)+',
      ),
    ),
 
    'Internet Explorer' => array (
      'IE 3.x' => array (
        '^Mozilla/2\.0 \(compatible; MSIE 3\.(.)+',
      ),
      'IE 4.x' => array (
        '^Mozilla/4\.0 \(compatible; MSIE 4\.(.)+',
      ),
      'IE 5.x' => array (
        '^Mozilla/4\.0 \(compatible; MSIE 5\.(.)+',
      ),
      'IE 6.x' => array (
        '^Mozilla/.\.0 \(compatible; MSIE 6\.(.)+',
      ),
      'IE 7.x' => array (
        '^Mozilla/.\.0 \(compatible; MSIE 7\.(.)+',
      ),
      'IE 8.x' => array (
        '^Mozilla/.\.0 \(compatible; MSIE 8\.0(.)+Trident/4\.0(.)+',
      ),
    ),
 
    'Safari' => array (
      'Safari 4.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Version/4(.)+ Safari(.)+',
      ),
      'Safari 3.x' => array (
        '^(.)+ AppleWebKit/(.)+ \(KHTML, like Gecko\) Version/3(.)+ Safari(.)+',
      ),
    ),
 
    'SeaMonkey' => array (
      'SeaMonkey 1.x' => array (
        '^Mozilla(.)+ Gecko(.)+ SeaMonkey/1(.)+',
      ),
    ),
 
    'WebCopier' => array (
      'WebCopier 5.x' => array (
        '^WebCopier v5\.0$',
      ),
    ),
  );
 
  $CurrentAgentCap = $_SERVER['HTTP_USER_AGENT'];
 
  foreach ( $BrowsCaps as $Group => $Agents )
    foreach ( $Agents as $Agent => $AgentCaps )
    {
      foreach ( $AgentCaps as $Cap )
      {
        if ( preg_match ( $Cap, $CurrentAgentCap ) )        
        {
          $GroupName = $Group;
          $AgentName = $Agent;
          break;
        }
      }
      if ( !empty ( $BrowserName ) ) break;
    }
  return empty ( $BrowserName ) ? false : true;
}

28 февраля 2009—07 мая 2010
Максим Проскурня
1997–2024 Axofiber, axofiber.info