¿Cómo obtener la dirección IP del cliente usando JavaScript?

Necesito de alguna manera recuperar la dirección IP del cliente usando JavaScript; ningún código del lado del servidor, ni siquiera SSI.

Sin embargo, no estoy en contra de usar un script / servicio gratuito de terceros.

Usaría un servicio web que puede devolver JSON (junto con jQuery para simplificar las cosas). A continuación se muestran todos los servicios gratuitos de búsqueda de IP activa que pude encontrar y la información que devuelven. Si sabes más, entonces agrega un comentario y actualizaré esta respuesta.


DB-IP

Pruébelo: http://api.db-ip.com/addrinfo?api_key= < su clave api > & addr = < dirección IP >

Devoluciones:

{ "address": "116.12.250.1", "country": "SG", "stateprov": "Central Singapore", "city": "Singapore" } 

Limitaciones

  • 2,500 solicitudes por día
  • No es compatible con las devoluciones de llamada JSONP
  • Requiere un parámetro de dirección IP
  • Requiere una dirección de correo electrónico para obtener su clave de API
  • Sin SSL (https) con el plan gratuito

Geobytes

Pruébalo: http://gd.geobytes.com/GetCityDetails

 $.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "geobytesforwarderfor": "", "geobytesremoteip": "116.12.250.1", "geobytesipaddress": "116.12.250.1", "geobytescertainty": "99", "geobytesinternet": "SA", "geobytescountry": "Saudi Arabia", "geobytesregionlocationcode": "SASH", "geobytesregion": "Ash Sharqiyah", "geobytescode": "SH", "geobyteslocationcode": "SASHJUBA", "geobytescity": "Jubail", "geobytescityid": "13793", "geobytesfqcn": "Jubail, SH, Saudi Arabia", "geobyteslatitude": "27.004999", "geobyteslongitude": "49.660999", "geobytescapital": "Riyadh ", "geobytestimezone": "+03:00", "geobytesnationalitysingular": "Saudi Arabian ", "geobytespopulation": "22757092", "geobytesnationalityplural": "Saudis", "geobytesmapreference": "Middle East ", "geobytescurrency": "Saudi Riyal", "geobytescurrencycode": "SAR", "geobytestitle": "Saudi Arabia" } 

Limitaciones

  • 16,384 solicitudes por hora
  • Sin SSL (https) con el plan gratuito
  • Puede devolver la ubicación incorrecta (estoy en Singapur, no en Arabia Saudita)

GeoIPLookup.io

Pruébalo: https://json.geoiplookup.io/api

 $.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "isp": "SGPOST", "org": "Singapore Post Ltd", "hostname": "116.12.250.1", "longitude": "103.807", "latitude": "1.29209", "postal_code": "", "city": "Singapore", "country_code": "SG", "country_name": "Singapore", "continent_code": "AS", "region": "Central Singapore", "district": "", "timezone_name": "Asia\/Singapore", "connection_type": "", "asn": "AS3758 SingNet", "currency_code": "SGD", "currency_name": "Singapore Dollar", "success": true } 

Limitaciones

  • Desconocido

geoPlugin

Pruébalo: http://www.geoplugin.net/json.gp

 $.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "geoplugin_request": "116.12.250.1", "geoplugin_status": 200, "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from http://www.maxmind.com.", "geoplugin_city": "Singapore", "geoplugin_region": "Singapore (general)", "geoplugin_areaCode": "0", "geoplugin_dmaCode": "0", "geoplugin_countryCode": "SG", "geoplugin_countryName": "Singapore", "geoplugin_continentCode": "AS", "geoplugin_latitude": "1.2931", "geoplugin_longitude": "103.855797", "geoplugin_regionCode": "00", "geoplugin_regionName": "Singapore (general)", "geoplugin_currencyCode": "SGD", "geoplugin_currencySymbol": "$", "geoplugin_currencySymbol_UTF8": "$", "geoplugin_currencyConverter": 1.4239 } 

