Respuestas:
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 gratuitos que pude encontrar y la información que devuelven. Si conoce más, agregue un comentario y actualizaré esta respuesta.
Pruébelo: https://www.cloudflare.com/cdn-cgi/trace
// If your site is on Cloudflare, then you can use '/cdn-cgi/trace' instead
$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
console.log(data)
})
Devoluciones:
fl=4f422
h=www.cloudflare.com
ip=54.193.27.106
ts=1575967108.245
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Hypothesis-Via
colo=SJC
http=http/1.1
loc=US
tls=TLSv1.3
sni=plaintext
warp=off
Limitaciones:
Pruébelo: http://api.db-ip.com/addrinfo?api_key= < su clave de API > & addr = < dirección IP >
Devoluciones:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
Limitaciones:
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:
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:
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:
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:
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:
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:
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:
Pruébelo: https://ipfind.co/me?auth= < su 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:
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:
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:
Pruébelo: https://api.ipinfodb.com/v3/ip-city/?key= < your api key > & 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:
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:
Pruébelo: https://api.ipregistry.co/?key= < su clave de api >
$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluciones:
{
"ip" : "116.12.250.1",
"type" : "IPv4",
"hostname" : null,
"carrier" : {
"name" : null,
"mcc" : null,
"mnc" : null
},
"connection" : {
"asn" : 3758,
"domain" : "singnet.com.sg",
"organization" : "SingNet Pte Ltd",
"type" : "isp"
},
"currency" : {
"code" : "SGD",
"name" : "Singapore Dollar",
"plural" : "Singapore dollars",
"symbol" : "SGD",
"symbol_native" : "SGD",
"format" : {
"negative" : {
"prefix" : "-SGD",
"suffix" : ""
},
"positive" : {
"prefix" : "SGD",
"suffix" : ""
}
}
},
"location" : {
"continent" : {
"code" : "AS",
"name" : "Asia"
},
"country" : {
"area" : 692.0,
"borders" : [ ],
"calling_code" : "65",
"capital" : "Singapore",
"code" : "SG",
"name" : "Singapore",
"population" : 5638676,
"population_density" : 8148.38,
"flag" : {
"emoji" : "🇸🇬",
"emoji_unicode" : "U+1F1F8 U+1F1EC",
"emojitwo" : "https://cdn.ipregistry.co/flags/emojitwo/sg.svg",
"noto" : "https://cdn.ipregistry.co/flags/noto/sg.png",
"twemoji" : "https://cdn.ipregistry.co/flags/twemoji/sg.svg",
"wikimedia" : "https://cdn.ipregistry.co/flags/wikimedia/sg.svg"
},
"languages" : [ {
"code" : "cmn",
"name" : "cmn",
"native" : "cmn"
}, {
"code" : "en",
"name" : "English",
"native" : "English"
}, {
"code" : "ms",
"name" : "Malay",
"native" : "Melayu"
}, {
"code" : "ta",
"name" : "Tamil",
"native" : "தமிழ்"
}, {
"code" : "zh",
"name" : "Chinese",
"native" : "中文"
} ],
"tld" : ".sg"
},
"region" : {
"code" : null,
"name" : "Singapore"
},
"city" : "Singapore",
"postal" : "96534",
"latitude" : 1.28967,
"longitude" : 103.85007,
"language" : {
"code" : "cmn",
"name" : "cmn",
"native" : "cmn"
},
"in_eu" : false
},
"security" : {
"is_bogon" : false,
"is_cloud_provider" : false,
"is_tor" : false,
"is_tor_exit" : false,
"is_proxy" : false,
"is_anonymous" : false,
"is_abuser" : false,
"is_attacker" : false,
"is_threat" : false
},
"time_zone" : {
"id" : "Asia/Singapore",
"abbreviation" : "SGT",
"current_time" : "2019-09-29T23:13:32+08:00",
"name" : "Singapore Standard Time",
"offset" : 28800,
"in_daylight_saving" : false
}
}
Limitaciones:
Pruébelo: http://api.ipstack.com/ < dirección IP >? Access_key = <su clave 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:
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": "https://jsonip.com/about",
"Pro!": "http://getjsonip.com",
"Get Notifications": "https://jsonip.com/notify"
}
Limitaciones:
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:
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:
Tenga en cuenta que, dado que todos estos servicios son 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 ( Anexo A: Telize ). La mayoría de estos servicios también ofrecen un nivel de pago en caso de que desee más funciones como el soporte SSL.
Además, como señaló skobaljic en los comentarios a continuación, las cuotas de solicitud son principalmente académicas, ya que esto está sucediendo en el lado del cliente y la mayoría de los usuarios finales nunca excederán la cuota.
ACTUALIZACIONES
Actualización final
Esta solución ya no funcionaría porque los navegadores están reparando la fuga webrtc: para obtener más información al respecto, lea esta otra pregunta: RTCIceCandidate ya no devuelve IP
Actualización : siempre quise hacer una versión min / uglified del código, así que aquí hay un código de promesa de 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 minimizado devolvería solo una única IP si desea todas las IP del usuario (que pueden ser más dependientes 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 hice ninguna solicitud de aturdimiento, ya que solo desea IP local, no la IP pública, el código a continuación funciona en Firefox y Chrome más recientes, solo ejecute el fragmento y verifíquelo 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 simulada entre pares, y para que el par remoto se comunique con nosotros, 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 decir la IP del usuario.
de donde tomé el código -> Fuente
Puede, retransmitiéndolo 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 cerró permanentemente a partir del 15 de noviembre de 2015 .
Error Over Quota This application is temporarily over its serving quota. Please try again later.
La mayoría de las respuestas aquí "solucionan" la necesidad de un código del lado del servidor ... Golpeando 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 golpear un servidor.
Tradicionalmente esto no era posible sin una cierta clase de un plugin (y aún así, es probable que obtendría la equivocada dirección IP si estuviera detrás de un router NAT), pero con la llegada de WebRTC en realidad es posible hacer esto .. . Si usted está apuntando navegadores que el apoyo 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.
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);
});
});
No puedes Tendrías que preguntarle a un servidor.
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 (consulte el repositorio de GitHub ).
Aquí hay un ejemplo de JS que funciona (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 demostración 💻
¿Demasiado perezoso para hacer clic? :O
Nota : apague 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.
Puede usar mi servicio http://ipinfo.io para esto, que le dará 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/
http://ipinfo.io
de //ipinfo.io
o https
Incluya este código en su página: <script type="text/javascript" src="http://l2.io/ip.js"></script>
más doc aquí
Yo diría que Chad y Malta tienen una gran respuesta. Sin embargo, los suyos son complicados. Así que sugiero este código que encontré en los anuncios por complemento de 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 Simplemente 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 aún no responde la pregunta 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 script PhP que haga estallar algo como
function visitorsIP() { return '123.123.123.123'; }
Haz eso. Poner en http://yourdomain.com/yourip.php .
Entonces hazlo
<script language="javascript" src="http://yourdomain.com/yourip.php"></script>
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.
Hay dos interpretaciones a esta pregunta. La mayoría de las personas interpretaron "IP del cliente" como la dirección IP pública que los servidores web ven fuera de la LAN y en Internet. Sin embargo, esta no es la dirección IP de la computadora cliente en la mayoría de los casos
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 de esa 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 asincrónica. Necesito realmente USAR la dirección IP en mi código, y con una solución asincrónica, podría intentar usar la dirección IP antes de recuperarla / aprenderla / almacenarla. 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)
}
);
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>
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.
Así es como 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 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 renderizada 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 lo había resuelto).
¡Salud!
<script>var uip='<%= Request.UserHostAddress %>';</script>
?
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);
}
);
});
En general, no es posible a menos que use algún tipo de servicio externo.
Obtenga su 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 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 antiguos, puede usar esta versión, que usa una solicitud JSON-P:
$.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });
Puede usar la biblioteca 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 usar requirejs para cargar el script.
Le dará 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 maxmind geoip.
Descargo de responsabilidad: escribí esta biblioteca
Javascript / jQuery obtiene la dirección IP y la ubicación del cliente (país, ciudad)
Solo necesita incrustar una etiqueta con el enlace "src" al servidor. El servidor devolverá "codehelper_ip" como un objeto / 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>
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 usando AngularJS. (Gracias a Ricardo) Compruébalo.
<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
Realmente me gusta api.ipify.org
porque es compatible con HTTP y HTTPS.
Estos son algunos ejemplos de cómo obtener la IP api.ipify.org
utilizando jQuery.
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>
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>
Si no lo desea en JSON, también hay una respuesta de texto sin formato sobre HTTPS
https://api.ipify.org
Y también hay una respuesta de texto sin formato sobre HTTP
http://api.ipify.org
Utiliza ipdata.co .
¡La API también proporciona datos de geolocalización y tiene 10 puntos finales globales, cada uno capaz de manejar> 800M solicitudes por día!
Esta respuesta utiliza una clave API 'prueba' que es muy limitada y solo está destinada a probar algunas llamadas. Regístrese para obtener su propia clave API gratuita y obtenga hasta 1500 solicitudes diarias de 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>
Realmente no hay una manera 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 múltiples interfaces.
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
Al mirar las otras respuestas aquí, parece que es posible que desee obtener la dirección IP pública del cliente, que probablemente sea 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 pueda o no continuar funcionando.
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 se hace referencia externamente, en lugar de en línea.
Sin embargo, no cumple con el criterio de "no script del lado del servidor". Pero si puede incluir secuencias de comandos del lado del servidor en su html, haga lo siguiente:
Cree elementos de etiqueta ocultos en la parte inferior de su 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úrese de hacer una clase llamada hiddenlabel
y establecer elvisibility:hidden
para que nadie vea realmente la etiqueta. Puede 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 puede pasar la ip a su solicitud de API.
* EDITAR 2 AÑOS DESPUÉS * Dos mejoras menores:
Usualmente uso este método, pero llamo a la etiqueta class="data"
, porque, de hecho, es una forma de almacenar datos. El nombre de la 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.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Pruebe esto: http://httpbin.org/ip (o https://httpbin.org/ip )
Ejemplo con https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['origin']);
});
Fuente: http://httpbin.org/
En primer lugar, la respuesta real : no es posible utilizar código ejecutado exclusivamente del lado del cliente para averiguar su propia dirección IP.
Sin embargo, puede hacer un GET hacia https://api.muctool.de/whois y recibir algo como obtener la dirección IP de un cliente
{
"ip": "88.217.152.15",
"city": "Munich",
"isp": "M-net Telekommunikations GmbH",
"country": "Germany",
"countryIso": "DE",
"postalCode": "80469",
"subdivisionIso": "BY",
"timeZone": "Europe/Berlin",
"cityGeonameId": 2867714,
"countryGeonameId": 2921044,
"subdivisionGeonameId": 2951839,
"ispId": 8767,
"latitude": 48.1299,
"longitude": 11.5732,
"fingerprint": "61c5880ee234d66bded68be14c0f44236f024cc12efb6db56e4031795f5dc4c4",
"session": "69c2c032a88fcd5e9d02d0dd6a5080e27d5aafc374a06e51a86fec101508dfd3",
"fraud": 0.024,
"tor": false
}
Puede hacer esto completamente del lado del cliente y principalmente en JavaScript utilizando un objeto Flash al que js pueda llamar. Flash puede acceder a la dirección IP de la máquina local, lo que puede no ser muy útil.
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
es la dirección ip Simplemente llame a esto desde su navegador.
http://smart-ip.net/geoip-json?callback=?
[Sin comillas] y obtenga la ip.
$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });