Определить точную версию ОС из браузера - PullRequest
18 голосов
/ 15 марта 2009

Мне было интересно, есть ли способ определить точную версию операционной системы из браузера с помощью PHP / JS / ASP?

Я знаю, что могу определить тип ОС (Windows XP, Windows Vista, OS X и т. Д.), Но мне нужно определить точную версию: Vista Business, Vista Ultimate, Windows XP Home, Windows XP Pro и т. Д. .

Ответы [ 11 ]

25 голосов
/ 15 марта 2009

Краткий ответ: Вы не можете.

Длинный ответ:

Все, что у вас есть, это информация в заголовке HTTP User-Agent, которая обычно содержит имя и версию ОС.

Обычно браузеры, работающие на Mac OS и Linux, отправляют достаточно информации для определения точной ОС. Например, вот мой заголовок User-Agent:

Mozilla / 5.0 (X11; U; Linux x86_64; en-US; rv: 1.9.0.7) Gecko / 2009030423 Ubuntu / 8.10 (intrepid) Firefox / 3.0.7

Вы можете видеть, что я использую Ubuntu 8.10 Intrepid Ibex.

А вот что Firefox и Safari 4 Beta сообщают на моем MacBook Pro:

Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv: 1.9.0.7) Gecko / 2009021906 Firefox / 3.0.7

Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ru-ru) AppleWebKit / 528.16 (KHTML, как Gecko) Версия / 4.0 Safari / 528.16

Браузеры Windows, с другой стороны, обычно сообщают только версию ОС, а не конкретный пакет (Pro, Business и т. Д.):

Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US; rv: x.x.x) Gecko / 20041107 Firefox / x.x

17 голосов
/ 27 апреля 2009

После некоторого поиска в Google я нашел этот код, и он, кажется, работает нормально, (хотя не обнаруживает Unix)

<?php 
$OSList = array
(
// Match user agent string with operating systems
'Windows 3.11' => 'Win16',
'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
'Windows 98' => '(Windows 98)|(Win98)',
'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
'Windows Server 2003' => '(Windows NT 5.2)',
'Windows Vista' => '(Windows NT 6.0)',
'Windows 7' => '(Windows NT 7.0)',
'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
'Windows ME' => 'Windows ME',
'Open BSD' => 'OpenBSD',
'Sun OS' => 'SunOS',
'Linux' => '(Linux)|(X11)',
'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
'QNX' => 'QNX',
'BeOS' => 'BeOS',
'OS/2' => 'OS/2',
'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
);
// Loop through the array of user agents and matching operating systems
foreach($OSList as $CurrOS=>$Match)
{
// Find a match
if (eregi($Match, $_SERVER['HTTP_USER_AGENT']))
{
// We found the correct match
break;
}
}
// You are using ...
echo "You are using ".$CurrOS;
?>
14 голосов
/ 01 июля 2012

// это вам поможет

$uagent = $_SERVER['HTTP_USER_AGENT'] . "<br/>";