Limitaciones

  • 120 solicitudes por minuto
  • Sin SSL (https) con el plan gratuito

Hacker Target

Pruébalo: https://api.hackertarget.com/geoip/?q= < dirección IP >

Devoluciones:

 IP Address: 116.12.250.1 Country: SG State: N/A City: Singapore Latitude: 1.293100 Longitude: 103.855797 

Limitaciones

  • 50 solicitudes por día
  • No es compatible con las devoluciones de llamada JSONP
  • Requiere un parámetro de dirección IP
  • Devuelve texto sin formato

ipapi.co

Pruébalo: https://ipapi.co/json/

 $.getJSON('https://ipapi.co/json/', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "city": "Singapore", "region": "Central Singapore Community Development Council", "country": "SG", "country_name": "Singapore", "postal": null, "latitude": 1.2855, "longitude": 103.8565, "timezone": "Asia/Singapore" } 

Limitaciones

  • 1,000 solicitudes por día
  • Requiere SSL (https)

IP-API.com

Pruébalo: http://ip-api.com/json

 $.getJSON('http://ip-api.com/json?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "as": "AS3758 SingNet", "city": "Singapore", "country": "Singapore", "countryCode": "SG", "isp": "SingNet Pte Ltd", "lat": 1.2931, "lon": 103.8558, "org": "Singapore Telecommunications", "query": "116.12.250.1", "region": "01", "regionName": "Central Singapore Community Development Council", "status": "success", "timezone": "Asia/Singapore", "zip": "" } 

Limitaciones

  • 150 solicitudes por minuto
  • Sin SSL (https) con el plan gratuito

Ipdata.co

Pruébalo: https://api.ipdata.co

 $.getJSON('https://api.ipdata.co', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "city": "Singapore", "region": "Central Singapore Community Development Council", "region_code": "01", "country_name": "Singapore", "country_code": "SG", "continent_name": "Asia", "continent_code": "AS", "latitude": 1.2931, "longitude": 103.8558, "asn": "AS3758", "organisation": "SingNet", "postal": "", "calling_code": "65", "flag": "http://sofes.miximages.com/javascript/sg.png", "emoji_flag": "\ud83c\uddf8\ud83c\uddec", "emoji_unicode": "U+1F1F8 U+1F1EC", "is_eu": false, "languages": [ { "name": "English", "native": "English" }, { "name": "Malay", "native": "Bahasa Melayu" }, { "name": "Tamil", "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd" }, { "name": "Chinese", "native": "\u4e2d\u6587" } ], "currency": { "name": "Singapore Dollar", "code": "SGD", "symbol": "S$", "native": "$", "plural": "Singapore dollars" }, "time_zone": { "name": "Asia/Singapore", "abbr": "+08", "offset": "+0800", "is_dst": false, "current_time": "2018-05-09T12:28:49.183674+08:00" }, "threat": { "is_tor": false, "is_proxy": false, "is_anonymous": false, "is_known_attacker": false, "is_known_abuser": false, "is_threat": false, "is_bogon": false } } 

Limitaciones

  • 1,500 solicitudes por día
  • Requiere SSL (https)

IP Encuentra

Pruébalo: https://ipfind.co/me?auth= < tu clave de API >

 $.getJSON('https://ipfind.co/me?auth=', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip_address": "116.12.250.1", "country": "Singapore", "country_code": "SG", "continent": "Asia", "continent_code": "AS", "city": "Singapore", "county": null, "region": "Central Singapore", "region_code": "01", "timezone": "Asia/Singapore", "owner": null, "longitude": 103.8565, "latitude": 1.2855, "currency": "SGD", "languages": [ "cmn", "en-SG", "ms-SG", "ta-SG", "zh-SG" ] } 

Limitaciones

  • 300 solicitudes por día
  • Requiere registro para obtener su clave API

ipgeolocation

Pruébalo: https://api.ipgeolocation.io/ipgeo?apiKey= < tu clave de API >

 $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "continent_code": "AS", "continent_name": "Asia", "country_code2": "SG", "country_code3": "SGP", "country_name": "Singapore", "country_capital": "Singapore", "state_prov": "Central Singapore", "district": "", "city": "Singapore", "zipcode": "", "latitude": "1.29209", "longitude": "103.807", "is_eu": false, "calling_code": "+65", "country_tld": ".sg", "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG", "country_flag": "http://sofes.miximages.com/javascript/sg_64.png", "isp": "SGPOST", "connection_type": "", "organization": "Singapore Post Ltd", "geoname_id": "1880252", "currency": { "name": "Dollar", "code": "SGD" }, "time_zone": { "name": "Asia/Singapore", "offset": 8, "is_dst": false, "current_time": "2018-06-12 09:06:49.028+0800" } } 

Limitaciones

  • 50,000 solicitudes por mes
  • Requiere registro para obtener su clave API

ipify

Pruébalo: https://api.ipify.org/?format=json

 $.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1" } 

Limitaciones

  • Ninguna

IPInfoDB

Pruébalo: https://api.ipinfodb.com/v3/ip-city/?key= < tu clave de API > & format = json

 $.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=&format=json&callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "statusCode": "OK", "statusMessage": "", "ipAddress": "116.12.250.1", "countryCode": "SG", "countryName": "Singapore", "regionName": "Singapore", "cityName": "Singapore", "zipCode": "048941", "latitude": "1.28967", "longitude": "103.85", "timeZone": "+08:00" } 

