How to get local/internal IP with JavaScript

前端 未结 2 859
耶瑟儿~
耶瑟儿~ 2020-12-14 11:33

How can I get the local client IP using WebRTC.

I don\'t need the REMOTE_ADDR of the client but his local network IP. I\'ve seen this b

相关标签:
2条回答
  • 2020-12-14 11:47

    You can use this version on modern browser (with Promises and async / await)

    // minified onliner, 219b
    const ip = await new Promise((s,f,c=new RTCPeerConnection(),k='candidate')=>(c.createDataChannel(''),c.createOffer(o=>c.setLocalDescription(o),f),c.onicecandidate=i=>i&&i[k]&&i[k][k]&&c.close(s(i[k][k].split(' ')[4]))))
    
    // cleaned, 363b
    const ip = await new Promise((resolve, reject) => {
      const conn = new RTCPeerConnection()
      conn.createDataChannel('')
      conn.createOffer(offer => conn.setLocalDescription(offer), reject)
      conn.onicecandidate = ice => {
        if (ice && ice.candidate && ice.candidate.candidate) {
          resolve(i.candidate.candidate.split(' ')[4])
          conn.close()
        }
      }
    })
    
    0 讨论(0)
  • 2020-12-14 11:50

    where I took code from --> Source

    You can find a demo at --> Demo

    I have modified the source code, reduced the lines, not making any stun requests since you only want Local IP not the Public IP, the below code works in latest Firefox and Chrome:

        window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;   //compatibility for firefox and chrome
        var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};      
        pc.createDataChannel("");    //create a bogus data channel
        pc.createOffer(pc.setLocalDescription.bind(pc), noop);    // create offer and set local description
        pc.onicecandidate = function(ice){  //listen for candidate events
            if(!ice || !ice.candidate || !ice.candidate.candidate)  return;
            var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
            console.log('my IP: ', myIP);   
            pc.onicecandidate = noop;
        };
    

    what is happening here is, we are creating a dummy peer connection, and for the remote peer to contact us, we generally exchange ice candidates with each other. And reading the ice candiates we can tell the ip of the user.

    0 讨论(0)
提交回复
热议问题