Pregunta ¿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.


561
2017-12-24 18:22


origen


Respuestas:


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


DB-IP

Intentalo:  http://api.db-ip.com/addrinfo?api_key= <tu clave de 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

Intentalo:  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

Intentalo:  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

Intentalo:  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 <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
  "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": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

Limitaciones

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

Hacker Target

Intentalo:  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

Intentalo:  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

Intentalo:  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

Intentalo:  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": "https://ipdata.co/flags/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

Intentalo:  https://ipfind.co/me?auth= <tu clave de api>

$.getJSON('https://ipfind.co/me?auth=<your_api_key>', 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

Intentalo:  https://api.ipgeolocation.io/ipgeo?apiKey= <tu clave de api>

$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', 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": "https://ipgeolocation.io/static/flags/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

Intentalo:  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

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

$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_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

Intentalo:  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)

Intentalo:  http://api.ipstack.com/ <dirección IP>? access_key =<su llave de API>

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_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

Intentalo:  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

Intentalo:  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

Intentalo:  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

Intentalo:  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 futuro (documento 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


464
2018-02-01 04:40



Actualizar: 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))

Nota: Este nuevo código modificado devolvería solo una dirección IP si desea todas las direcciones IP del usuario (que podría ser más dependiendo de su red), use el código original ...


gracias a WebRTC, es muy fácil obtener IP local en navegadores compatibles con WebRTC (al menos por ahora). Modifiqué el código fuente, reduje las líneas, no realicé ninguna solicitud de aturdimiento ya que solo desea la IP local, no la IP pública, el código siguiente funciona en las últimas versiones de Firefox y Chrome, solo ejecute el fragmento y compruébalo usted mismo:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
  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)) return;
    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
  };
}



var ul = document.createElement('ul');
ul.textContent = 'Your IPs are: '
document.body.appendChild(ul);

function addIP(ip) {
  console.log('got ip: ', ip);
  var li = document.createElement('li');
  li.textContent = ip;
  ul.appendChild(li);
}

findIP(addIP);
<h1> Demo retrieving Client IP using WebRTC </h1>

lo que está sucediendo aquí es que estamos creando una conexión de pares ficticia, y para que el par remoto nos contacte, generalmente intercambiamos candidatos de hielo entre sí. Y al leer los candidatos de hielo (de la descripción de la sesión local y onIceCandidateEvent) podemos decir la IP del usuario.

donde tomé el código de -> Fuente


203
2017-09-29 10:03



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

Y mientras buscábamos en Google para encontrar uno, lo encontramos aquí en SO ¿Puedo realizar una búsqueda de DNS (nombre de host a dirección IP) usando Javascript del lado del cliente?

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://www.telize.com/jsonip?callback=getip"></script>

Nota : La API de telize.com tiene permanentemente cerrado a partir del 15 de noviembre de 2015.


177
2018-05-01 07:02



La mayoría de las respuestas aquí "solucionan" la necesidad de un código de servidor al ... Golpear el servidor de otra persona. Que es una técnica totalmente válida, a menos que de hecho necesita para obtener la dirección IP sin tocar un servidor.

Tradicionalmente esto no era posible sin algún tipo de complemento (e incluso entonces, es probable que incorrecto Dirección IP si estaba detrás de un enrutador NAT), pero con la llegada de WebRTC es posible hacerlo ... Siestás apuntando navegadores compatibles con WebRTC (actualmente: Firefox, Chrome y Opera).

Por favor, lea la respuesta de mido para obtener detalles sobre cómo puede recuperar direcciones IP de clientes útiles usando WebRTC.


95
2017-12-24 18:25



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.


81
2018-03-08 22:21



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


72
2017-11-13 12:06



No busque más

Revisa http://www.ipify.org/

Según ellos:

  • Puedes usarlo sin limite (incluso si está haciendo millones de solicitudes por minuto).
  • ipify es completamente de código abierto (echa un vistazo a Repositorio 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):

<script>
function getIP(json) {
  alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

Demasiado perezoso para copiar / pegar? Me gusta. Aquí hay una demostración 

Demasiado perezoso para hacer clic? :O

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

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


43
2018-01-14 05:28



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


40
2018-04-09 03:09



Puedes usar mi servicio http://ipinfo.io para esto, que le dará IP del cliente, nombre de host, información de geolocalización y 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/


24
2017-07-23 10:48