navigator.userAgent 浅析

下面先展示一些常见 系统&浏览器 的 userAgent 值,测试时间为 2016-12-06 中午,除注明外,所以浏览器都为最新版本。

userAgent 在维基百科的解释是这样的,它告诉服务器一些客户端的基本信息,包括软件 (Browser) 版本和系统信息等。

In computing, a user agent is software (a software agent) that is acting on behalf of a user. One common use of the term refers to a web browser telling a web site information about the browser and operating system.

我在这里测试了如下几种系统的不同浏览器表现。

  1. Mac OS
  2. iPhone
  3. iPad
  4. Ubuntu
  5. Android5
  6. Android4

1-1 Mac OS Chrome

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Chrome/54.0.2840.98  
Safari/537.36  

1-2 Mac OS Firefox

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:47.0)  
Gecko/20100101  
Firefox/47.0  

1-3 Mac OS Safari

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1)  
AppleWebKit/602.2.14 (KHTML, like Gecko)  
Version/10.0.1  
Safari/602.2.14  

2-1 iPhone6 iOS Safari

Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X)  
AppleWebKit/602.2.14 (KHTML, like Gecko)  
Version/10.0  
Mobile/14B100  
Safari/602.1  

2-2 iPhone6 iOS Chrome

Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X)  
AppleWebKit/602.1.50 (KHTML, like Gecko)  
CriOS/55.0.2883.79  
Mobile/14B100  
Safari/602.1  

2-3 iPhone6 iOS QQ Inner Browser

Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X)  
AppleWebKit/602.2.14 (KHTML, like Gecko)  
Mobile/14B100  
QQ/6.6.0.443 V1_IPH_SQ_6.6.0_1_APP_A  
Pixel/750  
Core/UIWebView  
NetType/WIFI  

2-3 iPhone6 iOS Wechat Inner Browser

Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X)  
AppleWebKit/602.2.14 (KHTML, like Gecko)  
Mobile/14B100  
MicroMessenger/6.3.31  
NetType/WIFI  
Language/en  

3-1 iPad mini iOS Safari

Mozilla/5.0 (iPad; CPU iPhone OS 10_1_1 like Mac OS X)  
AppleWebKit/602.2.14 (KHTML, like Gecko)  
Version/10.0  
Mobile/14B100  
Safari/602.1  
可以看出,iPad 与 iPhone 信息都是一样的,毕竟都是 iOS 系统。唯一区别是设备信息,为 iPad 和 iPhone 所以 iPad 的 userAgent 信息在这里不再展开了。

4-1 Ubuntu 16.0.4 Chrome

Mozilla/5.0 (X11; Linux x86_64)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Chrome/54.0.2840.59  
Safari/537.36  

4-1 Ubuntu 16.0.4 Firefox

Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0)  
Gecko/20100101  
Firefox/50.0  

5-1 Android 5.1.1 QQBrowser

Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; NX511J_V3 Build/LMY47V) AppleWebKit/534.30 (KHTML, like Gecko)  
Version/4.0  
MQQBrowser/5.3 Mobile  
Safari/534.30  
安卓端 QQ内置浏览器 和 QQ浏览器 的 userAgent 完全一致。

5-2 Android 5.1.1 Wechat Inner Browser

Mozilla/5.0 (Linux; Android 5.1.1; NX511J_V3 Build/LMY47V)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Version/4.0  
Chrome/37.0.0.0 Mobile  
MQQBrowser/6.8 TBS/036872  
Safari/537.36  
MicroMessenger/6.3.18.800  
NetType/WIFI  
Language/zh_CN  

6-1 Windows10 Chrome

Mozilla/5.0 (Windows NT 10.0; WOW64)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Chrome/54.0.2840.99  
Safari/537.36  

6-2 Windows10 IE11

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; rv:11.0) like Gecko  

6-3 Windows10 Edge

Mozilla/5.0 (Windows NT 10.0; Win64; x64)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Chrome/51.0.2704.79  
Safari/537.36  
Edge/14.14393  
可喜可贺,微软在 Edge 上放弃了自己的 Trident 引擎,转向苹果的 Webkit 阵营了。

实现简单的 userAgent 匹配

Ubuntu 必须放在 Linux 之前,因为来自 Ubuntu 系统的 userAgent 内同时包含 UbuntuLinux 两个字段。与此类似,Chrome 必须放在 Safari 之前,Edge 必须放在 Chrome 之前。

;(function () {
  var Systems = ['Macintosh', 'Windows', 'Android', 'iPad', 'iPhone', 'Ubuntu', 'Linux']
  var Browsers = [ 'Trident', 'MicroMessenger', 'QQ', 'Edge', 'Opera', 'Chrome', 'Firefox', 'Safari']
  var System = []
  var Browser = []

  var UA = navigator.userAgent

  function compare(UA, Result, Arr) {
    Arr.forEach(function (ele) {
      if (!!UA.match(ele) && !Result.length) {
        Result.push(ele)
      }
    })
    }

  compare(UA, System, Systems)
  compare(UA, Browser, Browsers)

  //change name
  if (System[0] == 'Macintosh') {
    System[0] = 'Mac OS X'   
  }

  if (Browser[0] == 'Trident') {
    Browser[0] = '万恶的 IE'
  }

  if (Browser[0] == 'MicroMessenger') {
    Browser[0] = '微信内置浏览器'
  }

  if (Browser[0] == 'QQ') {
    Browser[0] = 'QQ浏览器'
  }

  console.log('系统: ' + System[0])
  console.log('浏览器: ' + Browser[0])
})()