5

Как получить IP-адрес клиента с помощью JavaScript? [закрыто]

15

Описание проблемы

Я пытаюсь получить IP-адрес клиента с помощью JavaScript, без использования серверного кода или SSI. Я понимаю, что это может быть немного сложной задачей из-за ограничений, связанных с безопасностью и конфиденциальностью.

Я не против использовать бесплатные скрипты или службы третьих сторон для этого. Однако я хотел бы получить информацию о том, как можно реализовать эту задачу с помощью доступных инструментов.

Не могли бы вы поделиться примерами или советами по поводу использования таких утилит? Кроме того, какие существуют риски или ограничения, с которыми я могу столкнуться при использовании сторонних решений для получения IP-адреса?

Заранее спасибо за помощь!

5 ответ(ов)

1

Вы не можете. Вам нужно обратиться к серверу.

0

Вы можете выполнить AJAX-запрос к сервису hostip.info или аналогичному сервису, чтобы получить свой IP-адрес. Вот пример кода на JavaScript:

function myIP() {
    let xmlhttp;

    // Проверяем наличие XMLHttpRequest
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    // Выполняем GET-запрос к API
    xmlhttp.open("GET", "http://api.hostip.info/get_html.php", false);
    xmlhttp.send();

    // Разбиваем ответ на строки
    let hostipInfo = xmlhttp.responseText.split("\n");

    // Ищем IP-адрес в ответе
    for (let i = 0; i < hostipInfo.length; i++) {
        let ipAddress = hostipInfo[i].split(":");
        if (ipAddress[0] === "IP") {
            return ipAddress[1].trim(); // Возвращаем IP-адрес
        }
    }

    return false; // Если IP не найден, возвращаем false
}

В качестве бонуса, информация о геолокации также возвращается в том же вызове. Также обратите внимание, что использование синхронных запросов (параметр false при вызове open) может изменить поведение вашего приложения, поэтому для современных приложений рекомендуется использовать асинхронные запросы с XMLHttpRequest или fetch.

0

Вы можете использовать мой сервис http://ipinfo.io для получения IP клиента, имени хоста, информации о геолокации и владельце сети. Вот простой пример, который выводит IP-адрес в консоль:

$.get("http://ipinfo.io", function(response) {
    console.log(response.ip);
}, "jsonp");

Вот более подробный пример на JSFiddle, который также выводит всю информацию ответа, так что вы сможете увидеть все доступные данные: http://jsfiddle.net/zK5FN/2/

0

В вашем вопросе можно выделить два понимания. Большинство людей трактует "IP-адрес клиента" как публичный IP-адрес, который видят веб-серверы за пределами локальной сети и в интернете. Однако это не всегда IP-адрес компьютера клиента.

Мне нужен был реальный IP-адрес компьютера, на котором работает браузер, запускающий моё JavaScript-приложение (который почти всегда является локальным IP-адресом в локальной сети, находящейся за NAT).

Mido опубликовал ФАНТАСТИЧЕСКИЙ ответ выше, который, кажется, является единственным, действительно предоставляющим IP-адрес клиента.

Спасибо за это, Mido!

Тем не менее, функции, представленные в ответе, работают асинхронно. Мне необходимо было фактически ИСПОЛЬЗОВАТЬ IP-адрес в моем коде, и с асинхронным решением я мог бы попытаться использовать IP-адрес до того, как он будет получен/узнан/сохранен. Я должен был дождаться результатов, прежде чем их использовать.

Вот "ждемая" версия функции от Mido. Надеюсь, она поможет кому-то ещё:

function findIP(onNewIP) { // onNewIp - ваша функция-обработчик для новых IP
    var promise = new Promise(function (resolve, reject) {
        try {
            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; // совместимость с Firefox и Chrome
            var pc = new myPeerConnection({ iceServers: [] }),
                noop = function () { },
                localIPs = {},
                ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
                key;
            function ipIterate(ip) {
                if (!localIPs[ip]) onNewIP(ip);
                localIPs[ip] = true;
            }
            pc.createDataChannel(""); // создаем фиктивный дата-канал
            pc.createOffer(function (sdp) {
                sdp.sdp.split('\n').forEach(function (line) {
                    if (line.indexOf('candidate') < 0) return;
                    line.match(ipRegex).forEach(ipIterate);
                });
                pc.setLocalDescription(sdp, noop, noop);
            }, noop); // создаем предложение и устанавливаем локальное описание

            pc.onicecandidate = function (ice) { // слушаем события кандидатов
                if (ice && ice.candidate && ice.candidate.candidate && ice.candidate.candidate.match(ipRegex)) {
                    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
                }
                resolve("FindIPsDone");
                return;
            };
        }
        catch (ex) {
            reject(Error(ex));
        }
    }); // Новый Promise(...{ ... });
    return promise;
};

// Это коллбек, который вызывается для каждого найденного IP-адреса
function foundNewIP(ip) {
    if (typeof window.ipAddress === 'undefined') {
        window.ipAddress = ip;
    } else {
        window.ipAddress += " - " + ip;
    }
}

// Вот как использовать ждущую функцию findIP и реагировать на результаты
var ipWaitObject = findIP(foundNewIP);        // Находит IP(адреса) и сохраняет в window.ipAddress
ipWaitObject.then(
    function (result) {
        alert ("IP(адреса) найдены. Результат: '" + result + "'. Теперь вы можете их использовать: " + window.ipAddress);
    },
    function (err) {
        alert ("IP(адреса) НЕ найдены. ОШИБКА! " + err);
    }
);
<h1>Демо "Ждущий" способ получения IP-адреса клиента с использованием WebRTC</h1>
0

Я бы сказал, что ответы Чада и Мальты отличные, но они довольно сложные. Поэтому я предлагаю следующий код, который я нашел в плагине для определения страны по IP:

<script>
<script language="javascript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="javascript">
mmjsCountryCode = geoip_country_code();
mmjsCountryName = geoip_country_name();

</script>

Без AJAX. Простой JavaScript. 😄

Если вы перейдете по адресу http://j.maxmind.com/app/geoip.js, вы увидите, что он содержит следующие функции:

function geoip_country_code() { return 'ID'; }
function geoip_country_name() { return 'Индонезия'; }
function geoip_city()         { return 'Джакарта'; }
function geoip_region()       { return '04'; }
function geoip_region_name()  { return 'Джакарта Рая'; }
function geoip_latitude()     { return '-6.1744'; }
function geoip_longitude()    { return '106.8294'; }
function geoip_postal_code()  { return ''; }
function geoip_area_code()    { return ''; }
function geoip_metro_code()   { return ''; }

Тем не менее, этот код еще не совсем отвечает на ваш вопрос, потому что http://j.maxmind.com/app/geoip.js не содержит IP (хотя я уверен, что он использует IP для определения страны).

Но создать PHP-скрипт, который бы возвращал что-то подобное:

function visitorsIP()   { return '123.123.123.123'; }

– очень легко. Поместите это на http://yourdomain.com/yourip.php.

Затем выполните:

<script language="javascript" src="http://yourdomain.com/yourip.php"></script>

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь