Как получить IP-адрес клиента с помощью JavaScript? [закрыто]
Описание проблемы
Я пытаюсь получить IP-адрес клиента с помощью JavaScript, без использования серверного кода или SSI. Я понимаю, что это может быть немного сложной задачей из-за ограничений, связанных с безопасностью и конфиденциальностью.
Я не против использовать бесплатные скрипты или службы третьих сторон для этого. Однако я хотел бы получить информацию о том, как можно реализовать эту задачу с помощью доступных инструментов.
Не могли бы вы поделиться примерами или советами по поводу использования таких утилит? Кроме того, какие существуют риски или ограничения, с которыми я могу столкнуться при использовании сторонних решений для получения IP-адреса?
Заранее спасибо за помощь!
5 ответ(ов)
Вы не можете. Вам нужно обратиться к серверу.
Вы можете выполнить 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
.
Вы можете использовать мой сервис http://ipinfo.io для получения IP клиента, имени хоста, информации о геолокации и владельце сети. Вот простой пример, который выводит IP-адрес в консоль:
$.get("http://ipinfo.io", function(response) {
console.log(response.ip);
}, "jsonp");
Вот более подробный пример на JSFiddle, который также выводит всю информацию ответа, так что вы сможете увидеть все доступные данные: http://jsfiddle.net/zK5FN/2/
В вашем вопросе можно выделить два понимания. Большинство людей трактует "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>
Я бы сказал, что ответы Чада и Мальты отличные, но они довольно сложные. Поэтому я предлагаю следующий код, который я нашел в плагине для определения страны по 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, могут это сделать и также прекрасно работают без проблем.
Как перенаправить на другую веб-страницу?
Прокрутка к элементу с использованием jQuery
Как определить нажатие клавиши Esc?
Удалить ВСЕ пробелы из текста
Как получить данные формы с помощью JavaScript/jQuery?