Как получить локальный / внутренний 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()
    }
  }
})
Другие вопросы по тегам