Содержание
Javascript не может получить (и не хранить где-нибудь) IP-адрес клиента, однако javascript способен создавать запросы Http, а языки на стороне сервера могут извлекать общедоступный IP-адрес пользователя, поэтому вы можете использовать это как преимущество. Другими словами, если вы хотите получить публичный IP-адрес пользователя вы будете зависеть от запроса к любому серверу для получения IP. Тем не менее, с введением WebRTC, вы сможете получить частный IP пользователя с приколом, использующим RTCPeerConnection.
В этой статье вы узнаете, как легко получить IP-адрес пользователя (частный с использованием чистого JavaScript и общедоступный с использованием стороннего сервиса) с помощью нескольких приемов.
Использование webRTC (получить приватный IP)
Интерфейс RTCPeerConnection позволяет вам создать соединение WebRTC между вашим компьютером и удаленным узлом. Тем не менее, мы собираемся создать «прервала«Версия для того, чтобы получить IP-адрес клиента, используя только javascript.
Метод createOffer инициирует создание протокола описания сеанса (SDP), который предоставляет информацию о любых MediaStreamTracks, подключенных к сеансу WebRTC, сеансу, кодам и любым кандидатам, уже собранным агентами ICE (который содержит нашу цель, IP).
В более старых версиях этот метод использует обратные вызовы. Однако теперь возвращаем значение, основанное на Promise, которое возвращает информацию, которая нам нужна, когда она заполнена:
Замечания: реализация чистого javascript вернет клиенту частный IP, а не публичный.
/**
* Get the user IP throught the webkitRTCPeerConnection
* @param onNewIP {Function} listener function to expose the IP locally
* @return undefined
*/
function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs
//compatibility for firefox and chrome
var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
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 iterateIP(ip) {
if (!localIPs[ip]) onNewIP(ip);
localIPs[ip] = true;
}
//create a bogus data channel
pc.createDataChannel("");
// create offer and set local description
pc.createOffer().then(function(sdp) {
sdp.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') < 0) return;
line.match(ipRegex).forEach(iterateIP);
});
pc.setLocalDescription(sdp, noop, noop);
}).catch(function(reason) {
// An error occurred, so handle the failure to connect
});
//listen for candidate events
pc.onicecandidate = function(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
};
}
// Usage
getUserIP(function(ip){
alert("Got IP! :" + ip);
});
getUserIP
Метод ожидает в качестве первого параметра функцию, которая будет вызываться, когда IP-адрес клиента доступен. Обратные вызовы получают строку (ip) в качестве первого (и уникального) параметра. Вы можете увидеть предыдущий фрагмент в действии через JSFiddle:
Использование стороннего сервиса (получить публичный IP)
Если вам необходимо обеспечить поддержку кросс-браузера, вы не сможете использовать RTCPeerConnection для получения частного IP-адреса вашего клиента, поэтому единственный ресурс, который у вас есть, это зависеть от внешней службы (запроса к серверу, сторонней службы или вашего автореализованный сервис на вашем собственном сервере).
Небезопасные соединения HTTP
Чтобы получить IP-адрес пользователя с веб-сайта без SSL-сертификата, вы можете положиться на ipinfo.io. Этот сервис предлагает API для получения IP-адреса клиента с помощью простого вызова ajax:
$.getJSON('http://ipinfo.io', function(data){
console.log(data);
});
Полученный объект данных содержит информацию о локализации, такую как: страна, город и т. Д., Если они доступны. Серверы ipinfo используют DNS-маршрутизацию с задержкой для максимально быстрой обработки запроса. Узнайте больше об ipinfo на официальном сайте здесь.
Безопасные соединения HTTPS (рекомендуется)
Чтобы получить IP-адрес пользователя с веб-сайта даже на защищенных веб-сайтах с SSL, вы можете использовать сервис ipify, который предоставляет дружественный API-интерфейс для простого получения IP-адреса пользователя. Эта услуга не имеет ограничений по запросу.
Вы можете использовать его в своем проекте, запрашивая API (с параметром format, если вам нужно), и вы готовы к работе.
API URI | Тип ответа | Пример вывода (IPv4) | Пример вывода (IPv6) |
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://api.ipify.org?format=jsonp&callback=getip | jsonp | getip({"ip":"11.111.111.111"}); | ? |
Вы можете использовать его с JSONP:
function getIP(json) {
document.write("My public IP address is: ", json.ip);
}
Или получить объект с помощью запроса json, используя jQuery:
$.getJSON('https://api.ipify.org?format=json', function(data){
console.log(data.ip);
});
Кроме того, вы можете создать, если у вас есть собственный сервер, и вы можете работать на нем, создать свой собственный частный сервис, который возвращает IP-адрес пользователя с языком сервера, таким как PHP, ASP.NET и т. Д.
Повеселись !