para - obtener ip local javascript
¿Puede obtener una dirección IP de LAN local de usuarios a través de JavaScript? (5)
Además de la respuesta de Affourney, este código funciona en navegadores compatibles con WebRTC (Chrome y Firefox). Escuché que hay un movimiento en curso para implementar una característica que hace que los sitios soliciten la IP (como en el caso de la ubicación geográfica o los medios de usuario) aunque todavía no se ha implementado en ninguno de esos navegadores.
Aquí hay una versión modificada del código fuente , redujo las líneas, no realiza ninguna solicitud de aturdimiento, ya que solo desea la IP local y no la IP pública:
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)
{
if (ice && ice.candidate && ice.candidate.candidate)
{
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;
}
};
Estamos creando una conexión de pares ficticia para que el par remoto nos contacte. Generalmente intercambiamos candidatos de hielo entre sí y al leer los candidatos de hielo podemos decir la ip del usuario.
Puede encontrar una demostración en -> Demo
Sé que la reacción inicial a esta pregunta es "no" y "no se puede hacer" y "no deberías necesitarlo, estás haciendo algo mal". Lo que trato de hacer es obtener la dirección IP de la LAN de los usuarios y mostrarla en la página web. ¿Por qué? Porque de eso se trata la página en la que trabajo, mostrando tanta información como sea posible sobre usted, el visitante: http://www.whatsmyip.org/more-info-about-you/
Así que, en realidad, no estoy HACIENDO nada con la IP, aparte de mostrársela al usuario con fines informativos. Solía hacer esto usando un pequeño applet de Java. Funcionó bastante bien. Pero en estos días, el navegador te hace acordar y confiar tantas veces, para ejecutar incluso el applet Java más pequeño, que preferiría no ejecutar uno en absoluto.
Así que por un tiempo me deshice de esta característica, pero me gustaría volver si es posible. Era algo que yo, como consultor informático, usaría de vez en cuando. Es más rápido ir a este sitio web para ver en qué rango de IP se está ejecutando una red, que ir a Preferencias del Sistema, Redes y luego a cualquier interfaz que esté activa.
Así que me pregunto, con la esperanza, si hay alguna forma de hacerlo en javascript solo. Tal vez algún objeto nuevo al que pueda acceder, similar a la forma en que javascript puede preguntar al navegador dónde se encuentra la ubicación geográfica en la tierra. Tal vez hay algo similar para la información de red del cliente? Si no, ¿hay alguna otra forma completamente diferente de hacerlo? Las únicas formas en que puedo pensar son un applet de java o un objeto flash. Prefiero no hacer ninguno de esos.
Como resultado, la reciente extensión WebRTC de HTML5 permite a javascript consultar la dirección IP del cliente local. Una prueba de concepto está disponible aquí: http://net.ipcalf.com
Esta característica es aparentemente por diseño , y no es un error. Sin embargo, dada su naturaleza controvertida, sería cauteloso al confiar en este comportamiento. Sin embargo, creo que responde perfectamente y de manera adecuada a su propósito previsto (revelarle al usuario lo que está filtrando su navegador).
Limpié la publicación de mido y luego limpié la función que encontraron. Esto devolverá false
o una array
. Al realizar las pruebas, recuerde que debe colapsar la matriz en la consola del desarrollador web; de lo contrario, el comportamiento predeterminado no intuitivo puede engañarlo y hacerle pensar que devolverá una array
vacía.
function ip_local()
{
var ip = false;
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || false;
if (window.RTCPeerConnection)
{
ip = [];
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel('''');
pc.createOffer(pc.setLocalDescription.bind(pc), noop);
pc.onicecandidate = function(event)
{
if (event && event.candidate && event.candidate.candidate)
{
var s = event.candidate.candidate.split(''/n'');
ip.push(s[0].split('' '')[4]);
}
}
}
return ip;
}
Además, tenga en cuenta a la gente que esto no es algo antiguo como el border-radius
CSS border-radius
aunque es uno de esos bits que no es completamente compatible con IE11 y versiones anteriores. Utilice siempre la detección de objetos, pruebe en navegadores razonablemente más antiguos (p. Ej., Firefox 4, IE9, Opera 12.1) y asegúrese de que las secuencias de comandos más nuevas no estén rompiendo los bits de código más nuevos. Además, siempre detecte primero el código que cumple con los estándares, de modo que si hay algo con un prefijo CSS, por ejemplo, detecte primero el código no prefijado estándar y luego retroceda, ya que a largo plazo el soporte se estandarizará para el resto de su existencia.
Puede encontrar más información sobre qué limitaciones probablemente agregarán los navegadores para mitigar esto y qué está haciendo IETF al respecto, así como también por qué es necesario en IETF SPEC sobre el manejo de IP.
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);
};
}