JS获取移动端系统信息(操作系统、操作系统版本、横竖屏状态、设备类型、网络状态、生成浏览器指纹)
GitHub: https://github.com/skillnull/Get-Device-Info
在线实例:http://skillnull.com/others/GetDeviceInfo/index.html
var DeviceInfo = (function () {
var root = typeof self !== 'undefined' ? self : this
var _window = root || {}
// 变量库
var VariableLibrary = {
navigator: typeof root.navigator != 'undefined' ? root.navigator : {},
// 信息map
infoMap: {
engine: ['WebKit', 'Trident', 'Gecko', 'Presto'],
browser: ['Safari', 'Chrome', 'Edge', 'IE', 'Firefox', 'Firefox Focus', 'Chromium', 'Opera', 'Vivaldi', 'Yandex', 'Arora', 'Lunascape', 'QupZilla', 'Coc Coc', 'Kindle', 'Iceweasel', 'Konqueror', 'Iceape', 'SeaMonkey', 'Epiphany', '360', '360SE', '360EE', 'UC', 'QQBrowser', 'QQ', 'Baidu', 'Maxthon', 'Sogou', 'LBBROWSER', '2345Explorer', 'TheWorld', 'XiaoMi', 'Quark', 'Qiyu', 'Wechat', 'Taobao', 'Alipay', 'Weibo', 'Douban', 'Suning', 'iQiYi'],
os: ['Windows', 'Linux', 'Mac OS', 'Android', 'Ubuntu', 'FreeBSD', 'Debian', 'iOS', 'Windows Phone', 'BlackBerry', 'MeeGo', 'Symbian', 'Chrome OS', 'WebOS'],
device: ['Mobile', 'Tablet', 'iPad']
}
}
// 方法库
var MethodLibrary = (function () {
return {
// 获取匹配库
getMatchMap: function (u) {
return {
// 内核
'Trident': u.indexOf('Trident') > -1 || u.indexOf('NET CLR') > -1,
'Presto': u.indexOf('Presto') > -1,
'WebKit': u.indexOf('AppleWebKit') > -1,
'Gecko': u.indexOf('Gecko/') > -1,
// 浏览器
'Safari': u.indexOf('Safari') > -1,
'Chrome': u.indexOf('Chrome') > -1 || u.indexOf('CriOS') > -1,
'IE': u.indexOf('MSIE') > -1 || u.indexOf('Trident') > -1,
'Edge': u.indexOf('Edge') > -1,
'Firefox': u.indexOf('Firefox') > -1 || u.indexOf('FxiOS') > -1,
'Firefox Focus': u.indexOf('Focus') > -1,
'Chromium': u.indexOf('Chromium') > -1,
'Opera': u.indexOf('Opera') > -1 || u.indexOf('OPR') > -1,
'Vivaldi': u.indexOf('Vivaldi') > -1,
'Yandex': u.indexOf('YaBrowser') > -1,
'Arora': u.indexOf('Arora') > -1,
'Lunascape': u.indexOf('Lunascape') > -1,
'QupZilla': u.indexOf('QupZilla') > -1,
'Coc Coc': u.indexOf('coc_coc_browser') > -1,
'Kindle': u.indexOf('Kindle') > -1 || u.indexOf('Silk/') > -1,
'Iceweasel': u.indexOf('Iceweasel') > -1,
'Konqueror': u.indexOf('Konqueror') > -1,
'Iceape': u.indexOf('Iceape') > -1,
'SeaMonkey': u.indexOf('SeaMonkey') > -1,
'Epiphany': u.indexOf('Epiphany') > -1,
'360': u.indexOf('QihooBrowser') > -1 || u.indexOf('QHBrowser') > -1,
'360EE': u.indexOf('360EE') > -1,
'360SE': u.indexOf('360SE') > -1,
'UC': u.indexOf('UC') > -1 || u.indexOf(' UBrowser') > -1,
'QQBrowser': u.indexOf('QQBrowser') > -1,
'QQ': u.indexOf('QQ/') > -1,
'Baidu': u.indexOf('Baidu') > -1 || u.indexOf('BIDUBrowser') > -1,
'Maxthon': u.indexOf('Maxthon') > -1,
'Sogou': u.indexOf('MetaSr') > -1 || u.indexOf('Sogou') > -1,
'LBBROWSER': u.indexOf('LBBROWSER') > -1,
'2345Explorer': u.indexOf('2345Explorer') > -1,
'TheWorld': u.indexOf('TheWorld') > -1,
'XiaoMi': u.indexOf('MiuiBrowser') > -1,
'Quark': u.indexOf('Quark') > -1,
'Qiyu': u.indexOf('Qiyu') > -1,
'Wechat': u.indexOf('MicroMessenger') > -1,
'Taobao': u.indexOf('AliApp(TB') > -1,
'Alipay': u.indexOf('AliApp(AP') > -1,
'Weibo': u.indexOf('Weibo') > -1,
'Douban': u.indexOf('com.douban.frodo') > -1,
'Suning': u.indexOf('SNEBUY-APP') > -1,
'iQiYi': u.indexOf('IqiyiApp') > -1,
// 系统或平台
'Windows': u.indexOf('Windows') > -1,
'Linux': u.indexOf('Linux') > -1 || u.indexOf('X11') > -1,
'Mac OS': u.indexOf('Macintosh') > -1,
'Android': u.indexOf('Android') > -1 || u.indexOf('Adr') > -1,
'Ubuntu': u.indexOf('Ubuntu') > -1,
'FreeBSD': u.indexOf('FreeBSD') > -1,
'Debian': u.indexOf('Debian') > -1,
'Windows Phone': u.indexOf('IEMobile') > -1 || u.indexOf('Windows Phone') > -1,
'BlackBerry': u.indexOf('BlackBerry') > -1 || u.indexOf('RIM') > -1,
'MeeGo': u.indexOf('MeeGo') > -1,
'Symbian': u.indexOf('Symbian') > -1,
'iOS': u.indexOf('like Mac OS X') > -1,
'Chrome OS': u.indexOf('CrOS') > -1,
'WebOS': u.indexOf('hpwOS') > -1,
// 设备
'Mobile': u.indexOf('Mobi') > -1 || u.indexOf('iPh') > -1 || u.indexOf('480') > -1,
'Tablet': u.indexOf('Tablet') > -1 || u.indexOf('Nexus 7') > -1,
'iPad': u.indexOf('iPad') > -1
}
},
// 在信息map和匹配库中进行匹配
matchInfoMap: function (_this) {
var u = VariableLibrary.navigator.userAgent || {}
var match = MethodLibrary.getMatchMap(u)
for (var s in VariableLibrary.infoMap) {
for (var i = 0; i < VariableLibrary.infoMap[s].length; i++) {
var value = VariableLibrary.infoMap[s][i]
if (match[value]) {
_this[s] = value
}
}
}
},
// 获取当前操作系统
getOS: function () {
var _this = this
MethodLibrary.matchInfoMap(_this)
return _this.os
},
// 获取操作系统版本
getOSVersion: function () {
var _this = this
var u = VariableLibrary.navigator.userAgent || {}
_this.osVersion = ''
// 系统版本信息
var osVersion = {
'Windows': function () {
var v = u.replace(/^.*Windows NT ([\d.]+);.*$/, '$1')
var oldWindowsVersionMap = {
'6.4': '10',
'6.3': '8.1',
'6.2': '8',
'6.1': '7',
'6.0': 'Vista',
'5.2': 'XP',
'5.1': 'XP',
'5.0': '2000'
}
return oldWindowsVersionMap[v] || v
},
'Android': function () {
return u.replace(/^.*Android ([\d.]+);.*$/, '$1')
},
'iOS': function () {
return u.replace(/^.*OS ([\d_]+) like.*$/, '$1').replace(/_/g, '.')
},
'Debian': function () {
return u.replace(/^.*Debian\/([\d.]+).*$/, '$1')
},
'Windows Phone': function () {
return u.replace(/^.*Windows Phone( OS)? ([\d.]+);.*$/, '$2')
},
'Mac OS': function () {
return u.replace(/^.*Mac OS X ([\d_]+).*$/, '$1').replace(/_/g, '.')
},
'WebOS': function () {
return u.replace(/^.*hpwOS\/([\d.]+);.*$/, '$1')
}
}
if (osVersion[_this.os]) {
_this.osVersion = osVersion[_this.os]()
if (_this.osVersion == u) {
_this.osVersion = ''
}
}
return _this.osVersion
},
// 获取横竖屏状态
getOrientationStatu: function () {
var orientationStatus = ''
var orientation = window.matchMedia("(orientation: portrait)")
if (orientation.matches) {
orientationStatus = "竖屏"
} else {
orientationStatus = "横屏"
}
return orientationStatus
},
// 获取设备类型
getDeviceType: function () {
var _this = this
_this.device = 'PC'
MethodLibrary.matchInfoMap(_this)
return _this.device
},
// 获取网络状态
getNetwork: function () {
var netWork = navigator && navigator.connection && navigator.connection.effectiveType
return netWork
},
// 获取当前语言
getLanguage: function () {
var _this = this
_this.language = (function () {
var language = (VariableLibrary.navigator.browserLanguage || VariableLibrary.navigator.language)
var arr = language.split('-')
if (arr[1]) {
arr[1] = arr[1].toUpperCase()
}
return arr.join('_')
})()
return _this.language
},
// 生成浏览器指纹
createFingerprint: function (domain) {
var fingerprint
function bin2hex (s) {
var i, l, n, o = ''
s += ''
for (i = 0, l = s.length; i < l; i++) {
n = s.charCodeAt(i)
.toString(16)
o += n.length < 2 ? '0' + n : n
}
return o
}
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d')
var txt = domain || window.location.host
ctx.textBaseline = "top"
ctx.font = "14px 'Arial'"
ctx.textBaseline = "tencent"
ctx.fillStyle = "#f60"
ctx.fillRect(125, 1, 62, 20)
ctx.fillStyle = "#069"
ctx.fillText(txt, 2, 15)
ctx.fillStyle = "rgba(102, 204, 0, 0.7)"
ctx.fillText(txt, 4, 17)
var b64 = canvas.toDataURL().replace("data:image/png;base64,", "")
var bin = atob(b64)
var crc = bin2hex(bin.slice(-16, -12))
fingerprint = crc
return fingerprint
},
// 浏览器信息
getBrowserInfo: function () {
var _this = this
MethodLibrary.matchInfoMap(_this) var u = VariableLibrary.navigator.userAgent || {} var _mime = function (option, value) {
var mimeTypes = VariableLibrary.navigator.mimeTypes
for (var key in mimeTypes) {
if (mimeTypes[key][option] == value) {
return true
}
}
return false
} var match = MethodLibrary.getMatchMap(u) var is360 = false
if (_window.chrome) {
var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1')
if (chrome_vision > 36 && _window.showModalDialog) {
is360 = true
} else if (chrome_vision > 45) {
is360 = _mime("type", "application/vnd.chromium.remoting-viewer")
}
}
if (match['Baidu'] && match['Opera']) {
match['Baidu'] = false
}
if (match['Mobile']) {
match['Mobile'] = !(u.indexOf('iPad') > -1)
}
if (is360) {
if (_mime("type", "application/gameplugin")) {
match['360SE'] = true
} else if (VariableLibrary.navigator && typeof VariableLibrary.navigator['connection']['saveData'] == 'undefined') {
match['360SE'] = true
} else {
match['360EE'] = true
}
}
if (match['IE'] || match['Edge']) {
var navigator_top = window.screenTop - window.screenY
switch (navigator_top) {
case 71: // 无收藏栏,贴边
break
case 74: // 无收藏栏,非贴边
break
case 99: // 有收藏栏,贴边
break
case 102: // 有收藏栏,非贴边
match['360EE'] = true
break;
case 75: // 无收藏栏,贴边
break
case 74: // 无收藏栏,非贴边
break
case 105: // 有收藏栏,贴边
break
case 104: // 有收藏栏,非贴边
match['360SE'] = true
break
default:
break
}
} var browerVersionMap = {
'Safari': function () {
return u.replace(/^.*Version\/([\d.]+).*$/, '$1')
},
'Chrome': function () {
return u.replace(/^.*Chrome\/([\d.]+).*$/, '$1').replace(/^.*CriOS\/([\d.]+).*$/, '$1')
},
'IE': function () {
return u.replace(/^.*MSIE ([\d.]+).*$/, '$1').replace(/^.*rv:([\d.]+).*$/, '$1')
},
'Edge': function () {
return u.replace(/^.*Edge\/([\d.]+).*$/, '$1')
},
'Firefox': function () {
return u.replace(/^.*Firefox\/([\d.]+).*$/, '$1').replace(/^.*FxiOS\/([\d.]+).*$/, '$1')
},
'Firefox Focus': function () {
return u.replace(/^.*Focus\/([\d.]+).*$/, '$1')
},
'Chromium': function () {
return u.replace(/^.*Chromium\/([\d.]+).*$/, '$1')
},
'Opera': function () {
return u.replace(/^.*Opera\/([\d.]+).*$/, '$1').replace(/^.*OPR\/([\d.]+).*$/, '$1')
},
'Vivaldi': function () {
return u.replace(/^.*Vivaldi\/([\d.]+).*$/, '$1')
},
'Yandex': function () {
return u.replace(/^.*YaBrowser\/([\d.]+).*$/, '$1')
},
'Arora': function () {
return u.replace(/^.*Arora\/([\d.]+).*$/, '$1')
},
'Lunascape': function () {
return u.replace(/^.*Lunascape[\/\s]([\d.]+).*$/, '$1')
},
'QupZilla': function () {
return u.replace(/^.*QupZilla[\/\s]([\d.]+).*$/, '$1')
},
'Coc Coc': function () {
return u.replace(/^.*coc_coc_browser\/([\d.]+).*$/, '$1')
},
'Kindle': function () {
return u.replace(/^.*Version\/([\d.]+).*$/, '$1')
},
'Iceweasel': function () {
return u.replace(/^.*Iceweasel\/([\d.]+).*$/, '$1')
},
'Konqueror': function () {
return u.replace(/^.*Konqueror\/([\d.]+).*$/, '$1')
},
'Iceape': function () {
return u.replace(/^.*Iceape\/([\d.]+).*$/, '$1')
},
'SeaMonkey': function () {
return u.replace(/^.*SeaMonkey\/([\d.]+).*$/, '$1')
},
'Epiphany': function () {
return u.replace(/^.*Epiphany\/([\d.]+).*$/, '$1')
},
'360': function () {
return u.replace(/^.*QihooBrowser\/([\d.]+).*$/, '$1')
},
'360SE': function () {
var hash = {'63': '10.0', '55': '9.1', '45': '8.1', '42': '8.0', '31': '7.0', '21': '6.3'}
var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1')
return hash[chrome_vision] || ''
},
'360EE': function () {
var hash = {'69': '11.0', '63': '9.5', '55': '9.0', '50': '8.7', '30': '7.5'};
var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, '$1')
return hash[chrome_vision] || ''
},
'Maxthon': function () {
return u.replace(/^.*Maxthon\/([\d.]+).*$/, '$1')
},
'QQBrowser': function () {
return u.replace(/^.*QQBrowser\/([\d.]+).*$/, '$1')
},
'QQ': function () {
return u.replace(/^.*QQ\/([\d.]+).*$/, '$1')
},
'Baidu': function () {
return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/, '$1')
},
'UC': function () {
return u.replace(/^.*UC?Browser\/([\d.]+).*$/, '$1')
},
'Sogou': function () {
return u.replace(/^.*SE ([\d.X]+).*$/, '$1').replace(/^.*SogouMobileBrowser\/([\d.]+).*$/, '$1')
},
'LBBROWSER': function () {
var hash = {'57': '6.5', '49': '6.0', '46': '5.9', '42': '5.3', '39': '5.2', '34': '5.0', '29': '4.5', '21': '4.0'};
var chrome_vision = navigator.userAgent.replace(/^.*Chrome\/([\d]+).*$/, '$1');
return hash[chrome_vision] || '';
},
'2345Explorer': function () {
return u.replace(/^.*2345Explorer\/([\d.]+).*$/, '$1')
},
'TheWorld': function () {
return u.replace(/^.*TheWorld ([\d.]+).*$/, '$1')
},
'XiaoMi': function () {
return u.replace(/^.*MiuiBrowser\/([\d.]+).*$/, '$1')
},
'Quark': function () {
return u.replace(/^.*Quark\/([\d.]+).*$/, '$1')
},
'Qiyu': function () {
return u.replace(/^.*Qiyu\/([\d.]+).*$/, '$1')
},
'Wechat': function () {
return u.replace(/^.*MicroMessenger\/([\d.]+).*$/, '$1')
},
'Taobao': function () {
return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/, '$1')
},
'Alipay': function () {
return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/, '$1')
},
'Weibo': function () {
return u.replace(/^.*weibo__([\d.]+).*$/, '$1')
},
'Douban': function () {
return u.replace(/^.*com.douban.frodo\/([\d.]+).*$/, '$1')
},
'Suning': function () {
return u.replace(/^.*SNEBUY-APP([\d.]+).*$/, '$1')
},
'iQiYi': function () {
return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/, '$1')
}
}
_this.browserVersion = ''
if (browerVersionMap[_this.browser]) {
_this.browserVersion = browerVersionMap[_this.browser]()
if (_this.browserVersion == u) {
_this.browserVersion = ''
}
} if (_this.browser == 'Edge') {
_this.engine = 'EdgeHTML'
}
if (_this.browser == 'Chrome' && parseInt(_this.browserVersion) > 27) {
_this.engine = 'Blink'
}
if (_this.browser == 'Opera' && parseInt(_this.browserVersion) > 12) {
_this.engine = 'Blink'
}
if (_this.browser == 'Yandex') {
_this.engine = 'Blink'
} return _this.browser + '(版本: ' + _this.browserVersion + ' 内核: ' + _this.engine + ')'
}
}
})()
// 逻辑层
var LogicLibrary = (function () {
return {
DeviceInfoObj: function (params) {
var info = {
deviceType: MethodLibrary.getDeviceType(), // 设备类型
OS: MethodLibrary.getOS(), // 操作系统
OSVersion: MethodLibrary.getOSVersion(), // 操作系统版本
screenHeight: _window.screen.height, // 屏幕高
screenWidth: _window.screen.width, // 屏幕宽
language: MethodLibrary.getLanguage(), // 当前使用的语言-国家
netWork: MethodLibrary.getNetwork(), // 联网类型
orientation: MethodLibrary.getOrientationStatu(), // 横竖屏
browserInfo: MethodLibrary.getBrowserInfo(), // 浏览器信息
fingerprint: MethodLibrary.createFingerprint(params.domain), // 浏览器指纹
userAgent: VariableLibrary.navigator.userAgent // 包含 appCodeName,appName,appVersion,language,platform 等
}
if (!params.info || params.info.length == 0) {
return info
} else {
var infoTemp = {}
for (var i in info) {
params.info.forEach(function (item) {
if (item.toLowerCase() == i.toLowerCase()) {
item = i
infoTemp[item] = info[item]
}
})
}
return infoTemp
}
}
}
})()
// 对外暴露方法
return {
getDeviceInfo: function (params) {
return LogicLibrary.DeviceInfoObj(params)
}
}
})()
JS获取移动端系统信息(操作系统、操作系统版本、横竖屏状态、设备类型、网络状态、生成浏览器指纹)的更多相关文章
- JS获取客户端电脑信息(转)
<html> <head> <title></title> <script type="text/javascript"> ...
- js获取response头信息
当我们使用ajax发起请求时,经常需要获取请求返回的头信息.默认情况下,js货可以获取如下头信息: Cache-Control Content-Language Content-Type Expirs ...
- JS获取页面URL信息
下面我们举例一个URL,然后获得它的各个组成部分: http://i.cnblogs.com/EditPosts.aspx?opt=1 window.location.href (设置或获取整个 UR ...
- js获取手机型号和手机操作系统版本号
1.js 判断IOS版本号 先来观察 iOS 的 User-Agent 串: iPhone 4.3.2 系统:Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 l ...
- js 获取当前URL信息
document.location 这个对象包含了当前URL的信息 location.host 获取port号 location.hostname 设置或获取主机名称 location.href 设置 ...
- java通过浏览器请求头(User-Agent)获取访问者设备信息以及系统版本
个人博客 地址:http://www.wenhaofan.com/article/20181125220342 在开发AutuBlog项目时需要做后台的登录记录,想起浏览器的User-Agent,于是 ...
- 原生js获取手机定位信息
<script type="text/javascript"> function Location() {}; Location.prototype.getLocati ...
- 如何用js得到当前页面的url信息方法(JS获取当前网址信息)
设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...
- js获取当前页面信息
设置或获取对象指定的文件名或路径.<script>alert(window.location.pathname)</script> 设置或获取整个 URL 为字符串.<s ...
随机推荐
- [CF106C]Buns
面包师Lavrenty打算用馅料做几个面包,然后把它们卖掉. Lavrenty有\(n\)克面团和\(m\)种不同的馅料.馅料种类的下标从\(1到m\),他知道他的第\(i\)种馅料剩下\(a_i\) ...
- 【Set jsonObj = toJson( jsonString )】创建JSON实例
创建JSON实例: 原型: toJson( jsonString ) 说明: 创建JSON实例 返回: [JSON] 参数: jsonString [可选] 可以用json格式字符串创建实例 示例: ...
- OpenMPI源码剖析2:ompi_mpi_errors_are_fatal_comm_handler函数
上一篇文章说道,初始化失败会有一个函数调用: ompi_mpi_errors_are_fatal_comm_handler(NULL, NULL, message); 所以这里简单地进入了 ompi_ ...
- Office 365 E3功能
本文简要总结了Office 365E3的功能
- 01背包问题:DP
题目描述: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出 ...
- Python3 条件与循环
1.条件控制 下面是一个简单的条件控制语句 s=input('Please input a str: ') if s=='python': print('I love python!') elif s ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- A4
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...
- Java容器之List接口
List 接口: 1. List 接口是 Collection 的子接口,实现 List 接口的容器类中的元素是有顺序的,而且可以重复: 2. List 容器中的元素都对应一个整数型的序号记载其在容器 ...
- python学习笔记06:操作文件
调用内置的open函数打开文件,传递两个参数:文件路径(绝对路径或相对路径),打开模式('r':读,'r+':读写,'w':写,'b':二进制): f = open('data.txt','w') f ...