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 ...
随机推荐
- WEB网站测试心得整理
一.输入框: 1.正常的字母/文字/数字(正常流程的测试): 2.重复提交(输入内容后,重复点击提交按钮): 3.纯异常字符/正常输入夹杂异常字符(!@#¥%……&**等等): 4.长度限制( ...
- PAT - L2-001. 紧急救援( Dijstra )
- PAT - L2-001. 紧急救援 题目链接 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两 ...
- Android UI 设计之 TextView EditText 组件属性方法最详细解析
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...
- iOS开发allocWithZone介绍
首先我们知道,我们需要保证单例类只有一个唯一的实例,而平时我们在初始化一个对象的时候, [[Class alloc] init],其实是做了两件事. alloc 给对象分配内存空间,init是对对象的 ...
- Objective-C 反射机制
该文章属于<简书 — 刘小壮>原创,特此感谢:<简书 — 刘小壮> http://www.jianshu.com/p/5bbde2480680 了解反射机制 Objective ...
- YaoLingJump开发者日志(六)
作为一只天才魔法少女狐,不会魔法怎么行?于是我给瑶玲增加了一个技能:魔法弹. 当然,能使用魔法的前提是得有个魔杖,像这样: 魔杖不仅能让瑶玲使用魔法,当瑶玲被攻击时还能提供2s的无敌状态: ...
- 【week6】psp
本周psp
- 【week4】课堂Scrum站立会议
项目:连连看游戏 小组名称:天天向上(旁听) 小组成员:张政 张金生 李权 武致远 已完成任务 1.本项目采用c#. 2. 初步界面. 形成一个windows下的游戏界面,每个需要消除的方块是一个bu ...
- 可用于jquery animate()方法的css属性
* backgroundPosition * borderWidth * borderBottomWidth * borderLeftWidth * borderRightWidth * border ...
- Jenkins系列-Jenkins构建触发器
触发器说明 build whenever a snapshot dependency is built,当job依赖的快照版本被build时,执行本job. 触发远程构建 (例如,使用脚本):这里使用 ...