Is posible Get Client IP Using WebRTC JS API and the ICE protocol (STUN for public IP)?
Asked
Active
Viewed 1.6k times
5
-
4You cannot get the IP of the machine in JS. Also note that it's not possible to get the IP of the machine on its local domain. It's only possible to use a server-side IP lookup and those will only go the the first external source of the client network, which is generally either the router or the ISP server. – Rory McCrossan May 11 '16 at 17:41
-
1you may, try just for instance, to load http://net.ipcalf.com/ and read: document.getElementById('list').textContent.substr(0,document.getElementById('list').textContent.indexOf(' ')), But no native js or jQuery function will solve your problem – gaetanoM May 11 '16 at 18:07
1 Answers
6
Yes you can, using WebRTC JS API and the ICE protocol (STUN for public IP).
More info here.
//get the IP addresses associated with an account
function getIPs(callback){
var ip_dups = {};
//compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
//bypass naive webrtc blocking using an iframe
if(!RTCPeerConnection){
//NOTE: you need to have an iframe in the page right above the script tag
//
//<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
//<script>...getIPs called in here...
//
var win = iframe.contentWindow;
RTCPeerConnection = win.RTCPeerConnection
|| win.mozRTCPeerConnection
|| win.webkitRTCPeerConnection;
useWebKit = !!win.webkitRTCPeerConnection;
}
//minimal requirements for data connection
var mediaConstraints = {
optional: [{RtpDataChannels: true}]
};
var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints);
function handleCandidate(candidate){
//match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
var ip_addr = ip_regex.exec(candidate)[1];
//remove duplicates
if(ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
}
//listen for candidate events
pc.onicecandidate = function(ice){
//skip non-candidate events
if(ice.candidate)
handleCandidate(ice.candidate.candidate);
};
//create a bogus data channel
pc.createDataChannel("");
//create an offer sdp
pc.createOffer(function(result){
//trigger the stun server request
pc.setLocalDescription(result, function(){}, function(){});
}, function(){});
//wait for a while to let everything done
setTimeout(function(){
//read candidate info from local description
var lines = pc.localDescription.sdp.split('\n');
lines.forEach(function(line){
if(line.indexOf('a=candidate:') === 0)
handleCandidate(line);
});
}, 1000);
}
//Test: Print the IP addresses into the console
getIPs(function(ip){console.log(ip);});

Antonin M.
- 1,744
- 1
- 18
- 29
-
This does not work in Safari browser gives error saying: `TypeError: undefined is not an object (evaluating 'win.RTCPeerConnection')`. – Ciasto piekarz Jan 21 '17 at 18:46
-
5
-
`ERROR TypeError: Cannot read property 'sdp' of null`, not work as should in chrome unfortunately – Igor Kurkov Mar 29 '21 at 20:47