Limitaciones

  • Dos solicitudes por segundo
  • Requiere registro para obtener su clave API

ipinfo.io

Pruébalo: https://ipinfo.io/json

 $.getJSON('https://ipinfo.io/json', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "hostname": "No Hostname", "city": "Singapore", "region": "Central Singapore Community Development Council", "country": "SG", "loc": "1.2931,103.8558", "org": "AS3758 SingNet" } 

Limitaciones

  • 1,000 solicitudes por día

ipstack (anteriormente freegeoip.net)

Pruébalo: http://api.ipstack.com/ < dirección IP >? Access_key =

 $.getJSON('http://api.ipstack.com/?access_key=', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "type": "ipv4", "continent_code": "AS", "continent_name": "Asia", "country_code": "SG", "country_name": "Singapore", "region_code": "01", "region_name": "Central Singapore Community Development Council", "city": "Singapore", "zip": null, "latitude": 1.2931, "longitude": 103.8558, "location": { "geoname_id": 1880252, "capital": "Singapore", "languages": [{ "code": "en", "name": "English", "native": "English" }, { "code": "ms", "name": "Malay", "native": "Bahasa Melayu" }, { "code": "ta", "name": "Tamil", "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd" }, { "code": "zh", "name": "Chinese", "native": "\u4e2d\u6587" }], "country_flag": "http:\/\/assets.ipstack.com\/flags\/sg.svg", "country_flag_emoji": "\ud83c\uddf8\ud83c\uddec", "country_flag_emoji_unicode": "U+1F1F8 U+1F1EC", "calling_code": "65", "is_eu": false } } 

Limitaciones

  • 10,000 solicitudes por mes
  • Requiere un parámetro de dirección IP
  • Requiere registro para obtener su clave API
  • Sin SSL (https) con el plan gratuito

jsonip.com

