Como obter o endereço IP do cliente usando JavaScript?


560

Eu preciso recuperar de alguma forma o endereço IP do cliente usando JavaScript; nenhum código do lado do servidor, nem mesmo SSI.

No entanto, não sou contra o uso de um script / serviço gratuito de terceiros.

Respostas:


774

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.


Cloudflare

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:

  • Retorna texto sem formatação

DB-IP

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:

  • 2.500 solicitações por dia
  • Não suporta retornos de chamada JSONP
  • Requer parâmetro de endereço IP
  • Requer um endereço de email para obter sua chave de API
  • Sem SSL (https) com o plano gratuito

Geobytes

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:

  • 16.384 solicitações por hora
  • Sem SSL (https) com o plano gratuito
  • Pode retornar o local errado (estou em Cingapura, não na Arábia Saudita)

GeoIPLookup.io

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:

  • 10.000 solicitações por hora
  • API gratuita apenas permite uso não comercial

geoPlugin

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": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

Limitações:

  • 120 pedidos por minuto
  • Sem SSL (https) com o plano gratuito

Alvo do hacker

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:

  • 50 solicitações por dia
  • Não suporta retornos de chamada JSONP
  • Requer parâmetro de endereço IP
  • Retorna texto sem formatação

ipapi.co

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:

  • 1.000 solicitações por dia
  • Requer SSL (https)

IP-API.com

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:

  • 150 pedidos por minuto
  • Sem SSL (https) com o plano gratuito

Ipdata.co

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:

  • 1.500 solicitações por dia
  • Requer um endereço de email para obter sua chave de API
  • Requer SSL (https)

Localização de IP

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:

  • 300 solicitações por dia
  • Requer registro para obter sua chave de API

ipgeolocation

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:

  • 50.000 solicitações por mês
  • Requer registro para obter sua chave de API

ipify

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:

  • Nenhum

IPInfoDB

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:

  • Duas solicitações por segundo
  • Requer registro para obter sua chave de API

ipinfo.io

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:

  • 1.000 solicitações por dia

Ipregistry

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:

  • Plano gratuito inclui 100.000 solicitações
  • Requer registro para obter sua chave de API

ipstack (anteriormente freegeoip.net)

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:

  • 10.000 solicitações por mês
  • Requer parâmetro de endereço IP
  • Requer registro para obter sua chave de API
  • Sem SSL (https) com o plano gratuito

jsonip.com

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:

  • A resposta inclui upsell

Teste JSON

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:

  • Sem SSL (https)
  • Diminui muito (acima da cota), então eu não o usaria para produção
  • Retorna o endereço IPv6 se você tiver um, que pode não ser o que você deseja

Nekudo

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:

  • Bloqueado por bloqueadores de anúncios usando a lista EasyPrivacy

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


3
@AfolabiOlaoluwaAkinwumi você pode tentar algo como isto: $.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });
thdoan

1
@skobaljic Re. as limitações geralmente não significam nada: bom argumento e talvez um motivo para ficar longe dos que precisam de uma chave API, porque o uso da chave pode ser contado.
Nick Rice

2
@JohnWeisz True, mas se o OP simplesmente significasse que eles só poderiam atualizar a página e não fazer nada do lado do servidor (claro na pergunta), essas opções responderão bem à pergunta.
Nick Rice

1
@RobWaa obrigado, adicionei a limitação do bloqueador de anúncios na atualização de 4/14. Vou adicionar geoiplookup.io em breve.
thdoan

1
Todas essas respostas dependem de um serviço de terceiros, o que é uma grande desvantagem, não apenas porque você depende desse serviço responder em tempo hábil, mas porque, se isso não acontecer, e você não definir um tempo limite apropriado (que sempre será ocorrer mais tarde), você atrasará o tempo de carregamento da página, o que não é bom. Então, por que não usar apenas seu próprio servidor para retornar o IP do cliente ?, o que é uma tarefa trivial com qualquer linguagem de programação.
Daniel J.

280

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


12
Voto a favor, porque sem dúvida a melhor resposta aqui, também obrigado pelo incrível repositório GitHub!
Kano 16/05

28
Aviso: isso não mostra seu IP público, apenas o da rede local. Você não pode usá-lo para detectar um país de usuários, por exemplo, se eles estiverem em uma LAN
FloatingRock

1
@FloatingRock, você também pode recuperar o IP público, usando o servidor STUN (e configurá-lo durante a criação do ponto); isso exigiria a manutenção / uso de um servidor STUN, a imagem do código do servidor.
Mido

10
Isso é conhecido como vazamento do WebRTC. Deve ser corrigido por todos os principais navegadores, mas não é. Mais informações aqui: privacytools.io/webrtc.html Possivelmente relacionado ao navegador Tor que está vazando seu IP real.
Kapitein Witbaard

1
Embora gostei da resposta, o cliente pode passar por esse processo desativando o WebRTC - restoreprivacy.com/webrtc-leaks #
ni8mr

175

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 .


