Web

Как получить информацию об операционной системе посетителя сайта

Недавно я начал интересоваться такими сайтами, как http://thismachine.info/, которые получают информацию об операционной системе пользователя. Мне не удалось выяснить, как это сделать с помощью PHP, и я хотел попытаться понять это.

Я заметил, что они перечисляют user-agent, что дает много информации о браузере. Оттуда они получают информацию об операционной системе или от чего-то еще? Есть ли API, с помощью которого я могу получить операционную систему пользователя?

 

Ответ 1

Приведенный ниже код может показать, какую операционную систему кто-то использует. Он определяет вашу базовую модель операционной системы, а потом конкретизирует параметры операционной системы и ищет информацию о ней.

<?php

$user_agent = $_SERVER['HTTP_USER_AGENT'];

function getOS() { 

    global $user_agent;

    $os_platform  = "Неизвестная операционная система";

    $os_array     = array(

                          '/windows nt 10/i'      =>  'Windows 10',

                          '/windows nt 6.3/i'     =>  'Windows 8.1',

                          '/windows nt 6.2/i'     =>  'Windows 8',

                          '/windows nt 6.1/i'     =>  'Windows 7',

                          '/windows nt 6.0/i'     =>  'Windows Vista',

                          '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',

                          '/windows nt 5.1/i'     =>  'Windows XP',

                          '/windows xp/i'         =>  'Windows XP',

                          '/windows nt 5.0/i'     =>  'Windows 2000',

                          '/windows me/i'         =>  'Windows ME',

                          '/win98/i'                   =>  'Windows 98',

                          '/win95/i'                   =>  'Windows 95',

                          '/win16/i'                  =>  'Windows 3.11',

                          '/macintosh|mac os x/i' =>  'Mac OS X',

                          '/mac_powerpc/i'        =>  'Mac OS 9',

                          '/linux/i'                   =>  'Linux',

                          '/ubuntu/i'                =>  'Ubuntu',

                          '/iphone/i'                =>  'iPhone',

                          '/ipod/i'                   =>  'iPod',

                          '/ipad/i'                   =>  'iPad',

                          '/android/i'              =>  'Android',

                          '/blackberry/i'         =>  'BlackBerry',

                          '/webos/i'                =>  'Mobile'

                    );

 

    foreach ($os_array as $regex => $value)

        if (preg_match($regex, $user_agent))

            $os_platform = $value;

 

    return $os_platform;

}

 

function getBrowser() {

    global $user_agent;

    $browser        = "Неизвестный браузер";

    $browser_array = array(

                            '/msie/i'      => 'Internet Explorer',

                            '/firefox/i'   => 'Firefox',

                            '/safari/i'     => 'Safari',

                            '/chrome/i'   => 'Chrome',

                            '/edge/i'       => 'Edge',

                            '/opera/i'      => 'Opera',

                            '/netscape/i'  => 'Netscape',

                            '/maxthon/i'   => 'Maxthon',

                            '/konqueror/i' => 'Konqueror',

                            '/mobile/i'    => 'Handheld Browser'

                     );

    foreach ($browser_array as $regex => $value)

        if (preg_match($regex, $user_agent))

            $browser = $value;

    return $browser;

}

 

$user_os        = getOS();

$user_browser   = getBrowser();

 

$device_details = "<strong>Браузер: </strong>".$user_browser."<br /><strong>Операционная система: </strong>".$user_os."";

print_r($device_details);

echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT']."");

?>

 Дополнительный код:

/* возвращает операционную систему */

