Как получить локальный IP-адрес пользователя на Javascript

02.09.2018 / oberset

Javascript не позволяет напрямую получить локальный IP-адрес клиента в браузере, но для этого можно воспользоваться интерфейсом HTML5 RTCPeerConnection. На данный момент использовать RTCPeerConnection API для получения клиентского IP можно только в браузерах Chrome и Firefox. Для IE всех версий и Safari эта возможность недоступна.

Чтобы получить реальный IP клиентской машины, нужно создать в браузере WebRTC-соединение между локальным компьютером и "фиктивным" удаленным одноранговым узлом.

Вот пример кода на Javascript: const getUserIP = (onNewIP) => { const myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; const pc = new myPeerConnection({ iceServers: [] }); const noop = () => {}; const localIPs = {}; const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g; const iterateIP = (ip) => { if (!localIPs[ip]) onNewIP(ip); localIPs[ip] = true; }; let key; pc.createDataChannel(''); pc.createOffer().then(sdp => { sdp.sdp.split('\n').forEach(line => { if (line.indexOf('candidate') < 0) return; line.match(ipRegex).forEach(iterateIP); }); pc.setLocalDescription(sdp, noop, noop); }).catch(reason => { // Обработка ошибок }); pc.onicecandidate = ice => { if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; ice.candidate.candidate .match(ipRegex) .forEach(iterateIP); }; }; // Пытаемся получить IP getUserIP(ip => console.log(`Local IP: ${ip}`));

Не стоит забывать про готовые решения, аналогичный пример кода можно найти на GitHub: https://github.com/diafygi/webrtc-ips.

В Windows текущий IP-адрес можно посмотреть, набрав в консоли команду ipconfig. В Linux/MacOS подойдут команды ifconfig или hostname -I.

Если требуется кроссбраузерное решение, доступное для IE и Safari, то опубликованный выше код не подойдет, вместо этого придется запрашивать IP-адрес с сервера.

Вот пример получения IP с помощью запроса на сервер: $.getJSON('http://ipinfo.io', data => { console.log(data); });

Пример доступных серверов:

URL Формат ответа Данные ответа (IPv4)
https://api.ipify.org text 11.111.111.111
https://api.ipify.org?format=json json {"ip":"11.111.111.111"}
https://api.ipify.org?format=jsonp jsonp callback({"ip":"11.111.111.111"});
https://jsonip.com json {"ip":"11.111.111.111", ... }

Используя IP-адрес, возвращаемый сервером, нужно учитывать один важный момент: полученный адрес может отличаться от реального локального адреса машины пользователя. Например, если клиент для выхода в интернет использует прокси-сервер, вместо реального IP-адреса клиентской машины, нам может прийти IP-адрес этого прокси-сервера. Если несколько клиентов используют один общий прокси, то мы получим одинаковые IP-адреса для всех клиентов.

Примеры использования Array reduce в Javascript

Метод reduce(callback, initialValue) возвращает результат функции callback, которая применяется к каждому элементу массива.

Для чего нужна функция debounce и как она работает

Функция debounce возвращает обертку, которая откладывает вызов исходной функции на определенное время. Пример собственной реализации функции debounce.

Поиск одинаковых элементов в массиве на Javascript

Для решения задачи можно написать обход массива в цикле, но у объекта Array уже есть несколько удобных методов, которые нам помогут.

Комментарии (0)

Зарегистрируйтесь или авторизуйтесь, чтобы оставлять комментарии.