45
Embora eu aprecie esse snippet, acho que carregar um conteúdo de texto JavaScript e avaliar que através de uma função é um risco grave à segurança. E se o conteúdo da resposta for alterado e todas as mais de 100 pessoas que votaram nessa resposta e possivelmente usaram esse snippet acabam invocando uma função com possível conteúdo inseguro. Eu só usaria isso se fosse uma string JSON.
Auco

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M

28
Essa não é uma boa resposta, pois envolve uma solicitação do lado do servidor. A pergunta afirmava claramente "javascript puro".
Micah

2
Micah, não há como obter um endereço IP com javascript puro. Eu sugiro que você faça algumas leituras sobre NAT e como isso funciona. Você precisa de um servidor para ecoar a sua internet volta endereço IP para você
Chad Grant

11
O serviço está desativado agora.
Cyril N.

109

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.


23
@ Oscar: parece ser a mesma técnica (IP visível ao servidor retornado por JSONP) que o Chade mencionou em sua resposta. O que não corresponde ao requisito do OP de "nenhum código do lado do servidor". Mas sim, essa é uma maneira de realizá-lo se você ignorar esse requisito.
Shog9

Esta resposta está desatualizada devido ao WebRTC: stackoverflow.com/questions/20194722/…
Akam

1
Atualizado, @Akam. Você deve dar ao mido algumas sugestões para apontar isso alguns meses atrás (depois de anos de pessoas postando respostas embaraçosamente erradas que ainda exigiam suporte do servidor).
11116 Shog9

O WebRTC é mais amplamente suportado agora ?!
Oldboy

1
De acordo com o link "CanIUse", é @BugWhisperer. A menos que você precise do IE.
Shog9

81

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.


6
Você também pode obter uma representação JSON usando api.hostip.info/get_json.php e depois analisar o JSON com a função do navegador, jQuery ou Prototype.
Brad Folkens

2
existe algum limite de solicitação em " api.hostip.info/get_html.php "? onde posso ver os detalhes desta API
Navin Leon

Retorna o IP do firewall da rede. não o IP do cliente real. Existe uma maneira de obter o IP do cliente real?
Leela Addagulla

76
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);
    });
});

Violino


isso funciona $ .get (" ipinfo.io ", função (resposta) {alert (response.ip);}, "jsonp"); mas como faço para armazenar o valor em uma variável? parece desaparecer fora desse loop de solicitação get

1
Para obter uma lista de todos os serviços gratuitos de pesquisa de IP, consulte a minha resposta para stackoverflow.com/questions/391979/…
thdoan

Como envio esta função para retornar o valor do ip?
Neftali Acosta

67

Você não pode. Você teria que perguntar a um servidor.


5
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
21415 Himanshu

28
Mas meio que faz, certo? Quero dizer, se a resposta for apenas "não, você não pode", então eu diria que esta é uma resposta mais correta do que a atualmente votada "aqui, use este aplicativo appspot aleatório", que parece ser uma resposta perigosa no topo da lista.
precisa saber é o seguinte

16
IMO Esta é a resposta correta e deve ser aceita. A pergunta diz especificamente "nenhum código do lado do servidor".
Mattewwithanm


2
@matthewwithanm Eu não poderia concordar mais. Eu estava percorrendo todas as respostas para ver se alguém havia dito exatamente isso - e estava preparado para oferecer isso como resposta. Todas as respostas altamente votadas, embora informativas, respondem a uma pergunta diferente. Citando a pergunta: "Eu preciso de alguma forma puxar o endereço IP do cliente usando JavaScript puro; nenhum código do lado do servidor, nem mesmo o SSI". Esta resposta é, de fato, a resposta correta. O Javascript na área restrita do navegador não pode fazer isso (independentemente de NAT ou proxies). A pergunta deve ser alterada se uma das outras respostas for aceita.
217 wally

64

Não procure mais

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.


4
A melhor parte é que isso vem de "https", enquanto minhas chamadas para os auxiliares de IP http seriam bloqueadas porque "não são seguras".
Tessa

ei, está me mostrando o erro do CORS, o que devo fazer?
Sabre12019

@saberprashant você está usando "HTTPS"?
FloatingRock

@FloatingRock, não, eu estou usando HTTP
sabreprashant 4/19

26

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/


Para evitar os problemas da Política de Conteúdo Misto, altere http://ipinfo.iopara //ipinfo.ioou https #
Samuel Elh 29/04

Queremos usar seu serviço. Você tem alguma oferta de desconto para usuários do Stackoverflow?
Mehdi Dehghani

@MehdiDehghani Estamos livres para até 50k req / mês, para 100k com um backlink - ver ipinfo.io/contact/creditlink
Ben Dowling

19

Inclua este código na sua página: <script type="text/javascript" src="http://l2.io/ip.js"></script>

mais doc aqui


1
Hum. Parece interessante ... Algum limite que eles têm?
Indapublic 17/09/14

1
biblioteca offline
riccardo.tasso

Há algum grau de spam associado a l2.io ref: hybrid-analysis.com/sample/… permite a incorporação de links como no exemplo 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip "," host ":" l2.io "," referer ":" website.com/… } "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = true & fingerprint = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza

16

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.


7
carregar um JavaScript de um servidor remoto e chamar funções com conteúdo desconhecido parece um enorme risco de segurança para mim (e se o conteúdo da função mudar?). Prefiro analisar uma resposta JSON.
Auco

3
Erro 404: Objeto não encontrado
trejder

Já faz muito tempo., A resposta é bastante falsa, na verdade. Eu não sabia que o javascript não pode saber o IP.
usar o seguinte comando

oh está correto a função visitorsIP não é para ser um código php. É um código javacript gerado pelo código php
user4951 19/01

você pode simplesmente usar seu próprio servidor e imprimir um código javascript que atribua IP aos visitantes.
user4951

15

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>


14

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)
  }
} );

Parece que eles foram encerrados em 1 de julho de 2018
Nithin PH 28/09

13

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!


20
-1: O OP menciona especificamente "nenhum código do lado do servidor", mas você usa algum C #.
Bruno Reis

8
Não seria melhor apenas produzir <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines

além de usar o código do lado do servidor, nunca se deve usar o DOM para armazenar dados. Isso é ruim todo. Hainesy tem uma idéia melhor para atribuir apenas ao JS var.
coblr

13

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);
        }
    );
});

15
"Serviço temporário indisponível".
Iago

escreveu uma API simples [ geoip.immanuel.co/myip] para obter o endereço IP do cliente, SSL ativado e nenhum limite
Immanuel


9

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); });

9

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


8

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>

1
não use languageatributo, use type="text/javascript"em vez disso, mais em MDN
Alex K

como o @Alex já mencionado, o idioma está obsoleto e é usado apenas no código legado. Use 'type = "text / javascript"' para obter a máxima compatibilidade.
Gautham C.

1
apenas FYI - o campo de tipo não é necessário para HTML5 (JS é o padrão). w3schools.com/tags/att_script_type.asp
pmont

Apenas no caso de você perdeu esses outros comentários, você deve usar tipo em vez da linguagem
Mike

8

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


8

Se você estiver incluindo um arquivo de qualquer maneira, poderá fazer um simples ajax obter:

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

E ajax.getIp.phpseria isso:

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

8

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.

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 em HTTPS

Se você não quiser em JSON, também há uma resposta em texto sem formatação sobre HTTPS

https://api.ipify.org

Formato de texto sobre HTTP

E também há uma resposta em texto sem formatação sobre HTTP

http://api.ipify.org

8

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>


7

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.


7

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 hiddenlabele definir o nome visibility:hiddenpara 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.


3
Não armazene dados no DOM. Por que alguém sugeriria isso, mesmo 2 anos depois? Se você pode injetar o que quer que seja no arquivo HTML, basta injetar esse valor em uma variável JS como essa. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script>. Pelo menos os leitores de tela sentirão falta dele e não será necessário getElementById ou $ ('# stupidname').
coblr

@fractalspawn, pelo motivo de não poder inserir o código php em um arquivo .js. Não pensou nisso, você calça esperta! ;)
TARKUS

Bem, você poderia se você fizesse <script type = "text / javascript" src = "caminho / para / fancy / javascript.php"> </script>, embora não tenha certeza de por que você faria isso. Meu argumento é que, se o PHP puder inserir algo no HTML que está renderizando, a melhor prática seria inserir um valor em uma variável JS dentro de uma tag de script embutida, em vez de em um elemento DOM que você precisaria analisar para poder usá-lo e pode ser lido pelos leitores de tela, a menos que você tome medidas extras para evitá-lo.
coblr

Não há absolutamente nenhuma boa razão para você não poder adicionar ou não adicionar elementos de retenção de dados ao DOM, e há muitas boas razões para fazê-lo. De fato, esses motivos estão na minha resposta, se você quiser lê-lo novamente. É confiável, fácil de controlar e especialmente útil quando o arquivo javascript ocorre em um site remoto. Falando em script remoto, seu exemplo de "javascript.php" é uma ideia horrível e, provavelmente, não funcionaria. Pense em termos de scripts remotos, como DISQUS.
TARKUS 24/02

3
Para seu outro comentário sobre por que o armazenamento de dados DOM é ruim ... bem, você ainda pode parar um carro batendo suavemente em uma parede no seu destino, mas agora existem ferramentas melhores para o trabalho. Agora sabemos melhor e temos ótimas estruturas para aliviar isso. Eu trabalhei em um local em que o DOM era apenas um grande arquivo de configuração para o JS e era um pesadelo quando reestilizado. Se você acha que usar <script src = "something.php"> é um "truque bruto", mas armazenar dados no DOM que só tem valor dentro do Javascript não é, fico muito feliz por não trabalharmos juntos e novamente, de bom grado concordar em discordar. :)
coblr 28/05

6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });


6

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
}

5

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.


4
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.


desculpe, o que $ significa em javascript?
GHOST
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.