博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js获取ip地址,操作系统,浏览器版本等信息,可兼容
阅读量:5106 次
发布时间:2019-06-13

本文共 5778 字,大约阅读时间需要 19 分钟。

  这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息。

  先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器的支持情况来决定,目前主流浏览器对于ipv4的支持是统一的。第一种:用于仅支持IE的且允许Activex运行,利用ActiveObject来获取。这种的话可以选择性使用。第二种:利用其它平台的接口,在自己程序中使用如:新浪,太平洋等的接口,来给用户返回ip地址,这种是不太安全的方式,万一人家改变接口了呢?第三种(也是我采用的方式):使用WebRTC(Web Real-Time Communications),他的定义是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。当然这些信息和基本api在上面是可以查看的。我们可以使用WebRTC获取ip地址,经测试,在chrome,opera,firefox,safari均可正常获取,对于IE和Edge,可以采用第一种方式进行兼容。下面是获取代码(我这里没有支持IE/Edge):

1 function getYourIP(){ 2             var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; 3             if (RTCPeerConnection) (function () { 4                 var rtc = new RTCPeerConnection({iceServers:[]}); 5                 if (1 || window.mozRTCPeerConnection) {      6                     rtc.createDataChannel('', {reliable:false}); 7                 }; 8                  9                 rtc.onicecandidate = function (evt) {10                     if (evt.candidate) grepSDP("a="+evt.candidate.candidate);11                 };12                 rtc.createOffer(function (offerDesc) {13                     grepSDP(offerDesc.sdp);14                     rtc.setLocalDescription(offerDesc);15                 }, function (e) { console.warn("offer failed", e); });16                 17                 18                 var addrs = Object.create(null);19                 addrs["0.0.0.0"] = false;20                 function updateDisplay(newAddr) {21                     if (newAddr in addrs) return;22                     else addrs[newAddr] = true;23                     var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });24                     for(var i = 0; i < displayAddrs.length; i++){25                         if(displayAddrs[i].length > 16){26                             displayAddrs.splice(i, 1);27                             i--;28                         }29                     }30                     document.getElementById('list').textContent = displayAddrs[0];31                 }32                 33                 function grepSDP(sdp) {34                     var hosts = [];35                     sdp.split('\r\n').forEach(function (line, index, arr) { 36                        if (~line.indexOf("a=candidate")) {    37                             var parts = line.split(' '),       38                                 addr = parts[4],39                                 type = parts[7];40                             if (type === 'host') updateDisplay(addr);41                         } else if (~line.indexOf("c=")) {       42                             var parts = line.split(' '),43                                 addr = parts[2];44                             updateDisplay(addr);45                         }46                     });47                 }48             })();49             else{50                 document.getElementById('list').textContent = "请使用主流浏览器:chrome,firefox,opera,safari";51             }52         }

 

  其次是获取操作系统,浏览器信息:这里到没有那么麻烦,我使用了包含浏览器信息的Navigator对象,这个对象虽然没有公开标准,但是所有的浏览器都支持他,这就好办了。我们主要用到的是useragent属性,他包含了这些信息,我们要做的只是使用正则表达式分离和提取,针对不同的浏览器,兼容chrome,firefox,opera,ie,edge,safari等,对于其他浏览器,例如360极速等,会返回相应内核对应的浏览器名称。也可以再进行其他判断。下面是代码:

1 function getBrowserInfo(){ 2             var agent = navigator.userAgent.toLowerCase() ; 3             console.log(agent); 4             var arr = []; 5             var system = agent.split(' ')[1].split(' ')[0].split('(')[1]; 6             arr.push(system); 7             var regStr_edge = /edge\/[\d.]+/gi; 8             var regStr_ie = /trident\/[\d.]+/gi ; 9             var regStr_ff = /firefox\/[\d.]+/gi;10             var regStr_chrome = /chrome\/[\d.]+/gi ;11             var regStr_saf = /safari\/[\d.]+/gi ;12             var regStr_opera = /opr\/[\d.]+/gi;13             //IE14             if(agent.indexOf("trident") > 0){15                 arr.push(agent.match(regStr_ie)[0].split('/')[0]);16                 arr.push(agent.match(regStr_ie)[0].split('/')[1]);17                 return arr;18             }19             //Edge20             if(agent.indexOf('edge') > 0){21                 arr.push(agent.match(regStr_edge)[0].split('/')[0]);22                 arr.push(agent.match(regStr_edge)[0].split('/')[1]);23                 return arr;24             }25             //firefox26             if(agent.indexOf("firefox") > 0){27                 arr.push(agent.match(regStr_ff)[0].split('/')[0]);28                 arr.push(agent.match(regStr_ff)[0].split('/')[1]);29                 return arr;30             }31             //Opera32             if(agent.indexOf("opr")>0){33                 arr.push(agent.match(regStr_opera)[0].split('/')[0]);34                 arr.push(agent.match(regStr_opera)[0].split('/')[1]);35                 return arr;36             }37             //Safari38             if(agent.indexOf("safari") > 0 && agent.indexOf("chrome") < 0){39                 arr.push(agent.match(regStr_saf)[0].split('/')[0]);40                 arr.push(agent.match(regStr_saf)[0].split('/')[1]);41                 return arr;42             }43             //Chrome44             if(agent.indexOf("chrome") > 0){45                 arr.push(agent.match(regStr_chrome)[0].split('/')[0]);46                 arr.push(agent.match(regStr_chrome)[0].split('/')[1]);47                 return arr;48             }else{49                 arr.push('请更换主流浏览器,例如chrome,firefox,opera,safari,IE,Edge!')50                 return arr;51             }52         }

  好了,这次的分享就到这里,谢谢你的阅读,如果有什么不对或者更好的方式请您提出宝贵的意见,或者您有什么问题也可以评论,我会尽力为您解答,再次感谢您的关注!!

  若要发布在网上或者转载的话请注上原文地址:

  作者:

  原文地址:

 

转载于:https://www.cnblogs.com/zgh-blog/p/jsGetIPAndBrowserInfo.html

你可能感兴趣的文章
人类的数学抽象思维
查看>>
时序图
查看>>
beyond compare 4.2.9桌面右键集成的问题修复
查看>>
冒泡排序
查看>>
jdk8_默认方法
查看>>
PS 2018安装教程
查看>>
transition 用法
查看>>
淘宝镜像cnpm提示“不是内部命令”解决方法
查看>>
Host '****' is not allowed to connect to this MySQL server(数据库不能远程连接)
查看>>
java发送POST请求,参数用&分隔
查看>>
java发送POST/GET/PUT/DELETE请求,header传参,body参数为json格式
查看>>
io.dubbo.springboot版本不兼容dubbo-2.5.3
查看>>
redis入门初学知识
查看>>
linux安装redis
查看>>
CDH6.1.1阿里云安装实践
查看>>
假期周进度报告4
查看>>
假期周进度报告5
查看>>
假期周进度报告7
查看>>
《大道至简》读后感
查看>>
假期周进度报告6
查看>>