Betriebssysteminformationen abrufen

Ich habe mich vor kurzem über Websites wie http://thismachine.info/ gewundert , die die Betriebssysteminformationen des Benutzers erhalten. Ich konnte nicht herausfinden, wie man das mit PHP macht und wollte es herausfinden.

Ich habe bemerkt, dass sie den user-agent , der viele Informationen über den Browser liefert. Erhalten sie die Betriebssysteminformationen von diesem oder von etwas anderem? Gibt es eine API, die ich verwenden könnte, um das Betriebssystem des Benutzers zu erhalten?

Ich sehe, wie sie den Browser und IP bekommen haben, aber den Betriebssystemteil nicht herausfinden konnten!

Der folgende Code könnte eigenständig erklären, wie http://thismachine.info/ zeigen kann, welches Betriebssystem jemand benutzt.

Was es tut, ist, dass es Ihr core-Betriebssystem Modell schnüffelt, zum Beispiel windows nt 5.1 als mein eigenes.

Es übergibt dann Windows NT 5.1 / i an Windows XP als Betriebssystem.

Verwenden: '/windows nt 5.1/i' => 'Windows XP', von einem Array.

Man könnte sagen, Rätselraten, oder eine Annäherung, aber trotzdem ziemlich gut.

Entliehen von einer Antwort auf 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 = "Browser: ".$user_browser."
Operating System: ".$user_os.""; print_r($device_details); echo("


".$_SERVER['HTTP_USER_AGENT'].""); ?>

Fußnoten: (Jan. 19/14) Es wurde am 18. Januar 2014 vorgeschlagen, /msie|trident/i durch YJSoft ein neues Mitglied auf SO hinzuzufügen.

Der Kommentar lautet wie folgt:

Kommentar: weil msie11 ua msie nicht enthält (es enthält stattdessen dreizack)

Ich recherchierte ein bisschen und fand ein paar Links, die die Trident-Saite erklärten.

Obwohl die Bearbeitung abgelehnt wurde (nicht von mir selbst, sondern von einigen anderen Redakteuren), lohnt es sich, die obigen Links zu lesen und Ihr richtiges Urteil zu verwenden.


Wie bei einer Frage zum Erkennen von SUSE, haben Sie dieses Stück Code unter der folgenden URL gefunden:

Zusätzlicher Code:

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

Bearbeiten: 12. April 2015

Ich habe gestern eine Frage zur Kenntnis genommen, die für diese Frage relevant sein könnte und für einige hilfreich sein kann. In Bezug auf:

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


Eine weitere Bearbeitung und Hinzufügen eines Referenzlinks, der heute (4./16. November) gefragt wurde (und beantwortet wurde), der nützlich sein könnte.

Konsultieren Sie die Fragen und Antworten hier auf Stack:

  • PHP Regex für Betriebssystemerkennung

Wenn Sie auf eine Website gehen, sendet Ihr Browser eine Anfrage an den Webserver mit vielen Informationen. Diese Information könnte etwa so aussehen:

 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:  Pragma: no-cache Cache-Control: no-cache 

Diese Informationen werden alle vom Webserver verwendet, um zu bestimmen, wie mit der Anfrage verfahren wird. die bevorzugte Sprache und ob Komprimierung erlaubt ist.

In PHP werden all diese Informationen im Array $_SERVER gespeichert. Um zu sehen, was Sie an einen Webserver senden, erstellen Sie eine neue PHP-Datei und drucken Sie alles aus dem Array aus.

 
< ?php print_r($_SERVER); ?>

Dies gibt Ihnen eine schöne Darstellung von allem, was an den Server gesendet wird, von wo Sie die gewünschten Informationen extrahieren können, zB $_SERVER['HTTP_USER_AGENT'] , um das Betriebssystem und den Browser zu erhalten.

Wenn Sie alle diese Informationen erhalten möchten, sollten Sie Folgendes lesen:
http://php.net/manual/en/function.get-browser.php

Sie können den Beispielcode ausführen und Sie werden sehen, wie es funktioniert:

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

Das obige Beispiel wird etwas ähnliches ausgeben:

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

Nahm den folgenden Code von PHP-Handbuch für get_browser .

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

Das $browser Array enthält Informationen zur platform die Ihnen das spezifische verwendete Betriebssystem geben.

Bitte achten Sie darauf, den Abschnitt “Notizen” auf dieser Seite zu sehen. Das könnte etwas sein (thismachine.info) benutzt wenn nicht schon etwas in anderen Antworten gezeigt hat.

Basierend auf der Antwort von Fred-II wollte ich meine Vorstellung von der getOS-function teilen, vermeidet globale Variablen, führt beide Listen zusammen und erkennt die Architektur (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'; } 

Sie können diese Informationen in $_SERVER['HTTP_USER_AGENT'] , aber das Format ist frei, nicht garantiert, gesendet zu werden, und könnte leicht vom Benutzer geändert werden, entweder aus Datenschutzgründen oder aus anderen Gründen.

Wenn Sie die browsecap statement nicht festgelegt browsecap , wird eine Warnung browsecap . Um sicherzustellen, dass es gesetzt ist, können Sie den Wert mit ini_get und sehen, ob es gesetzt ist.

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

Wie kba in seiner Antwort erklärt, sendet Ihr Browser beim Laden einer Webseite viele Informationen an den Server. Die meisten Websites verwenden diese Benutzeragenteninformationen , um das Betriebssystem, den Browser und verschiedene Informationen des Besuchers zu ermitteln.

Wenn Sie nur sehr wenige Informationen wie eine class in Ihrem HTML für gängige Browser benötigen, könnten Sie Folgendes verwenden:

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

Das gibt ‘safari’ oder ‘firefox’ oder ‘chrome’ zurück, oder ‘ie8’, dh ie9 ‘, dh ie10’, dh ie11 ‘.