28 августа 2008 в 20:12

Что PHP может узнать о браузере посетителя?

PHP*

О чем это?


Возможно ли узнать более детальную информацию о браузере посетителя кроме строки, содержащейся в $_SERVER[«HTTP_USER_AGENT»]: поддерживает ли яву, апплеты, таблицы стилей и фреймы? А может это вообще гуглобот зашел?


Предистория


Захотелось заказчику, чтобы при заходе на сайт отображался его любимый логотип с пробегающей по нему искоркой света… Уговорить отказаться от этой идеи человека я так и не смог, но в итоге мы решили, что радость эта будет отображаться только раз, и только при заходе на главную страницу. Если человек попал на сайт с поисковика, он сразу переходит на страницу. Если он руками вписывает адрес в браузер, он перенаправляется на страницу с анимацией. После успешного отображения в куки пишется маркер, и видео больше не грузится. Но… Если на сайт зайдет не человек, а поисковик, то писать себе куки он не будет. Поэтому он всегда будет натыкаться на страницу с анимацией, и в выдаче поисковиков мы себя так и не увидим. Да и зачем поисковику логотип компании видеть :)

Как можно узнать что-либо о браузере клиента


Проблема в итоге была решена методом поиска подстроки имен пауков нескольких известных поисковиков в переменной $_SERVER[«HTTP_USER_AGENT»]. Но перед этим я походил по ману и обнаружил интересную функцию get_browser(). Она умеет выдавать массив параметров браузера гостя нашего сайта, назначения половины которых, правда, я так и не понял :) Единственная тонкость работы этой функции в том, что она требует наличия на хосте свежей версии файла browscap.ini, а также настройки php.ini. Очевидно что нашим ленивым (просьба не обижаться) админам влом постоянно обновлять этот файлик, так что на это обычно забивают и функция попросту недоступна. Проверить это можно, заглянув в phpinfo(), отыскав там диррективу browscap, и ничуть не удивившись что напротив нее гордо красуется надпись «no value», приступить к прочтению следующего параграфа.

Что же делать


Для начала нам нужен сам файл browscap.ini. Его можно скачать с http://browsers.garykeith.com/. Может он есть и еще где-то, но данный источник рекомендуемый для скачивания самим PHP, по-этому пользуемся именно им.
Возникает вопрос: а куда нам, собственно, теперь его пристроить? Админ нас к серверу не подпустит, да и в настройках ковыряться не даст. По-этому надо бы поискать другой вариант. А их в сети нашлось целых два.

Тут находятся детальные и простые инструкции по запуску. Если вкратце, остается скачать нужную библиотеку, подключить в нужное место, и вызвать соответствующую функцию. Для Browser Capabilities PHP Project вызов выглядит вот так:

if(ini_get('browscap'))
{
//неленивые админы попались

/* старт шутки */
//вероятность выполнение участка кода стремится к нулю поэтому пишем сюда
echo "Начальство - ты меня задрало!";
/* конец шутки - всем смеяться :)*/

$browserInfo=get_browser();

}
else
{
//используем нашу библиотеку
require_once('browscap.php');
$bc = new Browscap('path/to/the/cache/dir');
$browserInfo=$bc->getBrowser();

}


в результате чего получим примерно следующее
stdClass Object
(
[browser_name] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18
[browser_name_regex] => ^mozilla/5\.0 \(macintosh; .; .*mac os x.*\) applewebkit/.* \(.*\) version/3\.1.* safari/.*$
[browser_name_pattern] => Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*
[Parent] => Safari 3.1
[Platform] => MacOSX
[Browser] => Safari
[Version] => 3.1
[MajorVer] => 3
[MinorVer] => 1
[Frames] => 1
[IFrames] => 1
[Tables] => 1
[Cookies] => 1
[BackgroundSounds] => 1
[JavaApplets] => 1
[JavaScript] => 1
[CSS] => 2
[CssVersion] => 2
[supportsCSS] => 1
[Alpha] =>
[Beta] =>
[Win16] =>
[Win32] =>
[Win64] =>
[AuthenticodeUpdate] =>
[CDF] =>
[VBScript] =>
[ActiveXControls] =>
[Stripper] =>
[isBanned] =>
[WAP] =>
[isMobileDevice] =>
[isSyndicationReader] =>
[Crawler] =>
[AOL] =>
[aolVersion] => 0
[netCLR] =>
[ClrVersion] => 0
)


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

Куда применять эту функцию, надеюсь, каждый найдет для себя сам :)

mayhem @mayhem
карма
38,9
рейтинг 0,0
Пользователь
Самое читаемое Разработка