function os_info($uagent)
{
    // the order of this array is important
    global $uagent;
    $oses   = array(
        'Win311' => 'Win16',
        'Win95' => '(Windows 95)|(Win95)|(Windows_95)',
        'WinME' => '(Windows 98)|(Win 9x 4.90)|(Windows ME)',
        'Win98' => '(Windows 98)|(Win98)',
        'Win2000' => '(Windows NT 5.0)|(Windows 2000)',
        'WinXP' => '(Windows NT 5.1)|(Windows XP)',
        'WinServer2003' => '(Windows NT 5.2)',
        'WinVista' => '(Windows NT 6.0)',
        'Windows 7' => '(Windows NT 6.1)',
        'Windows 8' => '(Windows NT 6.2)',
        'Windows 8.1' => '(Windows NT 6.3)',
        'Windows 10' => '(Windows NT 10.0)',
        'WinNT' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
        'OpenBSD' => 'OpenBSD',
        'SunOS' => 'SunOS',
        'Ubuntu' => 'Ubuntu',
        'Android' => 'Android',
        'Linux' => '(Linux)|(X11)',
        'iPhone' => 'iPhone',
        'iPad' => 'iPad',
        'MacOS' => '(Mac_PowerPC)|(Macintosh)',
        'QNX' => 'QNX',
        'BeOS' => 'BeOS',
        'OS2' => 'OS/2',
        'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    );
    $uagent = strtolower($uagent ? $uagent : $_SERVER['HTTP_USER_AGENT']);
    foreach ($oses as $os => $pattern)
        if (preg_match('/' . $pattern . '/i', $uagent))
            return $os;
    return 'Unknown';
}
echo os_info($uagent);
2 голосов
/ 15 марта 2009

В классическом ASP и ASP.NET использовать

Request.ServerVariables("HTTP_USER_AGENT")

Это работает лучше всего, так как это не интерпретированный код, он работает на сервере.

1 голос
/ 11 декабря 2013

Это может быть самый простой способ:

Скачать библиотеку из http://mobiledetect.net

Поместите Mobile_Detect.php в «библиотеки», если используете CI, или просто включите его.

Используйте этот код в PHP

$detect = new Mobile_Detect();
// Get the version() of components.
$detect->version('iPad'); // 4.3 (float)
$detect->version('iPhone') // 3.1 (float)
$detect->version('Android'); // 2.1 (float)
$detect->version('Opera Mini'); // 5.0 (float)

Найти документацию по http://dwij.co.in/mobile-os-detection-in-php-codeigniter

1 голос
/ 13 марта 2013

Я создал функцию jquery, которая делает это. Таким образом, мы можем отслеживать все ОС, используя navigator .

Надеюсь, кто-то получит помощь от этого:

function find_os_version() {
  var ua = navigator.userAgent.toLowerCase();
  if (ua.indexOf("windows nt 5.0") != -1) {
    return 'win2k';
  }
  if (ua.indexOf("windows nt 5.1") != -1) {
    return 'winXP';
  }
  if (ua.indexOf("windows nt 6.0") != -1) {
    return 'winVista';
  }
  if (ua.indexOf("windows nt 6.1") != -1) {
    return 'win7';
  }
  if (ua.indexOf("windows nt 6.2") != -1) {
    return 'win8';
  }
}
1 голос
/ 15 марта 2009

Как уже говорили другие, нет, ненадежно.

По этой причине, например, jquery переключился на возможности браузера система (из-за отсутствия лучшего слова) вместо системы поиска кода браузера для его функциональных возможностей.

1 голос
/ 15 марта 2009

Вы действительно должны стараться избегать подобных действий, если это не является абсолютно необходимым для функциональности веб-приложения.

Помните, что:

Не все запросы могут поступать от клиента, работающего в Windows.

Не все запросы могут поступать от клиента, который поддерживает JavaScript.

Заголовок user-agent может отсутствовать в запросе.

То, что находится в заголовке user-agent, может быть ошибочным.

Хорошо разработанное веб-приложение должно обеспечивать полный контент и функциональные возможности независимо от того, что находится в заголовке пользовательского агента запроса или если клиент поддерживает JavaScript или любое другое клиентское расширение.

1 голос
/ 15 марта 2009

Не думаю, что вы сможете различать разные версии Vista, но вы должны иметь возможность получить ОС из свойства платформы объекта navigator . Вам, вероятно, придется проанализировать его или дифференцировать по содержимому.

<script type="text/javascript">
   alert( navigator.platform );
</script>

См. www.w3schools.com учебные пособия для примера , показывающие, как получить все свойства навигатора.

EDIT

Чтобы получить точную версию, вы можете разработать элемент управления ActiveX (только для Windows) или Java-апплет и использовать объект java.lang.System для просмотра текущих системных свойств. Вы можете получить достаточно информации из браузера для систем, отличных от Windows, и использовать этот элемент управления только для систем Windows. Я не пробовал это, поэтому вам нужно экспериментировать, чтобы увидеть, будет ли это работать. Я должен верить, что элемент управления Microsoft ActiveX для Центра обновления Майкрософт способен определить точную версию системы и установленное программное обеспечение для его работы.

0 голосов
/ 23 января 2014

Хотя вопрос очень старый, но я просто отвечаю на него:

просто попробуйте:

$this->agent->platform()

это даст вам вывод: Linux, Windows, OS X, etc.

для получения дополнительной информации посетите:

http://ellislab.com/codeigniter/user-guide/libraries/user_agent.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...