获取操作系统信息

我最近开始想知道像http://thismachine.info/这样的网站,可以获取用户的操作系统信息。 我一直无法find如何做到这一点与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'].""); ?> 

脚注: 2014年1月19日)2014年1月18日, 有人build议编辑 YJSoft新增加的/msie|trident/i

评论阅读为:

评论:因为msie11的ua不包含msie(它包含三叉戟)

我研究了一下,发现了一些解释三叉戟string的链接。

虽然编辑被拒绝 (不是由我自己,而是由其他编辑),但是值得阅读上面的链接,并使用你的判断。


根据一个关于检测SUSE的问题,在以下urlfind这段代码:

附加代码:

 /* 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 ); } 

编辑:2015年4月12日

我昨天注意到一个问题,可能与这个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的正则expression式将特定数据存储在另一个variables的variables中
  • 答: https : //stackoverflow.com/a/29584014/

另一个编辑 ,并添加一个可能有用的询问(和答复/今天,11月4/16日接受)的参考链接。

有关堆栈的问题,请参阅这里的问答:

  • 用于操作系统检测的PHP正则expression式

当你去到一个网站,你的浏览器发送一个请求到Web服务器,包括大量的信息。 这个信息可能看起来像这样:

 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 

这些信息全部由Web服务器用来确定如何处理请求; 首选语言和是否允许压缩。

在PHP中,所有这些信息都存储在$_SERVER数组中。 要查看发送给Web服务器的内容,请创build一个新的PHP文件,并打印出arrays中的所有内容。

 <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函数,它避免了全局variables,合并了这两个列表并检测了架构(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']查找这个信息,但是它的格式是自由forms的,不保证被发送,并且很容易被用户改变,无论是出于隐私还是其他原因。

如果你还没有设置browsecap指令,这将返回一个警告。 要确定它已经设置好了,你可以使用ini_get检索值,看看是否设置了。

 if(ini_get("browscap")) { $browser = get_browser(null, true); $browser = get_browser($_SERVER['HTTP_USER_AGENT']); } 

正如kba在他的回答中解释的那样,浏览器在加载网页时会向服务器发送大量信息。 大多数网站使用这些用户代理信息来确定访问者的操作系统,浏览器和各种信息。

如果你想在你的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”或“即ie8”,即ie9,即ie10,即ie11。