function operating_system_detection(){

    if ( isset( $_SERVER ) ) {

        $agent = $_SERVER['HTTP_USER_AGENT'];

    }

    else {

        global $HTTP_SERVER_VARS;

        if ( isset( $HTTP_SERVER_VARS ) ) {

            $agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];

        }

        else {

            global $HTTP_USER_AGENT;

            $agent = $HTTP_USER_AGENT;

        }

    }

    $ros[] = array('Windows XP', 'Windows XP');

    $ros[] = array('Windows NT 5.1|Windows NT5.1)', 'Windows XP');

    $ros[] = array('Windows 2000', 'Windows 2000');

    $ros[] = array('Windows NT 5.0', 'Windows 2000');

    $ros[] = array('Windows NT 4.0|WinNT4.0', 'Windows NT');

    $ros[] = array('Windows NT 5.2', 'Windows Server 2003');

    $ros[] = array('Windows NT 6.0', 'Windows Vista');

    $ros[] = array('Windows NT 7.0', 'Windows 7');

    $ros[] = array('Windows CE', 'Windows CE');

    $ros[] = array('(media center pc).([0-9]{1,2}\.[0-9]{1,2})', 'Windows Media Center');

    $ros[] = array('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows');

    $ros[] = array('(win)([0-9]{2})', 'Windows');

    $ros[] = array('(windows)([0-9x]{2})', 'Windows');

    // Doesn't seem like these are necessary...not totally sure though..

    //$ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT');

    //$ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg

    $ros[] = array('Windows ME', 'Windows ME');

    $ros[] = array('Win 9x 4.90', 'Windows ME');

    $ros[] = array('Windows 98|Win98', 'Windows 98');

    $ros[] = array('Windows 95', 'Windows 95');

    $ros[] = array('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows');

    $ros[] = array('win32', 'Windows');

    $ros[] = array('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java');

    $ros[] = array('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris');

    $ros[] = array('dos x86', 'DOS');

    $ros[] = array('unix', 'Unix');

    $ros[] = array('Mac OS X', 'Mac OS X');

    $ros[] = array('Mac_PowerPC', 'Macintosh PowerPC');

    $ros[] = array('(mac|Macintosh)', 'Mac OS');

    $ros[] = array('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS');

    $ros[] = array('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS');

    $ros[] = array('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS');

    $ros[] = array('os/2', 'OS/2');

    $ros[] = array('freebsd', 'FreeBSD');

    $ros[] = array('openbsd', 'OpenBSD');

    $ros[] = array('netbsd', 'NetBSD');

    $ros[] = array('irix', 'IRIX');

    $ros[] = array('plan9', 'Plan9');

    $ros[] = array('osf', 'OSF');

    $ros[] = array('aix', 'AIX');

    $ros[] = array('GNU Hurd', 'GNU Hurd');

    $ros[] = array('(fedora)', 'Linux - Fedora');

    $ros[] = array('(kubuntu)', 'Linux - Kubuntu');

    $ros[] = array('(ubuntu)', 'Linux - Ubuntu');

    $ros[] = array('(debian)', 'Linux - Debian');

    $ros[] = array('(CentOS)', 'Linux - CentOS');

    $ros[] = array('(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - Mandriva');

    $ros[] = array('(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - SUSE');

    $ros[] = array('(Dropline)', 'Linux - Slackware (Dropline GNOME)');

    $ros[] = array('(ASPLinux)', 'Linux - ASPLinux');

    $ros[] = array('(Red Hat)', 'Linux - Red Hat');

    // Многие Linux-машины будут определяться как unix.

    // На самом деле, все машины linux, которые я проверил, имеют 'X11' в User Agent.

    //$ros[] = array('X11', 'Unix');

    $ros[] = array('(linux)', 'Linux');

    $ros[] = array('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS');

    $ros[] = array('amiga-aweb', 'AmigaOS');

    $ros[] = array('amiga', 'Amiga');

    $ros[] = array('AvantGo', 'PalmOS');

    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}', 'Linux');

    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}', 'Linux');

    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux');

    $ros[] = array('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}', 'Linux');

    $ros[] = array('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV');

    $ros[] = array('Dreamcast', 'Dreamcast OS');

    $ros[] = array('GetRight', 'Windows');

    $ros[] = array('go!zilla', 'Windows');

    $ros[] = array('gozilla', 'Windows');

    $ros[] = array('gulliver', 'Windows');

    $ros[] = array('ia archiver', 'Windows');

    $ros[] = array('NetPositive', 'Windows');

    $ros[] = array('mass downloader', 'Windows');

    $ros[] = array('microsoft', 'Windows');

    $ros[] = array('offline explorer', 'Windows');

    $ros[] = array('teleport', 'Windows');

    $ros[] = array('web downloader', 'Windows');

    $ros[] = array('webcapture', 'Windows');

    $ros[] = array('webcollage', 'Windows');

    $ros[] = array('webcopier', 'Windows');

    $ros[] = array('webstripper', 'Windows');

    $ros[] = array('webzip', 'Windows');

    $ros[] = array('wget', 'Windows');

    $ros[] = array('Java', 'Unknown');

    $ros[] = array('flashget', 'Windows');

    // delete next line if the script show not the right OS

    //$ros[] = array('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP');

    $ros[] = array('MS FrontPage', 'Windows');

    $ros[] = array('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows');

    $ros[] = array('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows');

    $ros[] = array('libwww-perl', 'Unix');

    $ros[] = array('UP.Browser', 'Windows CE');

    $ros[] = array('NetAnts', 'Windows');

    $file = count ( $ros );

    $os = '';

    for ( $n=0 ; $n<$file ; $n++ ){

        if ( preg_match('/'.$ros[$n][0].'/i' , $agent, $name)){

            $os = @$ros[$n][1].' '.@$name[2];

            break;

        }

    }

    return trim ( $os );

}

 

 Ответ 2

