Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Определение браузера пользователя.


Автор: Alexzander 10.7.2005, 16:46
Для этого есть много модулей... тот же LWP, но в некотором плане они слишком "мощные". Хочется написать свою "универсальную" функцию, чтобы, например, записывать в лог типы браузеров.
Строки 'HTTP_USER_AGENT' различных типов браузеров можно посмотреть здесь http://www.zytrax.com/tech/web/browser_ids.htm

Вот что у меня получилось:
Код

sub GetUserAgent
{ 
  # спасибо Lee Semel - HTTP::BrowserDetect 
  #
  my $user_agent = lc($ENV{'HTTP_USER_AGENT'});
  my( $browser, $version );
  # проверка для MSIE
  if( index($user_agent,"compatible;") != -1 && 
     index($user_agent,"webtv") == -1 &&
     index($user_agent,"opera") == -1 &&
     index($user_agent,"msie") != -1)  
  {
    # похоже это MS IE
    ($version) = ($user_agent =~ / 
                  compatible;       
                  \s*
                  \w*            # имя браузера
                  [\s|\/]        # разделитель имени и версии
                  ([^;]*)        # все, что до ';' принимаем за версию браузера
                  ;
                  /x);
    $browser = 'MSIE';    
  }
  
  # проверка для браузеров, использующих gecko
  if( index($user_agent,"gecko") != -1 ) 
  {
    # firefox
    if( $user_agent =~ /(firefox|firebird|phoenix)/ )
    {  ($browser, $version) = ($user_agent =~ /(firefox|firebird|phoenix)\/([\.\d]*)/);  }
    # netscape
    else
    {  
      if( index($user_agent, "netscape") != -1 || index($user_agent, "nsb") != -1 )
      {
        ($version) = ($user_agent =~ /\/([\.\d]*)/); 
        $browser = 'Netscape';
      }
      else
      {
        # если это ни firefox ни netscape, но с gecko, то, наверное, это Mozilla
        if( index($user_agent, "mozilla") != -1 )
        {
          ($version) = ($user_agent =~ /\/([\.\d]*)/); 
          $browser = 'Mozilla';
        }
      }
    }
  }  
  
  # Самый "интересный" браузер Opera
  if( index($user_agent,"opera") != -1 )
  {
    ($version) = ($user_agent =~ /opera[\/\s]([\.\d]*)/);
    $browser = 'Opera';
  }
  
  # Safari ( браузер MAC OS )
  if( index($user_agent, "safari") != -1 ) # надо полагать, что старые версии Safari называли себя "applewebkit"
  {  
    ($version) = ($user_agent =~ /\/([\.\d]*)/);  
    $browser = 'Safari';
  } 
  
  # Если браузер не является ни одним из вышеперечисленных, то попробуем определить его имя и версию.
  # ^(\w*)[\/\s]([\.\d]*) - строка, где имя браузера стоит на первом месте, 
  # например AmigaVoyager/3.4.4 (MorphOS/PPC native)
  # \s+(\w*)[\/\s]([\.\d]*) - например, Mozilla/4.0 (compatible; MSIE 6.0; WINDOWS; .NET CLR 1.1.4322)
  unless( $browser )
  {  ($browser, $version) = ($user_agent =~ /^(\w*)[\/\s]([\.\d]*)|\s+(\w*)[\/\s]([\.\d]*)/);  }
  
  return( $browser ? ($browser .' '. ( $version ? $version : '?' )) : 'unknown' );
}



Это только "флагманские агенты", есть желание добавить еще.
Собственно, вопросов особо нет... единственно.. не уверен, какие браузеры следует определять.. т.е. кроме "основных" под Win

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)