Недавно я начал задаваться вопросом о таких сайтах, как http://thismachine.info/, которые получают информацию об операционной системе пользователя. Я не смог узнать, как это сделать с PHP, и хотел попытаться понять это.
Я заметил, что они перечисляют user-agent
, который дает много информации о браузере. Получают ли они информацию о операционной системе, или что-то еще? Есть ли API, который я мог бы использовать для получения операционной системы пользователя?
Я вижу, как они получили браузер и IP, но не смогли выяснить часть операционной системы!
Код, приведенный ниже, может объяснить сам по себе, как http://thismachine.info/ может показать, какую операционную систему использует кто-то.
Что он делает, так это то, что он обнюхивает вашу основную модель операционной системы, например windows nt 5.1
как мою собственную.
Затем он передает Windows nt 5.1 / i в Windows XP в качестве операционной системы.
Использование: '/windows nt 5.1/i' => 'Windows XP',
из массива.
Вы могли бы сказать догадки, или приближение, но тем не менее в значительной степени ударило.
Заимствован из ответа на SO https://stackoverflow.com/a/15497878/
<?php $user_agent = $_SERVER['HTTP_USER_AGENT']; function getOS() { global $user_agent; $os_platform = "Unknown 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 = "Unknown 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>Browser: </strong>".$user_browser."<br /><strong>Operating System: </strong>".$user_os.""; print_r($device_details); echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT'].""); ?>
Сноски: ( 19 января). 18 января 2014 года было /msie|trident/i
предложение: добавить /msie|trident/i
от YJSoft новым членом на SO.
Комментарий читается так:
Комментарий: потому что ua msie11 не включает msie (вместо этого он содержит трезубчик)
Я исследовал это немного, и нашел несколько ссылок, объясняющих строку Trident.
Хотя редактирование было отклонено (не мной, а некоторыми другими редакторами), стоит прочитать вышеперечисленные ссылки и использовать ваше собственное мнение.
Согласно заданному вопросу об обнаружении SUSE, этот фрагмент кода нашел по следующему URL-адресу:
Дополнительный код:
/* return Operating System */ 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'); // Loads of Linux machines will be detected as unix. // Actually, all of the linux machines I've checked have the 'X11' in the 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 ); }
Редактировать: 12 апреля 2015 г.
Вчера я заметил вчера вопрос, который может иметь отношение к этому вопросу и может быть полезным для некоторых. В отношении:
Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-GT-I9505 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36
Другое редактирование и добавление ссылки, которая была запрошена (и ответили / принято сегодня, 4 ноября), которая может быть полезной.
Проконсультируйтесь с Q & A здесь: Stack:
Когда вы переходите на сайт, ваш браузер отправляет запрос на веб-сервер, включая много информации. Эта информация может выглядеть примерно так:
GET /questions/18070154/get-operating-system-info-with-php HTTP/1.1 Host: stackoverflow.com 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']
чтобы получить операционную систему и браузер.
Если вы хотите получить всю эту информацию, вы можете прочитать следующее:
http://php.net/manual/en/function.get-browser.php
Вы можете запустить образец кода, и вы увидите, как он работает:
<?php echo $_SERVER['HTTP_USER_AGENT'] . "\n\n"; $browser = get_browser(null, true); print_r($browser); ?>
В приведенном выше примере будет выведено нечто похожее:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 Array ( [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$ [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9* [parent] => Firefox 0.9 [platform] => WinXP [browser] => Firefox [version] => 0.9 [majorver] => 0 [minorver] => 9 [cssversion] => 2 [frames] => 1 [iframes] => 1 [tables] => 1 [cookies] => 1 [backgroundsounds] => [vbscript] => [javascript] => 1 [javaapplets] => 1 [activexcontrols] => [cdf] => [aol] => [beta] => 1 [win16] => [crawler] => [stripper] => [wap] => [netclr] => )
Получил следующий код из руководства php для get_browser .
$browser = get_browser(null, true); print_r($browser);
В массиве $browser
содержится информация о platform
которая дает вам конкретную операционную систему.
Обязательно ознакомьтесь с разделом «Примечания» на этой странице. Это может быть что-то (thismachine.info), если не что-то уже указываемое в других ответах.
Основываясь на ответе Fred-II, я хотел поделиться своим делом с функцией getOS, он избегает глобальных привязок, объединяет оба списка и обнаруживает архитектуру (x32 / x64)
/** * @param $user_agent null * @return string */ function getOS($user_agent = null) { if(!isset($user_agent) && isset($_SERVER['HTTP_USER_AGENT'])) { $user_agent = $_SERVER['HTTP_USER_AGENT']; } // https://stackoverflow.com/questions/18070154/get-operating-system-info-with-php $os_array = [ 'windows nt 10' => 'Windows 10', 'windows nt 6.3' => 'Windows 8.1', 'windows nt 6.2' => 'Windows 8', 'windows nt 6.1|windows nt 7.0' => 'Windows 7', 'windows nt 6.0' => 'Windows Vista', 'windows nt 5.2' => 'Windows Server 2003/XP x64', 'windows nt 5.1' => 'Windows XP', 'windows xp' => 'Windows XP', 'windows nt 5.0|windows nt5.1|windows 2000' => 'Windows 2000', 'windows me' => 'Windows ME', 'windows nt 4.0|winnt4.0' => 'Windows NT', 'windows ce' => 'Windows CE', 'windows 98|win98' => 'Windows 98', 'windows 95|win95' => 'Windows 95', 'win16' => 'Windows 3.11', 'mac os x 10.1[^0-9]' => 'Mac OS X Puma', 'macintosh|mac os x' => 'Mac OS X', 'mac_powerpc' => 'Mac OS 9', 'linux' => 'Linux', 'ubuntu' => 'Linux - Ubuntu', 'iphone' => 'iPhone', 'ipod' => 'iPod', 'ipad' => 'iPad', 'android' => 'Android', 'blackberry' => 'BlackBerry', 'webos' => 'Mobile', '(media center pc).([0-9]{1,2}\.[0-9]{1,2})'=>'Windows Media Center', '(win)([0-9]{1,2}\.[0-9x]{1,2})'=>'Windows', '(win)([0-9]{2})'=>'Windows', '(windows)([0-9x]{2})'=>'Windows', // Doesn't seem like these are necessary...not totally sure though.. //'(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'Windows NT', //'(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})'=>'Windows NT', // fix by bg 'Win 9x 4.90'=>'Windows ME', '(windows)([0-9]{1,2}\.[0-9]{1,2})'=>'Windows', 'win32'=>'Windows', '(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})'=>'Java', '(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}'=>'Solaris', 'dos x86'=>'DOS', 'Mac OS X'=>'Mac OS X', 'Mac_PowerPC'=>'Macintosh PowerPC', '(mac|Macintosh)'=>'Mac OS', '(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'SunOS', '(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'BeOS', '(risc os)([0-9]{1,2}\.[0-9]{1,2})'=>'RISC OS', 'unix'=>'Unix', 'os/2'=>'OS/2', 'freebsd'=>'FreeBSD', 'openbsd'=>'OpenBSD', 'netbsd'=>'NetBSD', 'irix'=>'IRIX', 'plan9'=>'Plan9', 'osf'=>'OSF', 'aix'=>'AIX', 'GNU Hurd'=>'GNU Hurd', '(fedora)'=>'Linux - Fedora', '(kubuntu)'=>'Linux - Kubuntu', '(ubuntu)'=>'Linux - Ubuntu', '(debian)'=>'Linux - Debian', '(CentOS)'=>'Linux - CentOS', '(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - Mandriva', '(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - SUSE', '(Dropline)'=>'Linux - Slackware (Dropline GNOME)', '(ASPLinux)'=>'Linux - ASPLinux', '(Red Hat)'=>'Linux - Red Hat', // Loads of Linux machines will be detected as unix. // Actually, all of the linux machines I've checked have the 'X11' in the User Agent. //'X11'=>'Unix', '(linux)'=>'Linux', '(amigaos)([0-9]{1,2}\.[0-9]{1,2})'=>'AmigaOS', 'amiga-aweb'=>'AmigaOS', 'amiga'=>'Amiga', 'AvantGo'=>'PalmOS', //'(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', //'(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', //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})'=>'Linux', '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})'=>'Linux', '(webtv)/([0-9]{1,2}\.[0-9]{1,2})'=>'WebTV', 'Dreamcast'=>'Dreamcast OS', 'GetRight'=>'Windows', 'go!zilla'=>'Windows', 'gozilla'=>'Windows', 'gulliver'=>'Windows', 'ia archiver'=>'Windows', 'NetPositive'=>'Windows', 'mass downloader'=>'Windows', 'microsoft'=>'Windows', 'offline explorer'=>'Windows', 'teleport'=>'Windows', 'web downloader'=>'Windows', 'webcapture'=>'Windows', 'webcollage'=>'Windows', 'webcopier'=>'Windows', 'webstripper'=>'Windows', 'webzip'=>'Windows', 'wget'=>'Windows', 'Java'=>'Unknown', 'flashget'=>'Windows', // delete next line if the script show not the right OS //'(PHP)/([0-9]{1,2}.[0-9]{1,2})'=>'PHP', 'MS FrontPage'=>'Windows', '(msproxy)/([0-9]{1,2}.[0-9]{1,2})'=>'Windows', '(msie)([0-9]{1,2}.[0-9]{1,2})'=>'Windows', 'libwww-perl'=>'Unix', 'UP.Browser'=>'Windows CE', 'NetAnts'=>'Windows', ]; // https://github.com/ahmad-sa3d/php-useragent/blob/master/core/user_agent.php $arch_regex = '/\b(x86_64|x86-64|Win64|WOW64|x64|ia64|amd64|ppc64|sparc64|IRIX64)\b/ix'; $arch = preg_match($arch_regex, $user_agent) ? '64' : '32'; foreach ($os_array as $regex => $value) { if (preg_match('{\b('.$regex.')\b}i', $user_agent)) { return $value.' x'.$arch; } } return 'Unknown'; }
Вы можете искать эту информацию в $_SERVER['HTTP_USER_AGENT']
, но ее формат является свободной формой, не гарантируется, что его можно отправить, и его легко изменить пользователем, будь то конфиденциальность или другие причины.
Если вы не browsecap
директиву browsecap
, это вернет предупреждение. Чтобы убедиться, что он установлен, вы можете получить значение с помощью ini_get
и посмотреть, установлено ли оно.
if(ini_get("browscap")) { $browser = get_browser(null, true); $browser = get_browser($_SERVER['HTTP_USER_AGENT']); }
Как объяснил kba в своем ответе, ваш браузер отправляет много информации на сервер при загрузке веб-страницы. Большинство веб-сайтов используют эту информацию User-agent для определения операционной системы посетителя, браузера и различной информации.
Если вы хотите, чтобы в вашем 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; }
который вернет «сафари» или «firefox» или «chrome», или «ie ie8», т.е. ie9 ', т.е. ie10', 'ie ie11'.