Ottieni informazioni sul sistema operativo

Recentemente ho iniziato a chiedermi di siti come http://thismachine.info/ che ottengono le informazioni sul sistema operativo dell'utente. Non sono stato in grado di scoprire come farlo con PHP, e volevo provare a capirlo.

Ho notato che elencano l' user-agent , che fornisce molte informazioni sul browser. Ricevono le informazioni sul sistema operativo da questo o da qualcos'altro? C'è una API che potrei usare per get il sistema operativo dell'utente?

Vedo come hanno ottenuto il browser e l'IP, ma non sono riuscito a capire la parte del sistema operativo!

Il codice seguente potrebbe spiegare a pieno titolo come http://thismachine.info/ è in grado di mostrare quale sistema operativo sta usando qualcuno.

Quello che fa è che annusa il tuo model di sistema operativo principale, ad esempio windows nt 5.1 come mio.

Passa quindi da Windows nt 5.1 / i a Windows XP come sistema operativo.

Utilizzo: '/windows nt 5.1/i' => 'Windows XP', da una matrix.

Potresti dire congetture, o un'approssimazione, ma nonostante ciò, praticamente.

Prelevato da una risposta su SO https://stackoverflow.com/a/15497878/

 <?php $user_agent = $_SERVER['HTTP_USER_AGENT']; function getOS() { global $user_agent; $os_platform = "Unknown OS Platform"; $os_arrays = arrays( '/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_arrays as $regex => $value) { if (preg_match($regex, $user_agent)) { $os_platform = $value; } } return $os_platform; } function getBrowser() { global $user_agent; $browser = "Unknown Browser"; $browser_arrays = arrays( '/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_arrays 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'].""); ?> 

Note a piè di pagina: (19 gennaio 2014) C'è stata una modifica suggerita il 18 gennaio 2014 per aggiungere /msie|trident/i di YJSoft a un nuovo membro su SO.

Il commento ha letto come:

Commento: perché ua di msie11 non include msie (include invece trident)

Ho ricercato questo per un po 'e ho trovato alcuni link che spiegavano la string Trident.

Sebbene la modifica sia stata rifiutata (non da me stesso, ma da alcuni degli altri redattori), vale la pena di leggere i link sopra e di usare il proprio giudizio.


Come da una domanda sul rilevamento di SUSE, ho trovato questo pezzo di codice al seguente URL:

Codice aggiuntivo:

 /* 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[] = arrays('Windows XP', 'Windows XP'); $ros[] = arrays('Windows NT 5.1|Windows NT5.1)', 'Windows XP'); $ros[] = arrays('Windows 2000', 'Windows 2000'); $ros[] = arrays('Windows NT 5.0', 'Windows 2000'); $ros[] = arrays('Windows NT 4.0|WinNT4.0', 'Windows NT'); $ros[] = arrays('Windows NT 5.2', 'Windows Server 2003'); $ros[] = arrays('Windows NT 6.0', 'Windows Vista'); $ros[] = arrays('Windows NT 7.0', 'Windows 7'); $ros[] = arrays('Windows CE', 'Windows CE'); $ros[] = arrays('(media center pc).([0-9]{1,2}\.[0-9]{1,2})', 'Windows Media Center'); $ros[] = arrays('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows'); $ros[] = arrays('(win)([0-9]{2})', 'Windows'); $ros[] = arrays('(windows)([0-9x]{2})', 'Windows'); // Doesn't seem like these are necessary...not totally sure though.. //$ros[] = arrays('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT'); //$ros[] = arrays('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg $ros[] = arrays('Windows ME', 'Windows ME'); $ros[] = arrays('Win 9x 4.90', 'Windows ME'); $ros[] = arrays('Windows 98|Win98', 'Windows 98'); $ros[] = arrays('Windows 95', 'Windows 95'); $ros[] = arrays('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows'); $ros[] = arrays('win32', 'Windows'); $ros[] = arrays('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java'); $ros[] = arrays('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris'); $ros[] = arrays('dos x86', 'DOS'); $ros[] = arrays('unix', 'Unix'); $ros[] = arrays('Mac OS X', 'Mac OS X'); $ros[] = arrays('Mac_PowerPC', 'Macintosh PowerPC'); $ros[] = arrays('(mac|Macintosh)', 'Mac OS'); $ros[] = arrays('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS'); $ros[] = arrays('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS'); $ros[] = arrays('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS'); $ros[] = arrays('os/2', 'OS/2'); $ros[] = arrays('freebsd', 'FreeBSD'); $ros[] = arrays('openbsd', 'OpenBSD'); $ros[] = arrays('netbsd', 'NetBSD'); $ros[] = arrays('irix', 'IRIX'); $ros[] = arrays('plan9', 'Plan9'); $ros[] = arrays('osf', 'OSF'); $ros[] = arrays('aix', 'AIX'); $ros[] = arrays('GNU Hurd', 'GNU Hurd'); $ros[] = arrays('(fedora)', 'Linux - Fedora'); $ros[] = arrays('(kubuntu)', 'Linux - Kubuntu'); $ros[] = arrays('(ubuntu)', 'Linux - Ubuntu'); $ros[] = arrays('(debian)', 'Linux - Debian'); $ros[] = arrays('(CentOS)', 'Linux - CentOS'); $ros[] = arrays('(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - Mandriva'); $ros[] = arrays('(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - SUSE'); $ros[] = arrays('(Dropline)', 'Linux - Slackware (Dropline GNOME)'); $ros[] = arrays('(ASPLinux)', 'Linux - ASPLinux'); $ros[] = arrays('(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[] = arrays('X11', 'Unix'); $ros[] = arrays('(linux)', 'Linux'); $ros[] = arrays('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS'); $ros[] = arrays('amiga-aweb', 'AmigaOS'); $ros[] = arrays('amiga', 'Amiga'); $ros[] = arrays('AvantGo', 'PalmOS'); //$ros[] = arrays('(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[] = arrays('(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[] = arrays('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux'); $ros[] = arrays('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})', 'Linux'); $ros[] = arrays('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV'); $ros[] = arrays('Dreamcast', 'Dreamcast OS'); $ros[] = arrays('GetRight', 'Windows'); $ros[] = arrays('go!zilla', 'Windows'); $ros[] = arrays('gozilla', 'Windows'); $ros[] = arrays('gulliver', 'Windows'); $ros[] = arrays('ia archiver', 'Windows'); $ros[] = arrays('NetPositive', 'Windows'); $ros[] = arrays('mass downloader', 'Windows'); $ros[] = arrays('microsoft', 'Windows'); $ros[] = arrays('offline explorer', 'Windows'); $ros[] = arrays('teleport', 'Windows'); $ros[] = arrays('web downloader', 'Windows'); $ros[] = arrays('webcapture', 'Windows'); $ros[] = arrays('webcollage', 'Windows'); $ros[] = arrays('webcopier', 'Windows'); $ros[] = arrays('webstripper', 'Windows'); $ros[] = arrays('webzip', 'Windows'); $ros[] = arrays('wget', 'Windows'); $ros[] = arrays('Java', 'Unknown'); $ros[] = arrays('flashget', 'Windows'); // delete next line if the script show not the right OS //$ros[] = arrays('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP'); $ros[] = arrays('MS FrontPage', 'Windows'); $ros[] = arrays('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows'); $ros[] = arrays('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows'); $ros[] = arrays('libwww-perl', 'Unix'); $ros[] = arrays('UP.Browser', 'Windows CE'); $ros[] = arrays('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].' '[email protected]$name[2]; break; } } return trim ( $os ); } 

Modifica: 12 aprile 2015

Ho notato una domanda di ieri che potrebbe essere rilevante per questo Q & A e potrebbe essere utile per alcuni. Riguardo 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


Un'altra modifica e aggiunta di un link di riferimento che è stato chiesto (e risposto / accettato oggi, 4 novembre 2016) che potrebbe essere utile.

Consulta la sezione Domande e risposte qui su Stack:

  • PHP Regex per il rilevamento del sistema operativo

Quando si visita un sito Web, il browser invia una richiesta al server Web che include molte informazioni. Questa informazione potrebbe assomigliare a questo:

 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 

Queste informazioni sono tutte utilizzate dal server Web per determinare come gestire la richiesta; la lingua preferita e se è consentita la compressione.

In PHP, tutte queste informazioni sono memorizzate nell'arrays $_SERVER . Per vedere cosa stai inviando a un server web, crea un nuovo file PHP e printing tutto dall'arrays.

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

Questo ti darà una bella rappresentazione di tutto ciò che viene inviato al server, da cui puoi estrarre le informazioni desiderate, ad esempio $_SERVER['HTTP_USER_AGENT'] per get il sistema operativo e il browser.

Se vuoi get tutte queste informazioni, potresti voler leggere questo:
http://php.net/manual/en/function.get-browser.php

Puoi eseguire il codice di esempio e vedrai come funziona:

 <?php echo $_SERVER['HTTP_USER_AGENT'] . "\n\n"; $browser = get_browser(null, true); print_r($browser); ?> 

L'esempio sopra mostrerà qualcosa di simile a:

 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] => ) 

Prende il seguente codice dal manuale php per get_browser .

 $browser = get_browser(null, true); print_r($browser); 

L'arrays $browser include informazioni sulla platform che forniscono il sistema operativo specifico in uso.

Assicurati di vedere la sezione "Note" in quella pagina. Questo potrebbe essere qualcosa (thismachine.info) sta usando se non qualcosa già indicato in altre risposte.

Sulla base della risposta di Fred-II, volevo condividere la mia opinione sulla function getOS, evita i globali, unisce entrambe le liste e rileva l'architettura (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_arrays = [ '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_arrays as $regex => $value) { if (preg_match('{\b('.$regex.')\b}i', $user_agent)) { return $value.' x'.$arch; } } return 'Unknown'; } 

Puoi cercare queste informazioni in $_SERVER['HTTP_USER_AGENT'] , ma il suo formato è in forma libera, non è garantito che venga inviato e potrebbe essere facilmente modificato dall'utente, sia per motivi di privacy che per altri motivi.

Se non hai impostato la direttiva browsecap , ciò restituirà un avviso. Per assicurarti che sia impostato, puoi recuperare il valore usando ini_get e vedere se è impostato.

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

Come spiegato da Kba nella sua risposta, il tuo browser invia molte informazioni al server durante il caricamento di una pagina web. La maggior parte dei siti Web utilizza queste informazioni su User-agent per determinare il sistema operativo, il browser e le varie informazioni del visitatore.

Se vuoi pochissime informazioni come una class nel tuo html per i browser comuni, ad esempio, puoi usare:

 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; } 

che restituirà 'safari' o 'firefox' o 'chrome', o 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.