-
-
Save hectorguo/672844c319547498dcb569df583f959d to your computer and use it in GitHub Desktop.
/** | |
* Get Local IP Address | |
* | |
* @returns Promise Object | |
* | |
* getLocalIP().then((ipAddr) => { | |
* console.log(ipAddr); // 192.168.0.122 | |
* }); | |
*/ | |
function getLocalIP() { | |
return new Promise(function(resolve, reject) { | |
// NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23 | |
var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection; | |
if (!RTCPeerConnection) { | |
reject('Your browser does not support this API'); | |
} | |
var rtc = new RTCPeerConnection({iceServers:[]}); | |
var addrs = {}; | |
addrs["0.0.0.0"] = false; | |
function grepSDP(sdp) { | |
var hosts = []; | |
var finalIP = ''; | |
sdp.split('\r\n').forEach(function (line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39 | |
if (~line.indexOf("a=candidate")) { // http://tools.ietf.org/html/rfc4566#section-5.13 | |
var parts = line.split(' '), // http://tools.ietf.org/html/rfc5245#section-15.1 | |
addr = parts[4], | |
type = parts[7]; | |
if (type === 'host') { | |
finalIP = addr; | |
} | |
} else if (~line.indexOf("c=")) { // http://tools.ietf.org/html/rfc4566#section-5.7 | |
var parts = line.split(' '), | |
addr = parts[2]; | |
finalIP = addr; | |
} | |
}); | |
return finalIP; | |
} | |
if (1 || window.mozRTCPeerConnection) { // FF [and now Chrome!] needs a channel/stream to proceed | |
rtc.createDataChannel('', {reliable:false}); | |
}; | |
rtc.onicecandidate = function (evt) { | |
// convert the candidate to SDP so we can run it through our general parser | |
// see https://twitter.com/lancestout/status/525796175425720320 for details | |
if (evt.candidate) { | |
var addr = grepSDP("a="+evt.candidate.candidate); | |
resolve(addr); | |
} | |
}; | |
rtc.createOffer(function (offerDesc) { | |
rtc.setLocalDescription(offerDesc); | |
}, function (e) { console.warn("offer failed", e); }); | |
}); | |
} |
In Chrome it is necessary to disable webrtc.
chrome://flags/#enable-webrtc-hide-local-ips-with-mdns
I haven't tested it on other browser.
On the latest version of Chrome version 86 cannot find this chrome://flags/#enable-webrtc-hide-local-ips-with-mdns. Any alternative solution?
I am getting ipv6 address. Not ipv4. How can I get ipv4 address?
@krisnadwia can you please share you are code. im not getting result like you.
@krisnadwia can you please share you are code. im not getting result like you.
Hi @indhunathan, I will explain it.
First of all, you have to turn off/disable webrtc in Chrome. Copy this link and paste it in your Chrome address -> "chrome://flags/#enable-webrtc-hide-local-ips-with-mdns", then select "disabled".
Then, you just need to follow the code above and give it a try. I tried it in inspect.
It can also be implemented into a project like this.
I hope you understand with my explanation.
If you are on the same network as the client that you got the ip from, then you can just ping the .local mDNS ip like this:
ping 417c6933-6ff6-440f-aade-e84867884de2.local
Result:
Pinging 417c6933-6ff6-440f-aade-e84867884de2.local [192.168.1.71] with 32 bytes of data:
Reply from 192.168.1.71: bytes=32 time<1ms TTL=128
Reply from 192.168.1.71: bytes=32 time<1ms TTL=128
Reply from 192.168.1.71: bytes=32 time<1ms TTL=128
And in python you can just do this:
import socket
socket.gethostbyname("417c6933-6ff6-440f-aade-e84867884de2.local") # Returns: 192.168.1.71
Did anyone found an alternative workaround to fetch client ip.?