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

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

    Поделиться публикацией
    Комментарии 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
                                        Этот вариант рассматривался, но был откинут именно из-за
                                        > данные будут доступны только при заходе на следующую страницу

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

                                    Самое читаемое