Комментарии (33)

  • –5
    Под кат. Бегом.
    • +6
      он там и был :) ввело в заблуждение то, что тег парный, поэтому хотел скрыть начало и конец. оказалось что тогда кат срывается совсем :)
  • +2
    Эх, почему так всегда, я вот только позавчера с подобной проблемой мучался. Все решил вроде. А сейчас вот такая статья. Но все же спасибо. Добавлю в избранное, тут параметров больше, чем у моей функции.
    • +4
      меня и в избранное? ой… :)
      • +3
        Хорошие скрипты, которые могут помочь в работе, я всегда добавляю в избранное. Этот именно такой. Еще раз спасибо)
  • +3
    В целом наличие сторонних разработок, повторяющих весь функционал get_browser() — полезная вещь :) Главное не забывать, что это исключительно свойства браузера, и, скажем, $browserInfo->JavaScript == 1 ещё не гарантирует, что он включён.
    • +1
      таки да, надо бы дообьяснить
  • –7
    было бы хорошо иметь нормальный способ получить разрешение монитора и его DPI и размер окна браузера пока те что я знаю уж очень кривые js
    • +5
      так такие вещи кроме как клиент-сайд скриптингом и не получишь…
  • +3
    скрипт к сожалению не идеален. Если зайти из под оперы, которая маскируется под лису, т.е. Mozilla/5.0 (Windows NT 5.1; U; ru; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.52 многие параметры начинают бажить.
    Для исправления всего-то надо чекать сначала, является ли оперой или нет
    Есди да, определяем версию. Если нет, чекаем на соответсвие другим браузерам.
  • +2
    Чтоб в поисковиках показываться… а за клоакинг в бан не попадёте?
    • +1
      при чем тут клоакинг? я ж не отсылаю поисковик на спец-страничку. Наоборот, я не даю ему попасть в тупик и вывожу на сайт. Это как nofollow для гиперссылки.
  • 0
    В избранное, понадобится)) Спс))
  • –1
    всегда использую javascript для узнавания такого рода информации :)
  • 0
    Оригинально, спс, побольше бы узнать о таких плюшках…
  • –4
    Хороший вопрос поднят в начале топика «о чем это?», но главный вопрос «зачем это?» совсем не раскрыт. Получилось что-то вроде игрушки — поиграться и выбросить. Все равно будут пользоваться javascript…
    • 0
      Вы правы, это скорее для очень специфичных случаев, раньше это было очень необходимо, до появления HTML 2.0 скажем, сейчас редко используется сервер — сайд определение браузера для фиксов верстки. В тоже время отлично подойдет для скрипта статистики. Функция get_browser в php появилась в 2000ом году, это о чем то говорит :)

      Хоть люди из Mozilla и утверждают, что этот документ только история, все равно полезно прочитать — The Ultimate JavaScript Client Sniffer и Browser Detection and Cross Browser Support
      • 0
        Скрипт статистики средствами PHP — довольно спорная идея. Зачем изобретать очередной велосипед, если существует достаточно решений на клиентской части?
  • –1
    цитирование мануала, клёво :-)
    ps: пхп знает о клиенте не больше апача, перла, и прочих руби и питонов
    так что тему можно переименовать, а всё изложение свести к тому, что вся инфа недостоверна и передаётся в заголовках
    • 0
      В одном моем проекте ребром стал вопрос о необходимости узнать браузер юзера с точностью до ста процентов, долго собирал заголовки браузеров и нашел некоторую закономерность. Думаю, сейчас это уже в прошлом, но два года назад именно порядок заголовков помог задетектить браузер.
      • 0
        100% точность невозможна
        решения у задачи не существует
        причина: rfc http
        • 0
          Стопроцентной вероятности конечно нет. А указывать причиной документ, определяющий стандарты сервера и браузера — неоправданный бред. Можно поменять строку с юзер агентом, но очередность тех же заголовков RFC не определяет.
          • –4
            указанный документ определяет не стандарты сервера и браузера, а стандарты протокола их общения. и как раз в этом документе описано, как может (не «должен») идентифицировать себя браузер.
            так что с бредом вы, конечно же, поторопились.
            перечитайте, пожалуйста, мой пост ещё раз. я не утверждал, что очерёдность заголовков описывается данным рфц, я сказал, что согласно рфц нет ни одного достоверного способа решения вашей задачи.
    • 0
      пхп не знает. знает статистика. а достоверность дело относительное. на User-Agent полагаться нельзя ни на клиенте ни на сервере. Но можно делать правильные выводы. Если опера или файрфокс сменили юзер-агент, то это их проблемы уже, что они получат :)
  • 0
    > //вероятность выполнение участка кода стремится к нулю поэтому пишем сюда

    Я бы тогда поменял местами два куска кода:

    if(! ini_get('browscap'))
    {// разбираемся с браузером}
    else
    {// посылаем начальство}

    Хотя в данном случае это не особо принципиально, просто привычка пихать вперед то, что чаще сработает. Если будет много if/elseif, то производительность чуть получше, поскольку другие условия уже проверяться не будут.
    • 0
      Нанотехнология оптимизации? :)
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Не совсем понял смысла, но вообще, не каждый раз нужен выход из метода. Я привел пример оптимизации представленного кода, а не общего вида.
  • 0
    Спасибо за статью, спасло от изобретения очередного велосипеда.

    Только «предЫстория». =)
  • 0
    А есть ли таки способ узнать про включенность javaScript на уровне PHP? Очень долго искал попытку решить это на уровне PHP, но там и не смог
    • –2
      если очень захотеть, можно в космос полететь :) не могу представить зачем это надо, но если надо — например при заходе на сайт запрос аяксом к скрипту пхп, который установит в сессию маркер включенности явы. если ява отключена то и маркер не установится :)аналогично с куки — установить и попытаться считать… но данные будут доступны только при заходе на следующую страницу :) можно при первом заходе на сайт делать редирект на скрипт, который это все установит а потом вызовет запрашиваемую страницу. Моя больная фантазия пока исчерпалась :)
      • 0
        Этот вариант рассматривался, но был откинут именно из-за
        > данные будут доступны только при заходе на следующую страницу

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