通过js获取内网ip和外网ip的简单方法 ...

  今天遇到了一个需求,需要获取用户当前的内网ip, 找了半天终于找到了方法,遂将找到的方法记录下来,留给需要的人。也可以获取本地ip。

 

新:

最新的方法,可以查看这位老哥的库 webrtc-ip,好用的话记得给这个老哥点星

进不了github的可以看下面  Demo

// 引入生产版js或者开发版js
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/production.min.js"></script>
<!---- OR use the dev bundle: ----->
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js"></script>




<script>
// Using Promises:
getIPs().then(data=>{
  console.log(data.join('\n'))
})

// Using Async/Await:
(async function(){
  let data = await getIPs();
  console.log(data.join('\n'));
})();

</script>

 

 

  

1,获取内网ip (浏览器已经对这块做了加密,详见链接

function getIP(callback) {
        let recode = {};
        let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
        // 如果不存在则使用一个iframe绕过
        if (!RTCPeerConnection) {
            // 因为这里用到了iframe,所以在调用这个方法的script上必须有一个iframe标签
            // <iframe id="iframe" sandbox="allow-same-origin" style="display:none;"></iframe>
            let win = iframe.contentWindow;
            RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
        }

        //创建实例,生成连接
        let pc = new RTCPeerConnection();

        // 匹配字符串中符合ip地址的字段
        function handleCandidate(candidate) {
            let ip_regexp = /([0-9]{1,3}(\.[0-9]{1,3}){3}|([a-f0-9]{1,4}((:[a-f0-9]{1,4}){7}|:+[a-f0-9]{1,4}){6}))/;
            let ip_isMatch = candidate.match(ip_regexp)[1];
            if (!recode[ip_isMatch]) {
                callback(ip_isMatch);
                recode[ip_isMatch] = true;
            }
        }

        //监听icecandidate事件
        pc.onicecandidate = (ice) => {
            if (ice.candidate) {
                handleCandidate(ice.candidate.candidate);
            }
        };
        //建立一个伪数据的通道
        pc.createDataChannel('');
        pc.createOffer((res) => {
            pc.setLocalDescription(res);
        }, () => {});

        //延迟,让一切都能完成
        setTimeout(() => {
            let lines = pc.localDescription.sdp.split('\n');
            lines.forEach(item => {
                if (item.indexOf('a=candidate:') === 0) {
                    handleCandidate(item);
                }
            })
        }, 1000);
    }

 

调用该函数:

getIP( function (ip) {
    console.log(ip);
})

// 192.168.1.191
// 2001::2841:aa90:2843:1983:e4d1:a9b8

上面的是ipv4的,下面的是ipv6.

 

2,获取公网ip

  

引入接口文件
<script type="text/javascript" src="http://pv.sohu.com/cityjson?ie=utf-8"></script> 

// 返回结果为  var returnCitySN = {"cip": "27.46.86.71", "cid": "440000", "cname": "广东省"};

在下面的js中,通过调用returnCitySN.cip就可以获取 外网的ip

 

  

 

posted @ 2019-04-01 20:07  ken丶123  阅读(20611)  评论(11编辑  收藏  举报