Pruébalo: https://jsonip.com

 $.getJSON('https://jsonip.com/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1", "about": "/about", "Pro!": "http://getjsonip.com", "reject-fascism": "Liberal America will prevail" } 

Limitaciones

  • La respuesta incluye ventas adicionales y política

Prueba JSON

Pruébalo: http://ip.jsontest.com/

 $.getJSON('http://ip.jsontest.com/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "ip": "116.12.250.1" } 

Limitaciones

  • Sin SSL (https)
  • Baja mucho (por encima de la cuota), así que no lo usaría para producción
  • Devuelve la dirección IPv6 si tiene una, que puede no ser la que desea

Nekudo

Pruébalo: https://geoip.nekudo.com/api

 $.getJSON('https://geoip.nekudo.com/api', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "city": "Singapore", "country": { "name": "Singapore", "code": "SG" }, "location": { "accuracy_radius": 50, "latitude": 1.2855, "longitude": 103.8565, "time_zone": "Asia/Singapore" }, "ip": "116.12.250.1" } 

Limitaciones

  • Bloqueado por bloqueadores de anuncios usando la lista EasyPrivacy

Estúpidas herramientas web

Pruébalo: http://www.stupidwebtools.com/api/my_ip.json

 $.getJSON('http://www.stupidwebtools.com/api/my_ip.json', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

Devoluciones:

 { "my_ip": { "ip": "116.12.250.1", "others": [] } } 

Limitaciones

  • Sin SSL (https)

Tenga en cuenta que dado que estos son todos los servicios gratuitos, su millaje puede variar en términos de exceder la cuota y el tiempo de actividad, y quién sabe cuándo / si se desconectarán en el camino (exhibit A: Telize ). La mayoría de estos servicios también ofrecen un nivel pago en caso de que desee más funciones, como compatibilidad con SSL.

Además, como señaló skobaljic en los comentarios a continuación, las cuotas de solicitud son en su mayoría académicas ya que esto está sucediendo en el lado del cliente y la mayoría de los usuarios finales nunca superarán la cuota.

ACTUALIZACIONES

  • 01/01/2016: Se retiró Telize (ya no ofrece plan gratis)
  • 18/04/2016: se eliminó freegeoip.net (fuera de servicio)
  • 26/04/2016: DB-IP agregado
  • 26/04/2016: Hacker Target añadido
  • 06/07/2016: Reinstaurado freegeoip.net
  • 06/07/2016: eliminado ip-json.rhcloud.com (vínculo inactivo )
  • 21/12/2016: Destino de hacker eliminado (fuera de servicio)
  • 10/02/2017: Nekudo añadido
  • 20/04/2017: Añadido ipapi.co (gracias Ahmad Awais)
  • 24/04/2017: Hacker Target reestablecido
  • 24/04/2017: Snoopi.io eliminado (fuera de servicio)
  • 16/07/2017: Añadido IP Find (gracias JordanC)
  • 16/07/2017: Limitación actualizada de planes gratuitos que no son compatibles con SSL
  • 25/9/2017: Añadido Stupid Web Tools (gracias a Cœur)
  • 16/03/2018: Se agregó Ipdata.co (gracias a Jonathan)
  • 14/04/2018: renombró freegeoip.net a ipstack (gracias MA-Maddin)
  • 16/04/2018: Se agregó GeoIPLookup.io (gracias Rob Waa)
  • 11/06/2018: ipgeolocation añadido (gracias Ejaz Ahmed)

Actualización : siempre quise hacer una versión min / uglificada del código, así que aquí hay un código Promesa ES6:

 var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}}) /*Usage example*/ findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e)) 

Puedes, transmitirlo a través del lado del servidor con JSONP

Y al buscar en Google para encontrar uno, lo encontré aquí en SO ¿Puedo realizar una búsqueda de DNS (nombre de host a la dirección IP) usando el Javascript del lado del cliente?

   

Nota: La API de telize.com se ha cerrado permanentemente desde el 15 de noviembre de 2015 .

La mayoría de las respuestas aquí “solucionan” la necesidad de un código de servidor al … Golpear el servidor de otra persona. Lo cual es una técnica totalmente válida, a menos que realmente necesite obtener la dirección IP sin tocar un servidor.

Tradicionalmente esto no era posible sin algún tipo de complemento (e incluso entonces, probablemente obtendría una dirección IP incorrecta si estaba detrás de un enrutador NAT), pero con la llegada de WebRTC, en realidad es posible hacerlo … . Si está orientando navegadores compatibles con WebRTC (actualmente: Firefox, Chrome y Opera).

Lea la respuesta de mido para obtener detalles sobre cómo puede recuperar direcciones IP de cliente útiles utilizando WebRTC.

Puede hacer una llamada ajax a hostip.info o un servicio similar …

 function myIP() { if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("GET","http://api.hostip.info/get_html.php",false); xmlhttp.send(); hostipInfo = xmlhttp.responseText.split("\n"); for (i=0; hostipInfo.length >= i; i++) { ipAddress = hostipInfo[i].split(":"); if ( ipAddress[0] == "IP" ) return ipAddress[1]; } return false; } 

Como extra, la información de geolocalización se devuelve en la misma llamada.

Prueba esto

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

O

 $(document).ready(function () { $.getJSON("http://jsonip.com/?callback=?", function (data) { console.log(data); alert(data.ip); }); }); 

Violín

No busque más

Consulte http://www.ipify.org/

Según ellos:

  • Puede usarlo sin límite (incluso si está haciendo millones de solicitudes por minuto).
  • ipify es completamente de código abierto (echa un vistazo al repository de GitHub ).

Aquí hay un ejemplo de JS en funcionamiento (en lugar de preguntarse por qué esta respuesta tiene tan pocos votos, pruébelo usted mismo para verla en acción):

   

Demasiado perezoso para copiar / pegar? Me gusta. Aquí hay un 💻 demo

Demasiado perezoso para hacer clic? :O

Nota : Desactive Adblock Plus / uBlock & co antes de ejecutar la demostración. De lo contrario, simplemente no funcionará.

No tengo nada que ver con el equipo de IPify. Simplemente creo que es ridículamente genial que alguien brinde ese servicio por el bien general.

No puedes. Tendría que preguntarle a un servidor.

Puede utilizar mi servicio http://ipinfo.io para esto, que le proporcionará la IP del cliente, el nombre de host, la información de geolocalización y el propietario de la red. Aquí hay un ejemplo simple que registra la IP:

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

Aquí hay un ejemplo más detallado de JSFiddle que también imprime la información de respuesta completa, para que pueda ver todos los detalles disponibles: http://jsfiddle.net/zK5FN/2/

Incluya este código en su página:

más doc aquí

Yo diría que Chad y Malta tienen una gran respuesta. Sin embargo, el suyo es complicado. Así que sugiero este código que encontré en el plugin de anuncios por país

   

No ajax. Simplemente javascripts. :RE

Si vas a http://j.maxmind.com/app/geoip.js , verás que contiene

 function geoip_country_code() { return 'ID'; } function geoip_country_name() { return 'Indonesia'; } function geoip_city() { return 'Jakarta'; } function geoip_region() { return '04'; } function geoip_region_name() { return 'Jakarta Raya'; } 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 ''; } 

Realmente no responde la pregunta todavía porque

http://j.maxmind.com/app/geoip.js no contiene el IP (aunque apuesto a que usa el IP para obtener el país).

Pero es tan fácil hacer un script PhP que parezca algo así como

 function visitorsIP() { return '123.123.123.123'; } 

Haz eso. Ponga http://yourdomain.com/yourip.php .

Entonces hazlo

  

La pregunta menciona específicamente NO usar script de terceros. No hay otra manera. Javascript no puede conocer su IP. Pero otros servidores a los que se puede acceder a través de javascript pueden funcionar igual de bien sin problemas.

Con el uso de la API Geo-IP de Smart-IP.net. Por ejemplo, al usar jQuery:

 $(document).ready( function() { $.getJSON( "http://smart-ip.net/geoip-json?callback=?", function(data){ alert( data.host); } ); }); 

