para - ¿Cómo obtener la dirección IP del cliente usando JavaScript?
obtener ip local javascript (30)
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);
});
});
Necesito recuperar de alguna manera la dirección IP del cliente usando JavaScript; No hay código del lado del servidor, ni siquiera SSI.
Sin embargo, no estoy en contra de usar un script / servicio de terceros gratuito.
No busque más
Echa un vistazo a 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 repositorio de GitHub ).
Aquí hay un ejemplo de trabajo de JS (en lugar de preguntarse por qué esta respuesta tiene tan pocos votos, pruébelo usted mismo para verlo 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 💻 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 provea tal servicio para el bien general.
Con el uso de Smart-IP.net Geo-IP API . Por ejemplo, usando jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
Hay dos interpretaciones a esta pregunta. La mayoría de la gente interpretó que "IP del cliente" significa la dirección IP pública que los servidores web ven fuera de la LAN y en 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 de JavaScript (que casi siempre es una dirección IP local en una LAN que está detrás de algo en 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 UTILIZAR 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 recuperarla / conocerla / almacenarla. Tenía que ser capaz de esperar a que los resultados llegaran 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)
}
);
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>
Incluya este código en su página: <script type="text/javascript" src="http://l2.io/ip.js"></script>
más doc aquí
La mayoría de las respuestas aquí "solucionan" la necesidad de un código del lado del servidor al ... Golpear el servidor de otra persona. Esta es una técnica totalmente válida, a menos que realmente necesites obtener la dirección IP sin llegar a un servidor.
Tradicionalmente, esto no era posible sin algún tipo de complemento (e incluso entonces, probablemente obtendría la dirección IP incorrecta si estuviera detrás de un enrutador NAT), pero con la llegada de WebRTC es posible hacerlo. . Si está apuntando a 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 beneficio adicional, la información de geolocalización se devuelve en la misma llamada.
Puede usar mi servicio http://ipinfo.io para esto, que le dará la IP del cliente, el nombre del 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 toda la información de respuesta, para que pueda ver todos los detalles disponibles: http://jsfiddle.net/zK5FN/2/
Puede, retransmitirlo a través del servidor con JSONP
Y mientras busco en Google para encontrar uno, lo encontré 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 se ha cerrado permanentemente a partir del 15 de noviembre de 2015 .
Usaría un servicio web que puede devolver JSON (junto con jQuery para simplificar las cosas). A continuación se encuentran todos los servicios de búsqueda de IP activos y gratuitos que pude encontrar y la información que devuelven. Si sabe más, agregue 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 soporta devoluciones de llamada JSONP
- Requiere parámetro de dirección IP
- Requiere una dirección de correo electrónico para obtener su clave API
- No SSL (https) con el plan gratuito.
Geobytes
Pruébelo: 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
- No SSL (https) con el plan gratuito.
- Puede devolver la ubicación incorrecta (estoy en Singapur, no en Arabia Saudita)
GeoIPLookup.io
Pruébelo: 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 <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": "$",
"geoplugin_currencySymbol_UTF8": "$",
"geoplugin_currencyConverter": 1.4239
}
Limitaciones:
- 120 solicitudes por minuto
- No SSL (https) con el plan gratuito.
Objetivo hacker
Pruébelo: 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 soporta devoluciones de llamada JSONP
- Requiere parámetro de dirección IP
- Devuelve texto plano
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)
http://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
- No 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": "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 una dirección de correo electrónico para obtener su clave API
- Requiere SSL (https)
IP Encuentra
Pruébelo: https://ipfind.co/me?auth= < su clave 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
Pruébelo: https://api.ipgeolocation.io/ipgeo?apiKey= < su 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
api.ipify.org
Pruébelo: 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ébelo: https://api.ipinfodb.com/v3/ip-city/?key= < su 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 peticiones 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)
Inténtelo: http://api.ipstack.com/ < dirección ip >? Access_key = <su clave 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 parámetro de dirección IP
- Requiere registro para obtener su clave API
- No 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 y política.
Prueba de 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 (más de la cuota), por lo que no lo usaría para producción
- Devuelve la dirección IPv6 si tiene una, que puede no ser lo que desea
Nekudo
Pruébelo: 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 los bloqueadores de anuncios que utilizan la lista EasyPrivacy
Herramientas Web Estúpidas
Pruébelo: 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 servicios gratuitos, su millaje puede variar en términos de exceder la cuota y el tiempo de actividad, y quién sabe cuándo y si se desconectarán en el Telize (prueba A: Telize ). La mayoría de estos servicios también ofrecen un nivel de pago en caso de que desee más funciones como la 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 sucede en el lado del cliente y la mayoría de los usuarios finales nunca superarán la cuota.
Actualizaciones
- 01/02/2016: Se eliminó Telize (ya no ofrece plan gratuito)
- 18/04/2016: eliminado freegeoip.net (fuera de servicio)
- 26/04/2016: DB-IP agregado
- 26/04/2016: Añadido Hacker Target
- 6/6/2016: Reinstalado en freegeoip.net
- 7/6/2016: Eliminado ip-json.rhcloud.com (enlace muerto)
- 21/12/2016: Eliminado objetivo de hacker (fuera de servicio)
- 10/10/2017: Nekudo Añadido
- 20/04/2017: Se agregó ipapi.co (gracias Ahmad Awais)
- 24/04/2017: objetivo de Hacker restablecido
- 24/04/2017: Eliminado Snoopi.io (fuera de servicio)
- 7/16/2017: Agregado IP Find (gracias JordanC)
- 16/07/2017: limitación actualizada para planes gratuitos que no admiten SSL
- 25/09/2017: Se agregaron herramientas web estúpidas (gracias Cœur)
- 16/03/2018: Agregado Ipdata.co (gracias Jonathan)
- 14/04/2018: Se cambió el nombre de freegeoip.net a ipstack (gracias MA-Maddin)
- 16/04/2018: Se agregó GeoIPLookup.io (gracias Rob Waa)
- 11/11/2018: Se agregó ipgeolocation (gracias Ejaz Ahmed)
Usted no puede Tendrías que preguntar a un servidor.
Yo diría que Chad y Malta tienen una gran respuesta. Sin embargo, las suyas son complicadas. Así que sugiero este código que encontré en los anuncios por país.
<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>
No ajax. Sólo javascripts simples. :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 la IP (aunque apuesto a que usa la IP para obtener el país).
Pero es tan fácil hacer un guión de PhP que resalte algo como
function visitorsIP() { return ''123.123.123.123''; }
Haz eso. Ponga en http://yourdomain.com/yourip.php .
Entonces hazlo
<script language="javascript" src="http://yourdomain.com/yourip.php"></script>
La pregunta específicamente menciona NO utilizar un script de terceros. No hay otra manera. Javascript no puede saber tu IP. Pero otros servidores a los que se puede acceder a través de javascript pueden funcionar igual de bien sin ningún problema.
Javascript / jQuery obtiene la dirección IP y la ubicación del cliente (país, ciudad)
Solo necesita insertar una etiqueta con el enlace "src" al servidor. El servidor devolverá "codehelper_ip" como Object / JSON, y puede usarlo de inmediato.
// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?js"></script>
// You can use it
<script language="Javascript">
alert(codehelper_ip.IP);
alert(codehelper_ip.Country);
</script>
Más información en Javascript Detect Real IP Address Plus Country
Si está utilizando jQUery, puede probar:
console.log(codehelper_ip);
Le mostrará más información sobre el objeto devuelto.
Si desea la función de devolución de llamada, intente esto:
// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?callback=yourcallback"></script>
// You can use it
<script language="Javascript">
function yourcallback(json) {
alert(json.IP);
}
</script>
Actualización : siempre quise hacer una versión mínima / uglificada del código, así que aquí hay un código de 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 reducido solo devolverá una única IP si desea todas las IP del usuario (que podrían ser más dependiendo de su red), use el código original ...
Gracias a WebRTC , es muy fácil obtener IP local en los navegadores compatibles con WebRTC (al menos por ahora). He modificado el código fuente, reduje las líneas, no hago solicitudes de aturdimiento, ya que solo quieres IP local, no IP pública. El código a continuación funciona en las últimas versiones de Firefox y Chrome.
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 pariente ficticio, y para que el contacto remoto nos contacte, generalmente intercambiamos candidatos de hielo entre nosotros. Y leyendo los candidatos de hielo (de la descripción de la sesión local y onIceCandidateEvent) podemos informar la IP del usuario.
donde tomé el código de -> Source
Consigue tu IP con jQuery
puede obtener su dirección IP pública con una línea de JS? Hay un servicio gratuito que ofrece esto para usted y una solicitud de obtención es todo lo que necesita hacer:
$.get(''http://jsonip.com/'', function(r){ console.log(r.ip); });
Para que funcione el fragmento de código anterior, su navegador tendrá que admitir CORS (intercambio de solicitudes de origen cruzado). De lo contrario se lanzaría una excepción de seguridad. En navegadores más antiguos, puede usar esta versión, que usa una solicitud JSON-P:
$.getJSON(''http://jsonip.com/?callback=?'', function(r){ console.log(r.ip); });
Bueno, me estoy desviando de la pregunta, pero hoy tenía una necesidad similar y aunque no pude encontrar la identificación del cliente usando Javascript, hice lo siguiente.
En el lado del servidor: -
<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>
Usando Javascript
var ip = $get("uip").innerHTML;
Estoy usando ASP.Net Ajax, pero puede usar getElementById en lugar de $ get ().
Lo que sucede es que tengo un elemento div oculto en la página con la IP del usuario representada desde el servidor. Que en Javascript acabo de cargar ese valor.
Esto podría ser útil para algunas personas con un requisito similar como el tuyo (como yo, aunque no había descubierto esto).
¡Aclamaciones!
Hay un enfoque más fácil y gratuito que no le pedirá permiso a su visitante.
Consiste en enviar una solicitud POST de Ajax muy simple a http://freegeoip.net/json . Una vez que recibe la información de su ubicación, en JSON, reacciona en consecuencia actualizando la página o redirigiendo a una nueva.
Aquí es cómo usted 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)
}
} );
No es posible en general a menos que utilice algún tipo de servicio externo.
Realmente no hay una forma confiable de obtener la dirección IP de la computadora cliente.
Esto pasa por algunas de las posibilidades. El código que usa Java se romperá si el usuario tiene varias interfaces.
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
Al ver las otras respuestas aquí, parece que es posible que desee obtener la dirección IP pública del cliente, que es probablemente la dirección del enrutador que están utilizando para conectarse a Internet. Muchas de las otras respuestas aquí hablan de eso. Recomendaría crear y alojar su propia página del lado del servidor para recibir la solicitud y responder con la dirección IP en lugar de depender del servicio de otra persona que puede o no continuar funcionando.
Si siempre incluye un archivo, puede hacer un simple ajax y obtener:
function ip_callback() {
$.get("ajax.getIp.php",function(data){ return data; }
}
Y ajax.getIp.php
sería esto:
<?=$_SERVER[''REMOTE_ADDR'']?>
El servicio de devolución de llamada de Appspot.com no está disponible. ipinfo.io parece estar funcionando.
Hice un paso adicional y recuperé toda la información geográfica utilizando AngularJS. (Gracias a Ricardo) Échale un vistazo.
<div ng-controller="geoCtrl">
<p ng-bind="ip"></p>
<p ng-bind="hostname"></p>
<p ng-bind="loc"></p>
<p ng-bind="org"></p>
<p ng-bind="city"></p>
<p ng-bind="region"></p>
<p ng-bind="country"></p>
<p ng-bind="phone"></p>
</div>
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular-route.min.js"></script>
<script>
''use strict'';
var geo = angular.module(''geo'', [])
.controller(''geoCtrl'', [''$scope'', ''$http'', function($scope, $http) {
$http.jsonp(''http://ipinfo.io/?callback=JSON_CALLBACK'')
.success(function(data) {
$scope.ip = data.ip;
$scope.hostname = data.hostname;
$scope.loc = data.loc; //Latitude and Longitude
$scope.org = data.org; //organization
$scope.city = data.city;
$scope.region = data.region; //state
$scope.country = data.country;
$scope.phone = data.phone; //city area code
});
}]);
</script>
Página de trabajo aquí: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html
Puede hacer esto completamente del lado del cliente y principalmente en JavaScript usando un objeto Flash al que js puede llamar. Flash puede acceder a la dirección IP de la máquina local, lo que puede no ser muy útil.
Puede utilizar la biblioteca de javascript userinfo.io .
<script type="text/javascript" src="userinfo.0.0.1.min.js"></script>
UserInfo.getInfo(function(data) {
alert(data.ip_address);
}, function(err) {
// Do something with the error
});
También puede utilizar requirejs para cargar el script.
Le proporcionará la dirección IP de su visitante, así como algunos datos sobre su ubicación (país, ciudad, etc.). Se basa en la base de datos geoip maxmind.
Descargo de responsabilidad: escribí esta biblioteca
Puede utilizar servicios web como: http://ip-api.com/
Ejemplo:
<script type="text/javascript" src="http://ip-api.com/json/?callback=foo">
<script>
function foo(json) {
alert(json.query)
}
</script>
additional example: http://whatmyip.info
Realmente me gusta api.ipify.org
porque soporta HTTP y HTTPS.
Aquí hay algunos ejemplos de cómo obtener la IP api.ipify.org
usando jQuery.
Formato JSON sobre HTTPS
https://api.ipify.org?format=json
$.getJSON("https://api.ipify.org/?format=json", function(e) {
alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Formato JSON sobre HTTP
http://api.ipify.org?format=json
$.getJSON("http://api.ipify.org/?format=json", function(e) {
alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Formato de texto a través de HTTPS
Si no lo desea en JSON, también hay una respuesta de texto simple a través de HTTPS
https://api.ipify.org
Formato de texto sobre HTTP
Y también hay una respuesta de texto simple a través de HTTP.
http://api.ipify.org
Utilice ipdata.co .
La API también proporciona datos de geolocalización y tiene 10 puntos finales globales, cada uno capaz de manejar> 800M solicitudes al día.
Esta respuesta utiliza una clave de API de "prueba" que es muy limitada y solo para probar algunas llamadas. Regístrese para obtener su propia clave de API gratuita y reciba hasta 1500 solicitudes diarias para el desarrollo.
$.get("https://api.ipdata.co?api-key=test", function (response) {
$("#response").html(response.ip);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>
Voy a ofrecer un método que uso mucho cuando quiero almacenar información en la página html, y quiero que mi javascript lea la información sin tener que pasar parámetros al javascript. Esto es especialmente útil cuando su script es referenciado externamente, en lugar de en línea.
Sin embargo, no cumple con el criterio de "sin script del lado del servidor". Pero si puede incluir scripts del lado del servidor en su html, haga esto:
Cree elementos de etiqueta ocultos en la parte inferior de la página html, justo encima de la etiqueta del cuerpo final.
Su etiqueta se verá así:
<label id="ip" class="hiddenlabel"><?php echo $_SERVER[''REMOTE_ADDR'']; ?></label>
Asegúrate de hacer una clase llamada hiddenlabel
y configurar visibility:hidden
para que nadie vea la etiqueta. Puedes almacenar muchas cosas de esta manera, en etiquetas ocultas.
Ahora, en su javascript, para recuperar la información almacenada en la etiqueta (en este caso, la dirección IP del cliente), puede hacer esto:
var ip = document.getElementById("ip").innerHTML;
Ahora su variable "ip" es igual a la dirección ip. Ahora puedes pasar la ip a tu solicitud de API.
* EDITAR 2 AÑOS DESPUÉS * Dos mejoras menores:
Rutinariamente utilizo este método, pero llamo a la etiqueta class="data"
porque, de hecho, es una forma de almacenar datos. El nombre de clase "hiddenlabel" es una especie de nombre estúpido.
La segunda modificación está en la hoja de estilo, en lugar de visibility:hidden
:
.data{
display:none;
}
... es la mejor manera de hacerlo.
<!DOCTYPE html>
<html ng-app="getIp">
<body>
<div ng-controller="getIpCtrl">
<div ng-bind="ip"></div>
</div>
<!-- Javascript for load faster
================================================== -->
<script src="lib/jquery/jquery.js"></script>
<script src="lib/angular/angular.min.js"></script>
<script>
/// Scripts app
''use strict'';
/* App Module */
var getIp = angular.module(''getIp'', [ ]);
getIp.controller(''getIpCtrl'', [''$scope'', ''$http'',
function($scope, $http) {
$http.jsonp(''http://jsonip.appspot.com/?callback=JSON_CALLBACK'')
.success(function(data) {
$scope.ip = data.ip;
});
}]);
</script>
</body>
</html>
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
es la direccion ip Simplemente llame a esto desde su navegador.
http://smart-ip.net/geoip-json?callback=?
[Sin comillas] y obtén la ip.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});