前端获取本地ip和外网ip

本文介绍两种获取内网IP的方法及一种获取外网IP的方式。内网方法一是利用WebRTC技术,通过RTCPeerConnection实现;内网方法二是通过监听新IP进行获取。外网IP则通过搜狐提供的API接口查询。

这里要强调下,我们这里是获取本机IP,局域网或者独立电脑,木有联网,若是借用网络接口,如搜狐、新浪等接口地址不行,因为木有网络。就是那种我一打开网页就直接获取了。

内网方法一:

getUserIP(){
        var $this = this
        var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
        if (RTCPeerConnection) (function () {
            var rtc = new RTCPeerConnection({iceServers:[]});
            if (1 || window.mozRTCPeerConnection) {     
                rtc.createDataChannel('', {reliable:false});
            };
            
            rtc.onicecandidate = function (evt) {
                if (evt.candidate) grepSDP("a="+evt.candidate.candidate);
            };
            rtc.createOffer(function (offerDesc) {
                grepSDP(offerDesc.sdp);
                rtc.setLocalDescription(offerDesc);
            }, function (e) { console.warn("offer failed", e); });
            
            
            var addrs = Object.create(null);
            addrs["0.0.0.0"] = false;
            var currentIP2
            function updateDisplay(newAddr) {
              
                if (newAddr in addrs) return;
                else addrs[newAddr] = true;
                var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });
                for(var i = 0; i < displayAddrs.length; i++){
                    if(displayAddrs[i].length > 16){
                        displayAddrs.splice(i, 1);
                        i--;
                    }
                    
                }
                // return displayAddrs[0];
                alert("ip" + displayAddrs[0]);
            }
     
            function grepSDP(sdp) {
                var hosts = [];
                sdp.split('\r\n').forEach(function (line, index, arr) {
                if (~line.indexOf("a=candidate")) {    
                        var parts = line.split(' '),       
                            addr = parts[4],
                            type = parts[7];
                        if (type === 'host') updateDisplay(addr);
                    } else if (~line.indexOf("c=")) {       
                        var parts = line.split(' '),
                            addr = parts[2];
                        updateDisplay(addr);
                    }
                });
            }
     
        })()
    }

内网方法二

getUserIP(onNewIP) { //  onNewIp-新IP的侦听器函数
            //兼容 firefox和 chrome浏览器
            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
            //定义参数
            var pc = new myPeerConnection({
                 iceServers: []
             }),
             noop = function() {},
             localIPs = {},
             ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
             key;
    
             function iterateIP(ip) {
                 if (!localIPs[ip]) onNewIP(ip);
                 localIPs[ip] = true;
            }
    
              //create a bogus data channel
             pc.createDataChannel("");
    
             // create offer and set local description
             pc.createOffer().then(function(sdp) {
                 sdp.sdp.split('\n').forEach(function(line) {
                     if (line.indexOf('candidate') < 0) return;
                     line.match(ipRegex).forEach(iterateIP);
                 });
    
                 pc.setLocalDescription(sdp, noop, noop);
             }).catch(function(reason) {
                 // An error occurred, so handle the failure to connect
             });
    
             //sten for candidate events
             pc.onicecandidate = function(ice) {
                 if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
                 ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
             };
            //  console.log("ip1:"+ip);
        },

外网ip

//通过sohu接口查询外网ip
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>
   console.log(returnCitySN);
</script>
### 前端JavaScript获取本地IP地址的方法 在前端开发中,JavaScript可以利用多种方法尝试获取本地IP地址。以下是一些常见的实现方式及其相关说明: #### 方法一:使用ActiveXObject(仅适用于IE浏览器) 对于老旧的IE浏览器,可以通过`ActiveXObject`来获取本地IP地址。然而,这种方法存在兼容性问题,现代浏览器已不再支持`ActiveXObject`[^1]。 ```javascript function GetLocalIPAddress() { var obj = null; var rslt = ""; try { obj = new ActiveXObject("rcbdyctl.Setting"); rslt = obj.GetIPAddress; obj = null; } catch (e) { console.error("Error:", e); } return rslt; } document.write("你的IP是:" + GetLocalIPAddress()); ``` 此方法不推荐用于现代浏览器环境。 #### 方法二:使用WebRTC技术 现代浏览器通常通过WebRTC(Web Real-Time Communication)技术来获取本地IP地址。以下是基于WebRTC的实现示例[^5]: ```javascript const RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) { const pc = new RTCPeerConnection({ iceServers: [] }); pc.createDataChannel(''); pc.onicecandidate = function(e) { if (e.candidate) { const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/; const ipMatch = e.candidate.candidate.match(ipRegex); if (ipMatch && ipMatch[1]) { console.log("本地IP地址:", ipMatch[1]); pc.close(); } } }; pc.createOffer().then(offer => pc.setLocalDescription(offer)); } else { console.error("当前浏览器不支持RTCPeerConnection"); } ``` 需要注意的是,在某些版本的Chrome浏览器中,可能会出现`.local`后缀的问题。这是因为mDNS(Multicast DNS)导致的。为解决这一问题,可以调整Chrome配置[^4]: 1. 在地址栏输入`chrome://flags/`。 2. 搜索`#enable-webrtc-hide-local-ips-with-mdns`,将其设置为`Disabled`。 #### 方法三:通过第三方API 如果需要更可靠的解决方案,可以借助第三方服务来获取用户的公网IP地址。例如,使用`ipify`或类似的API[^3]。 ```javascript import { getUserIP } from "./getIp"; let Ip = ""; if (!localStorage.getItem('ipInfo')) { function test(ip) { Ip = ip; localStorage.setItem('ipInfo', ip); } getUserIP(test); } ``` 上述代码片段展示了如何通过调用外部函数`getUserIP`来获取并存储IP地址。 #### 注意事项 1. **隐私与安全**:获取用户IP地址可能涉及隐私问题,需确保符合GDPR等法律法规的要求。 2. **浏览器兼容性**:不同浏览器对WebRTC的支持程度有所差异,建议测试目标环境的兼容性。 3. **内网与外网IP**:以上方法主要针对内网IP地址的获取,若需公网IP,则推荐使用第三方API。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值