Hay dos interpretaciones para esta pregunta. La mayoría de la gente interpretaba que “IP del cliente” significa la dirección IP pública que el servidor web ve fuera de la LAN y fuera de Internet. Esta no es la dirección IP de la computadora cliente en la mayoría de los casos, aunque

Necesitaba la dirección IP real de la computadora que ejecuta el navegador que aloja mi software JavaScript (que casi siempre es una dirección IP local en una LAN que está detrás de algo que la capa NAT).

Mido publicó una respuesta FANTÁSTICA, arriba, que parece ser la única respuesta que realmente proporcionó la dirección IP del cliente.

Gracias por eso, Mido!

Sin embargo, la función presentada se ejecuta de forma asíncrona. Necesito usar realmente la dirección IP en mi código, y con una solución asíncrona, podría intentar usar la dirección IP antes de que sea recuperada / aprendida / almacenada. Tenía que poder esperar a que llegaran los resultados antes de usarlos.

Aquí hay una versión “Waitable” de la función de Mido. Espero que ayude a alguien más:

 function findIP(onNewIP) { // onNewIp - your listener function for new IPs var promise = new Promise(function (resolve, reject) { try { var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and 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(""); //create a bogus data channel 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); // create offer and set local description pc.onicecandidate = function (ice) { //listen for candidate events 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)); } });// New Promise(...{ ... }); return promise; }; //This is the callback that gets run for each IP address found function foundNewIP(ip) { if (typeof window.ipAddress === 'undefined') { window.ipAddress = ip; } else { window.ipAddress += " - " + ip; } } //This is How to use the Waitable findIP function, and react to the //results arriving var ipWaitObject = findIP(foundNewIP); // Puts found IP(s) in window.ipAddress ipWaitObject.then( function (result) { alert ("IP(s) Found. Result: '" + result + "'. You can use them now: " + window.ipAddress) }, function (err) { alert ("IP(s) NOT Found. FAILED! " + err) } ); 
 

Demo "Waitable" Client IP Retrieval using WebRTC

Hay un enfoque más fácil y gratuito que no pedirá permiso a su visitante.

Consiste en enviar una solicitud AJAX POST muy simple a http://freegeoip.net/json . Una vez que recibe la información de su ubicación, en JSON, reactjs en consecuencia actualizando la página o redirigiendo a una nueva.

A continuación, le mostramos cómo envía su solicitud de información de ubicación:

 jQuery.ajax( { url: '//freegeoip.net/json/', type: 'POST', dataType: 'jsonp', success: function(location) { console.log(location) } } ); 

Bueno, me estoy desviando de la pregunta, pero tenía una necesidad similar hoy y aunque no pude encontrar la identificación del cliente usando Javascript, hice lo siguiente.

En el lado del servidor: –

  

Usando Javascript

 var ip = $get("uip").innerHTML; 

Estoy usando ASP.Net Ajax, pero puedes usar getElementById en lugar de $ get ().

What’s happening is, I’ve got a hidden div element on the page with the user’s IP rendered from the server. Than in Javascript I just load that value.

This might be helpful to some people with a similar requirement like yours (like me while I hadn’t figure this out).

¡Aclamaciones!

Not possible in general unless you use some kind of external service.

Get your IP with jQuery

you can get your public IP address with one line of JS? There is a free service that offers this for you and a get request is all that you need to do:

  $.get('http://jsonip.com/', function(r){ console.log(r.ip); }); 

For the above snippet to work, your browser will have to support CORS (cross-origin request sharing). Otherwise a security exception would be thrown. In older browsers, you can use this version, which uses a JSON-P request:

  $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); }); 

There isn’t really a reliable way to get the client computer’s IP address.

This goes through some of the possibilities. The code that uses Java will break if the user has multiple interfaces.

http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html

From looking at the other answers here it sounds like you may want to get the client’s public IP address, which is probably the address of the router they’re using to connect to the internet. A lot of the other answers here talk about that. I would recommend creating and hosting your own server side page for receiving the request and responding with the IP address instead of depending on someone else’s service that may or may not continue to work.

