Получить информацию об операционной системе
Я недавно начал задаваться вопросом о таких сайтах, как http://thismachine.info/ которые получают информацию об операционной системе пользователя. Я не смог выяснить, как это сделать с PHP, и хотел попытаться выяснить это.
Я заметил, что они перечисляют user-agent
, который дает много информации о браузере. Они получают информацию об операционной системе от этого, или от чего-то еще? Есть ли API, который я мог бы использовать для получения операционной системы пользователя?
I посмотрите, как они получили браузер и IP, но не смогли понять часть операционной системы!
7 ответов:
приведенный ниже код может объяснить сам по себе, как 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'].""); ?>
сноски: (Jan. 19/14) было предложил изменить в январе. 18, 2014 Добавить
/msie|trident/i
by YJSoft новый член на SO.комментарий читается как:
комментарий: потому что ua msie11 не включает msie (вместо этого он включает трезубец)
Я исследовал это бит, и нашел несколько ссылок, объясняющих строку трезубца.
- http://www.sitepoint.com/ie11-smells-like-firefox/
- http://www.upsdell.ca/BrowserNews/res_sniff.htm
- как я могу настроить таргетинг только на Internet Explorer 11 с помощью JavaScript?
- http://en.wikipedia.org/wiki/Trident_%28layout_engine%29
- https://stackoverflow.com/a/17907562/1415724
- http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs. 110).aspx
- статья в блогах MSDN
- статья о NCZOnline
хотя редактирование было отклонено (не сам, но некоторыми другими редакторами), это стоит прочитать по ссылкам выше, и использовать свое правильное суждение.
в соответствии с вопросом, заданным об обнаружении 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
Я заметила вопрос вчера, который может иметь отношение к этому Q&A и может быть полезен для некоторых. В отношении:
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
- вопрос: хранить определенные данные в переменной из другой переменной с регулярным выражением с PHP
- ответ:https://stackoverflow.com/a/29584014/
еще одно редактирование, и добавление ссылки, которая была задана (и ответила / принята сегодня, ноябрь. 4/16), который может пригодиться.
обратитесь к Q & A здесь на стеке:
когда вы заходите на сайт, Ваш браузер отправляет запрос на веб-сервер, включая много информации. Эта информация может выглядеть примерно так:
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']
чтобы получить операционную систему и браузер.
взял следующий код из руководства php для функцией get_browser.
$browser = get_browser(null, true); print_r($browser);
The
$browser
массиваplatform
информация включена, которая дает вам конкретную операционную систему в использовании.пожалуйста, убедитесь, что вы видите раздел "Заметки" на этой странице. Это может быть что-то (thismachine.info) использует, если не что-то уже указано в других ответах.
Если вы хотите получить всю эту информацию, вы можете прочитать это:
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] => )
на основе ответ by Фред-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
директива, это вернет предупреждение. Чтобы убедиться, что он установлен, вы можете получить значение с помощью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 или хром', или 'т. е. в IE8', 'т. е. ие9', 'т. е. в IE10', 'т. е. в IE11'.