web-dev-qa-db-ja.com

ブラウザから正確なOSバージョンを検出する

PHP/JS/ASPを使用してブラウザーからオペレーティングシステムの正確なバージョンを検出できる方法があるかどうか疑問に思っていましたか?

OSの種類(Windows XP、Windows Vista、OS Xなど)を検出できることはわかっていますが、正確なバージョンを検出する必要があります:Vista Business、Vista Ultimate、Windows XP Home、Windows XPプロなど...

18
Roy Peleg

短い答え:できません。

長い答え:

必要なのは、通常はOS名とバージョンが含まれているHTTP User-Agentヘッダーの情報だけです。

通常、Mac OSおよびLinuxで実行されているブラウザは、正確なOSを識別するのに十分な情報を送信します。たとえば、これは私の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を実行していることがわかります。

そして、これが私のMacBook ProでのFirefoxとSafari 4 Betaのレポートです。

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; en-us)AppleWebKit/528.16(KHTML、like Gecko)バージョン/4.0 Safari/528.16

一方、Windowsブラウザーは通常、OSバージョンのみを報告し、特定のパッケージ(Pro、Businessなど)は報告しません。

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

25
Can Berk Güder

グーグルで検索したところ、このコードが見つかり、問題なく動作しているようです(ただし、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;
?>
17
Reed Richards

//これはあなたを助けます

$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);
14
Sanjay

クラシックASPおよびASP.Netの使用

Request.ServerVariables("HTTP_USER_AGENT")

これは解釈されたコードではなく、サーバーで実行されているため、最適に機能します。

2
Danny G

Vistaの異なるバージョンを区別することはできないと思いますが、 navigator オブジェクトのプラットフォームプロパティからOSを取得できるはずです。ただし、おそらくそれを解析するか、その内容に基づいて区別する必要があります。

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

すべてのナビゲーターのプロパティを取得する方法を示す www.w3schools.com チュートリアルを参照してください。

[〜#〜]編集[〜#〜]

正確なバージョンを取得するには、ActiveXコントロール(Windowsのみ)またはJavaアプレットを開発し、Java.lang.Systemオブジェクトを使用して現在のシステムプロパティを表示します。 Windows以外のシステムではブラウザから十分な情報を取得し、Windowsシステムでのみコントロールを使用できます。私はこれを試したことがないので、うまくいくかどうかを実験する必要があります。MicrosoftのActiveX Microsoft Updateのコントロールは、正確なシステムバージョンとインストールされたソフトウェアを検出して機能させることができます。

1
tvanfosson

これが最も簡単な方法です。

http://mobiledetect.net からライブラリをダウンロードします

CIを使用する場合、または単に含める場合は、Mobile_Detect.phpを「ライブラリ」に配置します。

このコードを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 のドキュメントを検索

Webアプリケーションの機能に絶対に必要な場合を除いて、そのようなことは絶対に避けてください。

を注意:

すべてのリクエストがWindowsで実行されているクライアントから送信されるわけではありません。

JavaScriptをサポートするクライアントからすべてのリクエストを送信できるわけではありません。

ユーザーエージェントヘッダーがリクエストに含まれていない可能性があります。

ユーザーエージェントヘッダーの内容は誤解を招く可能性があります。

適切に設計されたWebアプリケーションは、リクエストのユーザーエージェントヘッダーの内容やクライアントがJavaScriptまたはその他のクライアント側拡張機能をサポートしているかどうかに関係なく、完全なコンテンツと機能を提供する必要があります。

1
Vasil

他の人がすでに言ったように、いいえ、確実ではありません。

これが、たとえばjqueryが、その機能のためにブラウザスニッフィングシステムではなく、ブラウザ機能system(より優れたWordがないため)に切り替わった理由です。

1
jeroen

これを行うjquery関数を作成しました。この方法で navigator を使用してすべてのOSを追跡できます。

誰かがこれから助けを得ることを願っています:

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
vyasamit2007

codeIgniterには「user_agent」というライブラリがあります。それはあなたが本当に必要なすべてをあなたに与えるでしょう。 CIを使用していない場合でも、フレームワークのコードを「抽出」できます。お役に立てば幸いです。 http://codeigniter.com/user_guide/libraries/user_agent.html

0
lokers