Как получить локальный / внутренний IP с помощью JavaScript
Как я могу получить локальный IP-адрес клиента с помощью WebRTC.
Мне не нужно REMOTE_ADDR
клиента, но его локальной сети IP. Я видел это раньше на таких сайтах, как sharedrop.com
, он распознает компьютер в той же сети, используя WebRTC.
В PHP я делаю это, чтобы получить удаленный IP-адрес клиента:
<?php
echo $_SERVER["REMOTE_ADDR"]; // which would return 72.72.72.175
?>
Я просмотрел stackru, но на каждый вопрос отвечаю с помощью удаленного адреса.
Как я могу получить свой локальный IP (например, 192.168.1.24) с помощью JavaScript вместо удаленного адреса?
1 ответ
Откуда я взял код -> Source
Вы можете найти демо в -> Демо
Я изменил исходный код, сократил количество строк, не делая никаких оглушающих запросов, так как вам нужен только локальный IP, а не публичный IP, код ниже работает в последних версиях Firefox и 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;
};
то, что здесь происходит, мы создаем фиктивное одноранговое соединение, и для того, чтобы удаленный одноранговый узел связался с нами, мы обычно обмениваемся ледовыми кандидатами друг с другом. И читая ледяные леденцы, мы можем сказать ip пользователя.
Вы можете использовать эту версию в современном браузере (с Promises
а также 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()
}
}
})