Respostas:
Eu usaria um serviço da web que pode retornar JSON (junto com o jQuery para simplificar as coisas). Abaixo estão todos os serviços de pesquisa de IP ativos gratuitos que eu encontrei e as informações que eles retornam. Se você souber mais, adicione um comentário e atualizarei esta resposta.
Experimente: 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)
})
Devoluções:
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
Limitações:
Experimente: http://api.db-ip.com/addrinfo?api_key= < sua chave api > & addr = < endereço IP >
Devoluções:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
Limitações:
Experimente: http://gd.geobytes.com/GetCityDetails
$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
}
Limitações:
Experimente: https://json.geoiplookup.io/api
$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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
}
Limitações:
Experimente: http://www.geoplugin.net/json.gp
$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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
}
Limitações:
Experimente: https://api.hackertarget.com/geoip/?q= < endereço IP >
Devoluções:
IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
Limitações:
Experimente: https://ipapi.co/json/
$.getJSON('https://ipapi.co/json/', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
}
Limitações:
Experimente: http://ip-api.com/json
$.getJSON('http://ip-api.com/json?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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": ""
}
Limitações:
Experimente: https://api.ipdata.co
$.getJSON('https://api.ipdata.co', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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
}
}
Limitações:
Experimente: https://ipfind.co/me?auth= < sua chave da API >
$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
]
}
Limitações:
Experimente: https://api.ipgeolocation.io/ipgeo?apiKey= < sua chave da API >
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
}
}
Limitações:
Experimente: https://api.ipify.org/?format=json
$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"ip": "116.12.250.1"
}
Limitações:
Experimente: https://api.ipinfodb.com/v3/ip-city/?key= < sua chave da 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));
});
Devoluções:
{
"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"
}
Limitações:
Experimente: https://ipinfo.io/json
$.getJSON('https://ipinfo.io/json', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
}
Limitações:
Experimente: https://api.ipregistry.co/?key= < sua chave da API >
$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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
}
}
Limitações:
Experimente: http://api.ipstack.com/ < endereço IP >? Access_key = <sua chave api>
$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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
}
}
Limitações:
Experimente: https://jsonip.com
$.getJSON('https://jsonip.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"ip": "116.12.250.1",
"about": "https://jsonip.com/about",
"Pro!": "http://getjsonip.com",
"Get Notifications": "https://jsonip.com/notify"
}
Limitações:
Experimente: http://ip.jsontest.com/
$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"ip": "116.12.250.1"
}
Limitações:
Experimente: https://geoip.nekudo.com/api
$.getJSON('https://geoip.nekudo.com/api', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Devoluções:
{
"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"
}
Limitações:
Lembre-se de que, como todos esses serviços são gratuitos, sua milhagem pode variar em termos de cota e tempo de atividade excedentes, e quem sabe quando / se eles serão retirados da estrada ( anexo A: Telize ). A maioria desses serviços também oferece uma camada paga, caso você queira mais recursos, como suporte a SSL.
Além disso, como skobaljic observou nos comentários abaixo, as cotas de solicitação são principalmente acadêmicas, pois isso está acontecendo no lado do cliente e a maioria dos usuários finais nunca excederá a cota.
ATUALIZAÇÕES
Atualização final
Essa solução não funcionaria mais porque os navegadores estão corrigindo o vazamento do webrtc: para obter mais informações sobre isso, leia esta outra pergunta: RTCIceCandidate não retorna mais o IP
Atualização : eu sempre quis fazer uma versão min / uglificada do código, então aqui está um código ES6 Promise:
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 novo código minificado retornaria apenas um único IP se você quiser todos os IPs do usuário (que podem ser mais dependendo da rede dele), use o código original ...
Graças ao WebRTC , é muito fácil obter IP local nos navegadores suportados pelo WebRTC (pelo menos por enquanto). Modifiquei o código-fonte, reduzi as linhas, não fiz solicitações de atordoamento, já que você deseja apenas o IP local, não o IP público, o código abaixo funciona nos mais recentes Firefox e Chrome, basta executar o snippet e verificar por si mesmo:
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>
o que está acontecendo aqui é que estamos criando uma conexão fictícia entre pares e, para que o ponto remoto entre em contato conosco, geralmente trocamos candidatos de gelo entre si. E lendo os candidatos a gelo (da descrição da sessão local e do onIceCandidateEvent), podemos dizer o IP do usuário.
de onde peguei o código -> Source
Você pode, retransmitindo-o via servidor com JSONP
E enquanto pesquisava no Google, encontrei aqui no SO. Posso executar uma pesquisa de DNS (nome do host para endereço IP) usando Javascript no 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: A API do telize.com foi encerrada permanentemente a partir de 15 de novembro de 2015 .
Error Over Quota This application is temporarily over its serving quota. Please try again later.
A maioria das respostas aqui "soluciona" a necessidade de código do lado do servidor ... Atingindo o servidor de outra pessoa. Essa é uma técnica totalmente válida, a menos que você realmente precise obter o endereço IP sem precisar acessar um servidor.
Tradicionalmente, isso não era possível sem algum tipo de plug-in (e mesmo assim, você provavelmente obteria o endereço IP errado se estivesse atrás de um roteador NAT), mas com o advento do WebRTC é realmente possível fazer isso. . Se você está alvejando navegadores que suportam WebRTC (atualmente: Firefox, Chrome e Opera).
Leia a resposta da mido para obter detalhes sobre como recuperar endereços IP de clientes úteis usando o WebRTC.
Você pode fazer uma chamada ajax para hostip.info ou um serviço semelhante ...
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 bônus, as informações de localização geográfica são retornadas na mesma chamada.
Tente isto
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
OU
$(document).ready(function () {
$.getJSON("http://jsonip.com/?callback=?", function (data) {
console.log(data);
alert(data.ip);
});
});
Você não pode. Você teria que perguntar a um servidor.
Confira http://www.ipify.org/
De acordo com eles:
- Você pode usá-lo sem limite (mesmo se estiver fazendo milhões de solicitações por minuto).
- O ipify é completamente de código aberto (confira o repositório do GitHub ).
Aqui está um exemplo de JS funcional (em vez de se perguntar por que essa resposta tem tão poucos votos, tente você mesmo vê-la em ação):
<script>
function getIP(json) {
alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
Com preguiça de copiar / colar? Eu gosto disso. Aqui está uma demonstração
Com preguiça de clicar? :O
Nota : Desative o Adblock Plus / uBlock & co antes de executar a demonstração. Caso contrário, isso simplesmente não funcionará.
Não tenho nada a ver com a equipe do IPify. Eu acho ridiculamente legal alguém oferecer esse serviço para o bem geral.
Você pode usar meu serviço http://ipinfo.io para isso, que fornecerá o IP do cliente, nome do host, informações de localização geográfica e proprietário da rede. Aqui está um exemplo simples que registra o IP:
$.get("http://ipinfo.io", function(response) {
console.log(response.ip);
}, "jsonp");
Aqui está um exemplo mais detalhado do JSFiddle que também imprime as informações completas da resposta, para que você possa ver todos os detalhes disponíveis: http://jsfiddle.net/zK5FN/2/
http://ipinfo.io
para //ipinfo.io
ou https #
Inclua este código na sua página: <script type="text/javascript" src="http://l2.io/ip.js"></script>
mais doc aqui
Eu diria que Chade e Malta têm uma ótima resposta. No entanto, os deles são complicados. Então, sugiro esse código que encontrei nos anúncios por plug-in 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>
Sem ajax. Apenas javascripts simples. : D
Se você acessar http://j.maxmind.com/app/geoip.js , verá que ele contém
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 ''; }
Ainda não responde à pergunta porque
http://j.maxmind.com/app/geoip.js não contém o IP (embora aposto que ele usa o IP para obter o país).
Mas é tão fácil criar um script PhP que aparece algo como
function visitorsIP() { return '123.123.123.123'; }
Faça aquilo. Coloque http://yourdomain.com/yourip.php .
Então faça
<script language="javascript" src="http://yourdomain.com/yourip.php"></script>
A pergunta menciona especificamente NÃO para usar scripts de terceiros. Não há outro caminho. Javascript não pode saber o seu IP. Mas outros servidores que podem ser acessados por javascript podem funcionar da mesma maneira sem problemas.
Existem duas interpretações para essa pergunta. A maioria das pessoas interpretou "IP do cliente" como o endereço IP público que o servidor da Web vê fora da LAN e fora da Internet. Este não é o endereço IP do computador cliente na maioria dos casos, embora
Eu precisava do endereço IP real do computador que está executando o navegador que hospeda o meu software JavaScript (que quase sempre é um endereço IP local em uma LAN que está por trás de algo nessa camada NAT).
Mido postou uma resposta FANTÁSTICA, acima, que parece ser a única resposta que realmente forneceu o endereço IP do cliente.
Obrigado por isso, Mido!
No entanto, a função apresentada é executada de forma assíncrona. Preciso realmente USAR o endereço IP no meu código e, com uma solução assíncrona, posso tentar usar o endereço IP antes que ele seja recuperado / aprendido / armazenado. Eu precisava aguardar os resultados para chegar antes de usá-los.
Aqui está uma versão "Waitable" da função do Mido. Espero que ajude outra pessoa:
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>
Existe uma abordagem mais fácil e gratuita que não solicita permissão ao visitante.
Consiste em enviar uma solicitação muito simples do Ajax POST para http://freegeoip.net/json . Depois de receber suas informações de localização, em JSON, você reage de acordo atualizando a página ou redirecionando para uma nova.
Aqui está como você envia sua solicitação de informações de localização:
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.log(location)
}
} );
Bem, estou me desviando da pergunta, mas hoje tive uma necessidade semelhante e, embora não tenha encontrado o ID do cliente usando Javascript, fiz o seguinte.
No lado do servidor: -
<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>
Usando Javascript
var ip = $get("uip").innerHTML;
Estou usando o ASP.Net Ajax, mas você pode usar getElementById em vez de $ get ().
O que está acontecendo é que eu tenho um elemento div oculto na página com o IP do usuário processado no servidor. Do que em Javascript, apenas carrego esse valor.
Isso pode ser útil para algumas pessoas com requisitos semelhantes aos seus (como eu, enquanto eu não tinha descoberto isso).
Felicidades!
<script>var uip='<%= Request.UserHostAddress %>';</script>
?
Com o uso da API Smart-IP.net Geo-IP . Por exemplo, usando jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
Geralmente, não é possível, a menos que você use algum tipo de serviço externo.
Obtenha seu IP com jQuery
você pode obter seu endereço IP público com uma linha de JS? Há um serviço gratuito que oferece isso para você e uma solicitação de obtenção é tudo o que você precisa fazer:
$.get('http://jsonip.com/', function(r){ console.log(r.ip); });
Para que o snippet acima funcione, seu navegador precisará oferecer suporte ao CORS (compartilhamento de solicitação entre origens). Caso contrário, uma exceção de segurança seria lançada. Em navegadores antigos, você pode usar esta versão, que usa uma solicitação JSON-P:
$.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });
Você pode usar a 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
});
Você também pode usar requirejs para carregar o script.
Ele fornecerá o endereço IP do seu visitante, bem como alguns dados sobre sua localização (país, cidade etc.). É baseado no banco de dados maxmind geoip.
Isenção de responsabilidade: escrevi esta biblioteca
Javascript / jQuery obtém o endereço IP e a localização do cliente (país, cidade)
Você só precisa incorporar uma tag com o link "src" no servidor. O servidor retornará "codehelper_ip" como um Object / JSON, e você poderá usá-lo imediatamente.
// 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>
Mais informações em Javascript Detect Real IP Address Plus Country
Se você estiver usando jQUery, poderá tentar:
console.log(codehelper_ip);
Ele mostrará mais informações sobre o objeto retornado.
Se você deseja a função de retorno de chamada, tente o seguinte:
// 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>
O serviço de retorno de chamada do Appspot.com não está disponível. O ipinfo.io parece estar funcionando.
Fiz uma etapa extra e recuperei todas as informações geográficas usando o AngularJS. (Obrigado ao Ricardo) Confira.
<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 trabalho aqui: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html
Eu realmente gosto api.ipify.org
porque ele suporta HTTP e HTTPS.
Aqui estão alguns exemplos de como obter o IP usando api.ipify.org
usando o 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>
Se você não quiser em JSON, também há uma resposta em texto sem formatação sobre HTTPS
https://api.ipify.org
E também há uma resposta em texto sem formatação sobre HTTP
http://api.ipify.org
Use ipdata.co .
A API também fornece dados de localização geográfica e possui 10 pontos de extremidade globais, cada um capaz de lidar com mais de 800 milhões de solicitações por dia!
Esta resposta usa uma chave de API 'teste' muito limitada e destinada apenas ao teste de algumas chamadas. Inscreva-se em sua própria chave de API gratuita e receba até 1500 solicitações diárias para desenvolvimento.
$.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>
Não existe realmente uma maneira confiável de obter o endereço IP do computador cliente.
Isso passa por algumas das possibilidades. O código que usa Java será interrompido se o usuário tiver várias interfaces.
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
Observando as outras respostas aqui, parece que você deseja obter o endereço IP público do cliente, que provavelmente é o endereço do roteador que ele está usando para se conectar à Internet. Muitas das outras respostas aqui falam sobre isso. Eu recomendaria criar e hospedar sua própria página do lado do servidor para receber a solicitação e responder com o endereço IP em vez de depender do serviço de outra pessoa que pode ou não continuar funcionando.
Vou oferecer um método que uso muito quando quero armazenar informações na página html e quero que meu javascript leia informações sem precisar passar parâmetros para o javascript. Isso é especialmente útil quando seu script é referenciado externamente, em vez de embutido.
Porém, ele não atende ao critério de "nenhum script do lado do servidor". Mas se você pode incluir scripts do lado do servidor em seu html, faça o seguinte:
Crie elementos de etiqueta ocultos na parte inferior da sua página html, logo acima da etiqueta do corpo final.
Seu rótulo ficará assim:
<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>
Certifique-se de criar uma classe chamada hiddenlabel
e definir o nome visibility:hidden
para que ninguém realmente veja o rótulo. Você pode armazenar muitas coisas dessa maneira, em rótulos ocultos.
Agora, no seu javascript, para recuperar as informações armazenadas no rótulo (neste caso, o endereço IP do cliente), você pode fazer o seguinte:
var ip = document.getElementById("ip").innerHTML;
Agora sua variável "ip" é igual ao endereço IP. Agora você pode passar o ip para sua solicitação de API.
* EDITAR 2 ANOS DEPOIS * Dois pequenos refinamentos:
Eu uso rotineiramente esse método, mas chamo o rótulo class="data"
, porque, de fato, é uma maneira de armazenar dados. O nome da classe "hiddenlabel" é meio que um nome estúpido.
A segunda modificação está na folha de estilos, em vez de visibility:hidden
:
.data{
display:none;
}
... é a melhor maneira de fazê-lo.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Tente isso: http://httpbin.org/ip (ou https://httpbin.org/ip )
Exemplo com https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['origin']);
});
Fonte: http://httpbin.org/
Antes de mais nada, a resposta real : não é possível usar código executado puramente do lado do cliente para descobrir seu próprio endereço IP.
No entanto, você pode simplesmente fazer um GET em https://api.muctool.de/whois e receber algo como obter o endereço IP de um 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
}
Você pode fazer isso inteiramente do lado do cliente e principalmente em JavaScript usando um objeto Flash que os js podem chamar. O Flash pode acessar o endereço IP da máquina local, o que pode não ser muito útil.
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
é o endereço IP. Basta ligar para isso no seu navegador.
http://smart-ip.net/geoip-json?callback=?
[Sem aspas] e obtenha o ip.
$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });