Come ottenere l'indirizzo IP del client utilizzando JavaScript?


560

Devo in qualche modo recuperare l'indirizzo IP del client usando JavaScript; nessun codice lato server, nemmeno SSI.

Tuttavia, non sono contrario all'utilizzo di uno script / servizio di terze parti gratuito.

Risposte:


774

Vorrei utilizzare un servizio Web che può restituire JSON (insieme a jQuery per semplificare le cose). Di seguito sono riportati tutti i servizi di ricerca IP attivi gratuiti che ho trovato e le informazioni che restituiscono. Se ne conosci altri, ti preghiamo di aggiungere un commento e aggiornerò questa risposta.


Cloudflare

Provalo: 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)
})

Ritorna:

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

limitazioni:

  • Restituisce testo semplice

DB-IP

Provalo: http://api.db-ip.com/addrinfo?api_key= <la tua chiave api > & addr = < indirizzo ip >

Ritorna:

{
  "address": "116.12.250.1",
  "country": "SG",
  "stateprov": "Central Singapore",
  "city": "Singapore"
}

limitazioni:

  • 2.500 richieste al giorno
  • Non supporta i callback JSONP
  • Richiede il parametro dell'indirizzo IP
  • Richiede un indirizzo e-mail per ottenere la chiave API
  • Nessun SSL (https) con il piano gratuito

Geobytes

Provalo: http://gd.geobytes.com/GetCityDetails

$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
}

limitazioni:

  • 16.384 richieste all'ora
  • Nessun SSL (https) con il piano gratuito
  • Può restituire la posizione sbagliata (sono a Singapore, non in Arabia Saudita)

GeoIPLookup.io

Provalo: https://json.geoiplookup.io/api

$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
    "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
}

limitazioni:

  • 10.000 richieste all'ora
  • L'API gratuita consente solo l'uso non commerciale

geoPlugin

Provalo: http://www.geoplugin.net/json.gp

$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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
}

limitazioni:

  • 120 richieste al minuto
  • Nessun SSL (https) con il piano gratuito

Hacker Target

Provalo: https://api.hackertarget.com/geoip/?q= < indirizzo ip >

Ritorna:

IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797

limitazioni:

  • 50 richieste al giorno
  • Non supporta i callback JSONP
  • Richiede il parametro dell'indirizzo IP
  • Restituisce testo semplice

ipapi.co

Provalo: https://ipapi.co/json/

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
}

limitazioni:

  • 1.000 richieste al giorno
  • Richiede SSL (https)

IP-API.com

Provalo: http://ip-api.com/json

$.getJSON('http://ip-api.com/json?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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": ""
}

limitazioni:

  • 150 richieste al minuto
  • Nessun SSL (https) con il piano gratuito

Ipdata.co

Provalo: https://api.ipdata.co

$.getJSON('https://api.ipdata.co', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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
  }
}

limitazioni:

  • 1.500 richieste al giorno
  • Richiede un indirizzo e-mail per ottenere la chiave API
  • Richiede SSL (https)

Trova IP

Provalo: https://ipfind.co/me?auth= <la tua chiave API >

$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
  ]
}

limitazioni:

  • 300 richieste al giorno
  • Richiede la registrazione per ottenere la chiave API

geolocalizzazione IP

Provalo: https://api.ipgeolocation.io/ipgeo?apiKey= <la tua chiave API >

$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
  }
}

limitazioni:

  • 50.000 richieste al mese
  • Richiede la registrazione per ottenere la chiave API

ipify

Provalo: https://api.ipify.org/?format=json

$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "ip": "116.12.250.1"
}

limitazioni:

  • Nessuna

IPInfoDB

Provalo: https://api.ipinfodb.com/v3/ip-city/?key= <la tua chiave 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));
});

Ritorna:

{
  "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"
}

limitazioni:

  • Due richieste al secondo
  • Richiede la registrazione per ottenere la chiave API

ipinfo.io

Provalo: https://ipinfo.io/json

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
}

limitazioni:

  • 1.000 richieste al giorno

Ipregistry

Provalo: https://api.ipregistry.co/?key= <la tua chiave api >

$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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
  }
}

limitazioni:

  • Il piano gratuito include 100.000 richieste
  • Richiede la registrazione per ottenere la chiave API

ipstack (precedentemente freegeoip.net)

Provalo: http://api.ipstack.com/ < indirizzo ip >? Access_key = <la tua chiave api>

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
    "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
    }
}

limitazioni:

  • 10.000 richieste al mese
  • Richiede il parametro dell'indirizzo IP
  • Richiede la registrazione per ottenere la chiave API
  • Nessun SSL (https) con il piano gratuito

jsonip.com

Provalo: https://jsonip.com

$.getJSON('https://jsonip.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "ip": "116.12.250.1",
  "about": "https://jsonip.com/about",
  "Pro!": "http://getjsonip.com",
  "Get Notifications": "https://jsonip.com/notify"
}

limitazioni:

  • La risposta include upsell

Test JSON

Provalo: http://ip.jsontest.com/

$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "ip": "116.12.250.1"
}

limitazioni:

  • Nessun SSL (https)
  • Diminuisce molto (oltre la quota), quindi non lo userei per la produzione
  • Restituisce l'indirizzo IPv6 se ne hai uno, che potrebbe non essere quello che desideri

Nekudo

Provalo: https://geoip.nekudo.com/api

$.getJSON('https://geoip.nekudo.com/api', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Ritorna:

{
  "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"
}

limitazioni:

  • Bloccato dai blocchi annunci utilizzando l'elenco EasyPrivacy

Tieni presente che poiché questi sono tutti servizi gratuiti, il tuo chilometraggio può variare in termini di superamento della quota e del tempo di attività e chissà quando / se verranno portati offline lungo la strada (figura A: Telize ). La maggior parte di questi servizi offre anche un livello a pagamento nel caso in cui si desideri più funzionalità come il supporto SSL.

Inoltre, come notato da skobaljic nei commenti seguenti, le quote di richiesta sono per lo più accademiche poiché ciò accade sul lato client e la maggior parte degli utenti finali non supererà mai la quota.

AGGIORNAMENTI


3
@AfolabiOlaoluwaAkinwumi si può provare qualcosa di simile: $.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. le limitazioni di solito non significano nulla: buon punto, e forse un motivo per stare lontano da quelli che hanno bisogno di una chiave API, perché si può contare l' uso della chiave .
Nick Rice,

2
@JohnWeisz Vero, ma se l'OP significava semplicemente che potevano solo aggiornare la pagina e non fare nulla sul lato server (non chiaro dalla domanda), allora queste opzioni rispondono bene alla domanda.
Nick Rice,

1
@RobWaa grazie, ho aggiunto la limitazione del blocco degli annunci nell'aggiornamento 4/14. Aggiungerò geoiplookup.io a breve.
thdoan

1
Tutte queste risposte si basano su un servizio di terze parti, il che è un grosso svantaggio, non solo perché dipendi da quel servizio che risponde in modo tempestivo, ma perché se non lo fa e non imposti un timeout appropriato (che sarà sempre si verificano più tardi), ritarderai il tempo di caricamento della tua pagina, il che non è affatto buono. Quindi, perché non utilizzare semplicemente il proprio server per restituire l'IP del client ?, che è BTW un'attività banale con qualsiasi linguaggio di programmazione.
Daniel J.

280

Aggiornamento finale

Questa soluzione non funzionerebbe più perché i browser stanno riparando la perdita di webrtc: per maggiori informazioni a riguardo leggi questa altra domanda: RTCIceCandidate non restituisce più IP


Aggiornamento : ho sempre voluto creare una versione min / ugellata del codice, quindi ecco un codice Promessa 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: questo nuovo codice minimizzato restituirebbe un singolo IP se si desidera tutti gli IP dell'utente (che potrebbe dipendere maggiormente dalla sua rete), utilizzare il codice originale ...


grazie a WebRTC , è molto semplice ottenere l'IP locale nei browser supportati da WebRTC (almeno per ora). Ho modificato il codice sorgente, ridotto le righe, non ho fatto richieste di stordimento poiché vuoi solo IP locale, non IP pubblico, il codice seguente funziona negli ultimi Firefox e Chrome, esegui solo lo snippet e controlla tu stesso:

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>

quello che sta succedendo qui è che stiamo creando una connessione fittizia tra pari, e per il peer remoto di contattarci, generalmente scambiamo candidati sul ghiaccio tra di noi. E leggendo i candidati sul ghiaccio (dalla descrizione della sessione locale e onIceCandidateEvent) possiamo dire l'IP dell'utente.

da cui ho preso il codice da -> Fonte


12
Votazione perché sicuramente la migliore risposta qui, grazie anche per il fantastico repository GitHub!
kano,

28
Attenzione: questo non mostra il tuo IP pubblico, ma solo quello della rete locale. Non è possibile utilizzarlo per rilevare un paese di utenti, ad esempio, se si trovano su una LAN
FloatingRock

1
@FloatingRock è anche possibile recuperare l'IP pubblico, utilizzando il server STUN (e configurarlo durante la creazione del peer), quindi, di nuovo, ciò richiederebbe di mantenere / utilizzare un server STUN, portando in figura il codice del server.
mido,

10
Questo è noto come perdita WebRTC. Dovrebbe essere risolto da tutti i browser sindaco, ma non lo è. Maggiori informazioni qui: privacytools.io/webrtc.html Forse correlato al browser Tor che perde il tuo IP reale.
Kapitein Witbaard,

1
Tuttavia, mi è piaciuta la risposta, il client può superare questo processo disabilitando WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr

175

È possibile, inoltrandolo tramite il lato server con JSONP

E mentre cerco su Google di trovarne uno, lo trovo qui su SO Posso eseguire una ricerca DNS (nome host su indirizzo IP) usando Javascript sul lato client?

<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: l'API telize.com si è definitivamente chiusa dal 15 novembre 2015 .


45
mentre apprezzo questo frammento, penso che caricare un contenuto di testo JavaScript e valutare che attraverso una funzione sia un grave rischio per la sicurezza. Che cosa succede se il contenuto della risposta cambia e tutte le oltre 100 persone qui che hanno votato questa risposta e che hanno probabilmente usato quel frammento finiscono per invocare una funzione con un possibile contenuto insicuro. Lo userei solo se fosse una stringa JSON.
auco,

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

28
Questa non è una buona risposta in quanto comporta una richiesta lato server. La domanda affermava chiaramente "javascript puro".
Michea il

2
Micah, non è possibile ottenere un indirizzo IP con javascript puro. Ti suggerisco di fare qualche lettura su NAT e su come funziona. Hai bisogno di un server che ti risponda al tuo indirizzo IP Internet
Chad Grant,

11
Il servizio è ora inattivo.
Cirillo N.

109

La maggior parte delle risposte qui "aggira" la necessità di un codice sul lato server colpendo il server di qualcun altro. Che è una tecnica totalmente valida, a meno che tu non abbia effettivamente bisogno di ottenere l'indirizzo IP senza colpire un server.

Tradizionalmente questo non era possibile senza una sorta di plug-in (e anche allora, si otterrebbe probabilmente un indirizzo IP errato se si fosse dietro un router NAT), ma con l'avvento di WebRTC è effettivamente possibile farlo. . Se ci si rivolge browser che supportano WebRTC (attualmente: Firefox, Chrome e Opera).

Leggere la risposta di mido per i dettagli su come recuperare indirizzi IP client utili utilizzando WebRTC.


23
@oscar: quella sembra essere la stessa tecnica (IP visibile al server restituito da JSONP) che Chad ha menzionato nella sua risposta. Che non corrisponde al requisito del PO di "nessun codice lato server". Ma sì, questo è un modo per realizzarlo se ignori tale requisito.
Shog9

Questa risposta è obsoleta a causa di WebRTC: stackoverflow.com/questions/20194722/…
Akam

1
Aggiornato, @Akam. Dovresti dare a mido alcuni suggerimenti per sottolinearlo qualche mese fa (dopo ANNI di persone che hanno pubblicato risposte imbarazzanti e sbagliate che richiedevano ancora il supporto del server).
Shog9,

WebRTC è ora più ampiamente supportato ?!
oldboy,

1
Secondo quel link "CanIUse", è @BugWhisperer. A meno che tu non abbia bisogno di IE.
Shog9

81

Puoi fare una chiamata Ajax a hostip.info o un servizio simile ...

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

Come bonus, le informazioni di geolocalizzazione vengono restituite nella stessa chiamata.


6
Puoi anche ottenere una rappresentazione JSON usando api.hostip.info/get_json.php , quindi analizzare JSON con la funzione browser, jQuery o Prototype.
Brad Folkens,

2
esiste un limite di richiesta per " api.hostip.info/get_html.php "? dove posso vedere questi dettagli API
Navin Leon

Restituisce l'IP del Network Firewall. non l'effettivo IP client. Esiste un modo per ottenere l'effettivo IP client?
Leela Addagulla,

76
Prova questo
$.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);
    });
});

Violino


funziona $ .get (" ipinfo.io ", funzione (risposta) {alert (response.ip);}, "jsonp"); ma come posso memorizzare il valore in una variabile? sembra scomparire al di fuori di questo ciclo di richiesta get

1
Per un elenco di tutti i servizi IP liberi di ricerca, è possibile fare riferimento alla mia risposta per stackoverflow.com/questions/391979/...
thdoan

Come posso inviare questa funzione per restituire il valore dell'ip?
Neftali Acosta,

67

Non puoi. Dovresti chiedere a un server.


5
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
Himanshu

28
Ma fa un po ', giusto? Voglio dire, se la risposta è semplicemente "no, non puoi", direi che questa è una risposta più corretta di quella attualmente votata "qui, usa questa app a caso", che sembra una risposta pericolosa per in cima alla lista.
SteveShaffer,

16
IMO Questa è la risposta corretta e dovrebbe essere accettata. La domanda dice specificamente "nessun codice lato server".
matthewwithanm,


2
@matthewwithanm Non potrei essere più d'accordo. Stavo scorrendo tutte le risposte per vedere se qualcuno avesse detto esattamente questo - ed ero pronto a offrirlo come risposta. Tutte le risposte altamente votate, sebbene informative, rispondono tutte a una domanda diversa. Citando la domanda: "Devo in qualche modo estrarre l'indirizzo IP del client usando JavaScript puro; nessun codice lato server, nemmeno SSI." Questa risposta è, di fatto, la risposta corretta. Javascript nella sandbox del browser non può farlo (indipendentemente da NAT o proxy). La domanda dovrebbe essere cambiata se si vuole accettare una delle altre risposte.
Wally,

64

Non guardare oltre

Dai un'occhiata a http://www.ipify.org/

In accordo con loro:

  • Puoi usarlo senza limiti (anche se stai facendo milioni di richieste al minuto).
  • ipify è completamente open source (controlla il repository GitHub ).

Ecco un esempio di JS funzionante (invece di chiederti perché questa risposta abbia così pochi voti, provalo tu stesso per vederlo in azione):

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

Troppo pigro per copiare / incollare? Mi piace. Ecco una 💻 demo

Troppo pigro per fare clic? :O

Nota : Disattiva Adblock Plus / uBlock & co prima di eseguire la demo .. altrimenti non funzionerà.

Non ho nulla a che fare con il team di IPify. Penso solo che sia ridicolmente bello che qualcuno possa fornire un tale servizio per il bene generale.


4
La parte migliore è che questo deriva da "https" mentre le mie chiamate agli helper di http IP sarebbero bloccate perché "non sicure".
Tessa,

ehi, mi sta mostrando l'errore CORS, cosa devo fare?
sabreprashant

@saberprashant stai usando "HTTPS"?
FloatingRock

@FloatingRock, no Sto usando HTTP
sabreprashant il

26

A questo scopo puoi utilizzare il mio servizio http://ipinfo.io , che ti fornirà l'IP del client, il nome host, le informazioni sulla geolocalizzazione e il proprietario della rete. Ecco un semplice esempio che registra l'IP:

$.get("http://ipinfo.io", function(response) {
    console.log(response.ip);
}, "jsonp");

Ecco un esempio JSFiddle più dettagliato che stampa anche le informazioni complete sulla risposta, in modo da poter vedere tutti i dettagli disponibili: http://jsfiddle.net/zK5FN/2/


Per evitare problemi relativi alle Norme sui contenuti misti, http://ipinfo.iopassa a //ipinfo.ioo https
Samuel Elh,

Vogliamo utilizzare il tuo servizio, hai qualche offerta di sconto per gli utenti StackOverflow?
Mehdi Dehghani il

@MehdiDehghani siamo liberi per un massimo di 50k req / mese, per 100k con un backlink - vedi ipinfo.io/contact/creditlink
Ben Dowling

19

Includi questo codice nella tua pagina: <script type="text/javascript" src="http://l2.io/ip.js"></script>

più doc qui


1
Hm. Sembra interessante ... Qualche limite hanno?
indapublic

1
libreria offline
riccardo.tasso

Esistono alcuni pop-up spam associati a l2.io ref: hybrid-analysis.com/sample/… consente l'incorporamento di collegamenti come nell'esempio 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

Direi che Chad e Malta hanno un'ottima risposta. Tuttavia, i loro sono complicati. Quindi suggerisco questo codice che ho trovato dagli annunci per plugin del paese

<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. Solo semplici javascript. : D

Se vai su http://j.maxmind.com/app/geoip.js vedrai che 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 ''; }

In realtà non risponde ancora alla domanda perché

http://j.maxmind.com/app/geoip.js non contiene l'IP (anche se scommetto che utilizza l'IP per ottenere il paese).

Ma è così facile creare uno script PhP che fa apparire qualcosa di simile

function visitorsIP()   { return '123.123.123.123'; }

Fallo. Metti su http://yourdomain.com/yourip.php .

Quindi fa

<script language="javascript" src="http://yourdomain.com/yourip.php"></script>

La domanda menziona specificamente NON usare script di terze parti. Non c'è altro modo. Javascript non può conoscere il tuo IP. Ma altri server a cui è possibile accedere tramite JavaScript possono funzionare altrettanto bene senza problemi.


7
caricare un JavaScript da un server remoto e richiamare funzioni con contenuti sconosciuti mi sembra un enorme rischio per la sicurezza (cosa succede se i contenuti delle funzioni cambiano?). Preferirei analizzare una risposta JSON.
auco,

3
Errore 404: oggetto non trovato
trejder

È passato molto tempo., La risposta è in realtà abbastanza falsa. Non sapevo che JavaScript non potesse conoscere l'IP.
user4951

oh è corretto la funzione visitorsIP non vuole essere un codice php. È un codice javacript generato dal codice php
user4951

puoi semplicemente usare il tuo server quindi per stampare un codice javascript che assegna i visitatori ip.
user4951

15

Ci sono due interpretazioni a questa domanda. La maggior parte delle persone ha interpretato "IP client" per indicare l'indirizzo IP pubblico che il server Web vede all'esterno della LAN e su Internet. Tuttavia, questo non è l'indirizzo IP del computer client nella maggior parte dei casi

Avevo bisogno del vero indirizzo IP del computer che esegue il browser che ospita il mio software JavaScript (che è quasi sempre un indirizzo IP locale su una LAN che si trova dietro qualcosa di quel livello NAT).

Mido ha pubblicato una risposta FANTASTICA, sopra, che sembra essere l'unica risposta che ha davvero fornito l'indirizzo IP del client.

Grazie per quello, Mido!

Tuttavia, la funzione presentata viene eseguita in modo asincrono. Devo effettivamente USARE l'indirizzo IP nel mio codice e, con una soluzione asincrona, potrei provare a usare l'indirizzo IP prima che venga recuperato / appreso / memorizzato. Ho dovuto essere in grado di attendere che i risultati arrivassero prima di usarli.

Ecco una versione "Waitable" della funzione di Mido. Spero che aiuti qualcun altro:

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

Esiste un approccio più semplice e gratuito che non richiede alcuna autorizzazione al tuo visitatore.

Consiste nell'inviare una richiesta POST Ajax molto semplice a http://freegeoip.net/json . Una volta ricevute le informazioni sulla tua posizione, in JSON, reagisci di conseguenza aggiornando la pagina o reindirizzando a una nuova.

Ecco come inviare la richiesta di informazioni sulla posizione:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );

Sembra che abbiano chiuso il 1 luglio 2018
Nithin PH,

13

Bene, sto divagando dalla domanda, ma oggi avevo un bisogno simile e sebbene non riuscissi a trovare l'ID dal client usando Javascript, ho fatto quanto segue.

Sul lato server: -

<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>

Utilizzando Javascript

var ip = $get("uip").innerHTML;

Sto usando ASP.Net Ajax, ma puoi usare getElementById invece di $ get ().

Quello che sta succedendo è che ho un elemento div nascosto nella pagina con l'IP dell'utente reso dal server. Che in Javascript ho appena caricato quel valore.

Questo potrebbe essere utile per alcune persone con requisiti simili ai tuoi (come me mentre non lo avevo capito).

Saluti!


20
-1: L'OP menziona specificamente "nessun codice lato server", tuttavia si utilizza un C #.
Bruno Reis,

8
Non sarebbe meglio semplicemente produrre <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines,

oltre a utilizzare il codice lato server, non si dovrebbe mai usare il DOM per archiviare i dati. Questo è solo brutto dappertutto. Hainesy ha un'idea migliore da assegnare a JS var.
coblr

13

Con l'utilizzo dell'API Geo-IP di Smart-IP.net . Ad esempio, usando jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});

15
"Servizio temporaneo non disponibile".
Iago,

ha scritto un semplice api [ geoip.immanuel.co/myip] per ottenere l'indirizzo IP del client, abilitato per ssl e nessun limite
Immanuel


9

Ottieni il tuo IP con jQuery

puoi ottenere il tuo indirizzo IP pubblico con una riga di JS? C'è un servizio gratuito che ti offre questo e una richiesta di ottenere è tutto ciò che devi fare:

   $.get('http://jsonip.com/', function(r){ console.log(r.ip); });

Perché lo snippet sopra riportato funzioni, il tuo browser dovrà supportare CORS (condivisione delle richieste tra le origini). Altrimenti verrebbe generata un'eccezione di sicurezza. Nei browser meno recenti, è possibile utilizzare questa versione, che utilizza una richiesta JSON-P:

   $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });

9

È possibile utilizzare la libreria 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
});

Puoi anche utilizzare requestjs per caricare lo script.

Ti fornirà l'indirizzo IP del tuo visitatore, nonché alcuni dati sulla sua posizione (paese, città, ecc.). Si basa sul database geoip maxmind.

Disclaimer: ho scritto questa libreria


8

Javascript / jQuery ottiene l'indirizzo IP e la posizione del cliente (Paese, Città)

Devi solo incorporare un tag con il link "src" al server. Il server restituirà "codehelper_ip" come un oggetto / JSON e puoi usarlo immediatamente.

// 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>

Maggiori informazioni su Javascript Rilevano l'indirizzo IP reale più il Paese

Se stai usando jQUery, puoi provare:

console.log(codehelper_ip); 

Ti mostrerà ulteriori informazioni sull'oggetto restituito.

Se si desidera la funzione di richiamata, provare questo:

// 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
non usare l' languageattributo, usa type="text/javascript"invece, altro su MDN
Alex K

come già accennato @Alex, la lingua è obsoleta e viene utilizzata solo nel codice legacy. Usa invece 'type = "text / javascript"' per la massima compatibilità.
Gautham C.,

1
solo FYI - il campo type non è necessario per HTML5 (JS è l'impostazione predefinita). w3schools.com/tags/att_script_type.asp
pmont

Nel caso in cui tu abbia perso questi altri commenti, dovresti usare il tipo invece del linguaggio
Mike

8

Il servizio di callback di Appspot.com non è disponibile. ipinfo.io sembra funzionare.

Ho fatto un passo in più e ho recuperato tutte le informazioni geografiche usando AngularJS. (Grazie a Ricardo) Dai un'occhiata.

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

Pagina di lavoro qui: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


8

Se stai includendo un file in qualsiasi momento, potresti fare un semplice Ajax:

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

E ajax.getIp.phpsarebbe questo:

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

8

Mi piace molto api.ipify.orgperché supporta sia HTTP che HTTPS.

Ecco alcuni esempi di come ottenere l'IP api.ipify.orgusando jQuery.

Formato JSON su 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 su 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 testo su HTTPS

Se non lo si desidera in JSON, esiste anche una risposta in chiaro su HTTPS

https://api.ipify.org

Formato testo su HTTP

E c'è anche una risposta in chiaro su HTTP

http://api.ipify.org

8

Usa ipdata.co .

L'API fornisce anche dati di geolocalizzazione e ha 10 endpoint globali ciascuno in grado di gestire> 800 M richieste al giorno!

Questa risposta utilizza una chiave API "test" che è molto limitata e pensata solo per testare alcune chiamate. Iscriviti alla tua chiave API gratuita e ricevi fino a 1500 richieste al giorno per lo sviluppo.

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

Non esiste davvero un modo affidabile per ottenere l'indirizzo IP del computer client.

Questo passa attraverso alcune delle possibilità. Il codice che utilizza Java si interromperà se l'utente ha più interfacce.

http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html

Osservando le altre risposte qui sembra che potresti voler ottenere l'indirizzo IP pubblico del client, che è probabilmente l'indirizzo del router che stanno usando per connettersi a Internet. Molte delle altre risposte qui ne parlano. Consiglio di creare e ospitare la propria pagina laterale del server per ricevere la richiesta e rispondere con l'indirizzo IP invece di dipendere dal servizio di qualcun altro che potrebbe continuare o meno a funzionare.


7

Offrirò un metodo che uso molto quando voglio archiviare informazioni nella pagina html e voglio che il mio javascript legga le informazioni senza dover passare i parametri al javascript. Ciò è particolarmente utile quando si fa riferimento all'esterno dello script, piuttosto che in linea.

Tuttavia, non soddisfa il criterio di "nessuno script lato server". Ma se puoi includere lo scripting lato server nel tuo html, fai come segue:

Crea elementi di etichette nascosti nella parte inferiore della tua pagina html, appena sopra il tag del corpo finale.

La tua etichetta sarà simile a questa:

<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>

Assicurati di chiamare una classe hiddenlabele impostare ilvisibility:hidden modo che nessuno veda effettivamente l'etichetta. Puoi archiviare molte cose in questo modo, in etichette nascoste.

Ora, nel tuo javascript, per recuperare le informazioni memorizzate nell'etichetta (in questo caso l'indirizzo IP del client), puoi farlo:

var ip = document.getElementById("ip").innerHTML;

Ora la tua variabile "ip" è uguale all'indirizzo IP. Ora puoi passare l'ip alla tua richiesta API.

* MODIFICA 2 ANNI DOPO * Due perfezionamenti minori:

Uso abitualmente questo metodo, ma chiamo l'etichetta class="data", perché, in effetti, è un modo per archiviare i dati. Il nome della classe "etichetta nascosta" è una specie di nome stupido.

La seconda modifica è nel foglio di stile, anziché visibility:hidden:

.data{
    display:none;
}

... è il modo migliore per farlo.


3
Non archiviare i dati nel DOM. Perché qualcuno dovrebbe suggerirlo, anche 2 anni dopo? Se riesci a iniettare qualsiasi cosa nel file HTML, basta iniettare quel valore in una variabile JS in questo modo. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script>. Almeno poi gli screen reader mancheranno e non sono necessari getElementById o $ ('# stupidname').
coblr

@fractalspawn, Per il motivo per cui non è possibile inserire il codice php in un file .js. Non ci avevo pensato, pantaloni intelligenti! ;)
TARKUS,

Bene, potresti farlo se <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script> anche se non sono sicuro del motivo per cui lo faresti. Il mio punto è che se PHP può inserire qualcosa nell'HTML che sta eseguendo il rendering, la migliore pratica sarebbe di inserire un valore in una variabile JS all'interno di un tag di script inline, piuttosto che in un elemento DOM che dovresti quindi analizzare per poter essere utilizzato e potrebbe essere letto dagli screen reader a meno che non si adottino misure aggiuntive per impedirlo.
coblr

Non c'è assolutamente alcun buon motivo per cui non è possibile o non si debbano aggiungere elementi di conservazione dei dati al DOM e ci sono molte buone ragioni per farlo. In effetti, questi motivi sono nella mia risposta, se ti interessa rileggerlo di nuovo. È affidabile, facile da controllare e particolarmente utile quando il tuo file javascript si trova su un sito remoto. Parlando di script remoti, il tuo esempio di "javascript.php" è un'idea orribile, e probabilmente non funzionerebbe comunque. Pensa in termini di script remoti, come DISQUS.
TARKUS,

3
All'altro tuo commento sul perché la memorizzazione dei dati DOM è male ... beh, puoi comunque fermare un'auto colpendo delicatamente un muro a destinazione, ma ora ci sono strumenti migliori per il lavoro. Ora conosciamo meglio e disponiamo di strutture eccellenti per alleviare questo problema. Ho lavorato in un posto in cui il DOM era solo un enorme file di configurazione per JS, ed è stato un incubo quando è stato rinnovato. Se ritieni che l'utilizzo di <script src = "something.php"> sia un "hack rozzo", ma la memorizzazione di dati nel DOM che ha valore solo all'interno di Javascript non lo è, allora sono davvero felice che non funzioniamo insieme e di nuovo, acconsentiremo volentieri a non essere d'accordo. :)
coblr

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


6

Prima di tutto la risposta effettiva : non è possibile utilizzare il codice eseguito puramente sul lato client per scoprire il proprio indirizzo IP.

Tuttavia, puoi semplicemente fare un GET verso https://api.muctool.de/whois e ricevere qualcosa di simile per ottenere l'indirizzo IP di un client

{
"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

Puoi farlo interamente dal lato client e principalmente in JavaScript usando un oggetto Flash che js può chiamare. Flash può accedere all'indirizzo IP del computer locale che potrebbe non essere molto utile.


4
var call_to = "http://smart-ip.net/geoip-json?callback=?";

$.getJSON(call_to, function(data){
   alert(data.host);
});

data.hostè l'indirizzo IP. Chiamalo semplicemente dal tuo browser.

http://smart-ip.net/geoip-json?callback=? [Senza virgolette] e ottieni l'ip.


scusa, cosa significa $ in javascript?
GHOST
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.