Javascript / jQuery get Client’s IP Address & Location (Country, City)

You only need to embed a tag with “src” link to the server. The server will return “codehelper_ip” as an Object / JSON, and you can use it right away.

 // First, embed this script in your head or at bottom of the page.  // You can use it  

More information at Javascript Detect Real IP Address Plus Country

If you are using jQUery, you can try:

 console.log(codehelper_ip); 

It will show you more information about returned object.

If you want callback function, please try this:

 // First, embed this script in your head or at bottom of the page.  // You can use it  

Appspot.com callback’s service isn’t available. ipinfo.io seems to be working.

I did an extra step and retrieved all geo info using AngularJS. (Thanks to Ricardo) Check it out.

 

Working page here: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

You can use the userinfo.io javascript library.

  UserInfo.getInfo(function(data) { alert(data.ip_address); }, function(err) { // Do something with the error }); 

You can also use requirejs to load the script.

It will give you the IP address of your visitor, as well as a few data on its location (country, city, etc.). It is based on maxmind geoip database.

Disclaimer: I wrote this library

If you’re including an file anways, you could do a simple ajax get:

 function ip_callback() { $.get("ajax.getIp.php",function(data){ return data; } } 

And ajax.getIp.php would be this:

 < ?=$_SERVER['REMOTE_ADDR']?> 

I’m going to offer a method that I use a lot when I want to store information in the html page, and want my javascript to read information without actually having to pass parameters to the javascript. This is especially useful when your script is referenced externally, rather than inline.

It doesn’t meet the criterion of “no server side script”, however. But if you can include server side scripting in your html, do this:

Make hidden label elements at the bottom of your html page, just above the end body tag.

Your label will look like this:

  

Be sure to make a class called hiddenlabel and set the visibility:hidden so no one actually sees the label. You can store lots of things this way, in hidden labels.

Now, in your javascript, to retrieve the information stored in the label (in this case the client’s ip address), you can do this:

 var ip = document.getElementById("ip").innerHTML; 

Now your variable “ip” equals the ip address. Now you can pass the ip to your API request.

* EDIT 2 YEARS LATER * Two minor refinements:

I routinely use this method, but call the label class="data" , because, in fact, it is a way to store data. Class name “hiddenlabel” is kind of a stupid name.

The second modification is in the style sheet, instead of visibility:hidden :

 .data{ display:none; } 

…is the better way of doing it.

You could do this entirely client side and mostly in JavaScript by using a Flash object that the js can call. Flash can access the IP address of the local machine which might not be very useful.

I really like api.ipify.org because it supports both HTTP and HTTPS.

Here are some examples of getting the IP using api.ipify.org using jQuery.

JSON Format over HTTPS

 https://api.ipify.org?format=json 
 $.getJSON("https://api.ipify.org/?format=json", function(e) { alert(e.ip); }); 
  

Use ipdata.co .

The API also provides geolocation data and has 10 global endpoints each able to handle >800M requests a day!

This answer uses a ‘test’ API Key that is very limited and only meant for testing a few calls. Signup for your own Free API Key and get up to 1500 requests daily for development.

 $.get("https://api.ipdata.co?api-key=test", function (response) { $("#response").html(response.ip); }, "jsonp"); 
  

 var call_to = "http://smart-ip.net/geoip-json?callback=?"; $.getJSON(call_to, function(data){ alert(data.host); }); 

data.host is the ip address. Simply call this from your browser.

http://smart-ip.net/geoip-json?callback=? [Without quotes] and get the ip.

You can use web services like: http://ip-api.com/

Ejemplo:

  additional example: http://whatmyip.info 
  $.getJSON("http://jsonip.com?callback=?", function (data) { alert("Your ip address: " + data.ip); }); 
 < !DOCTYPE html>