Когда вы переходите на веб-сайт, ваш браузер отправляет запрос на веб-сервер, содержащий много информации. Эта информация может выглядеть примерно так:

GET /questions/18070154/get-operating-system-info-with-php HTTP/1.1  

Host: codernet.ru  

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 

            (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  

Accept-Language: en-us,en;q=0.5  

Accept-Encoding: gzip,deflate,sdch  

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7  

Keep-Alive: 300  

Connection: keep-alive  

Cookie: <cookie data removed> 

Pragma: no-cache  

Cache-Control: no-cache

Вся эта информация используется веб-сервером для определения того, как обрабатывать запрос, предпочитаемого языка и разрешено ли сжатие.

В PHP вся эта информация хранится в массиве $_SERVER. Чтобы увидеть, что вы отправляете на веб-сервер, создайте новый файл PHP и распечатайте все из массива.

<pre><?php print_r($_SERVER); ?></pre>

Это даст вам хорошее представление обо всем, что отправляется на сервер, откуда вы можете извлечь желаемую информацию, например: $_SERVER['HTTP_USER_AGENT'],чтобы получить операционную систему и браузер.

 

Ответ 3

Вы можете найти эту информацию в $_SERVER['HTTP_USER_AGENT'], но ее формат является произвольным, не гарантируется отправка и может быть легко изменен пользователем, будь то в целях конфиденциальности или по другим причинам. Если вы не установили директиву browscap, это приведет к предупреждению. Чтобы убедиться, что она установлена, вы можете получить значение с помощью ini_get и посмотреть, установлено ли оно.

if(ini_get("browscap")) {

    $browser = get_browser(null, true);

    $browser = get_browser($_SERVER['HTTP_USER_AGENT']);  

 Ваш браузер отправляет много информации на сервер во время загрузки веб-страницы. Большинство веб-сайтов используют эту информацию через User-agent для определения операционной системы посетителя, браузера и другой информации.

 

Ответ 4

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

function get_browser() {

    $browser = '';

    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);

    if (preg_match('~(?:msie ?|trident.+?; ?rv: ?)(\d+)~', $ua, $matches)) $browser = 'ie ie'.$matches[1];

    elseif (preg_match('~(safari|chrome|firefox)~', $ua, $matches)) $browser = $matches[1];

 

    return $browser;

}

 который вернет 'safari' или 'firefox', или 'chrome', или 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

Схожие статьи

Web

Как правильно определить, является ли строка даты допустимой датой в определенном формате

Web

Как я могу обновить код, в котором используется устаревшая функция each()

Web

Laravel 5 — перенаправление на HTTPS

Web

Как я могу хранить и извлекать изображения из базы данных MySQL с помощью PHP

×