Question Comment obtenir l'adresse IP du client en utilisant JavaScript?


J'ai besoin de récupérer en quelque sorte l'adresse IP du client en utilisant JavaScript; pas de code côté serveur, pas même SSI.

Cependant, je ne suis pas contre l'utilisation d'un script / service tiers gratuit.


561
2017-12-24 18:22


origine


Réponses:


Je voudrais utiliser un service Web qui peut retourner JSON (avec jQuery pour rendre les choses plus simples). Ci-dessous sont tous les gratuits actif Les services de recherche IP que j'ai pu trouver et les informations qu'ils renvoient. Si vous en connaissez d'autres, veuillez ajouter un commentaire et je mettrai à jour cette réponse.


DB-IP

Essayez-le:  http://api.db-ip.com/addrinfo?api_key= <votre clé d'api> & addr = <adresse IP>

Résultats:

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

Limites:

  • 2500 demandes par jour
  • Ne prend pas en charge les rappels JSONP
  • Nécessite un paramètre d'adresse IP
  • Nécessite une adresse e-mail pour obtenir votre clé d'API
  • Pas de SSL (https) avec le plan gratuit

Geobytes

Essayez-le:  http://gd.geobytes.com/GetCityDetails

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

Résultats:

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

Limites:

  • 16 384 demandes par heure
  • Pas de SSL (https) avec le plan gratuit
  • Peut retourner le mauvais endroit (je suis à Singapour, pas en Arabie Saoudite)

GeoIPLookup.io

Essayez-le:  https://json.geoiplookup.io/api

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

Résultats:

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

Limites:

  • Inconnu

geoPlugin

Essayez-le:  http://www.geoplugin.net/json.gp

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

Résultats:

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

Limites:

  • 120 demandes par minute
  • Pas de SSL (https) avec le plan gratuit

Hacker Target

Essayez-le:  https://api.hackertarget.com/geoip/?q= <adresse IP>

Résultats:

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

Limites:

  • 50 demandes par jour
  • Ne prend pas en charge les rappels JSONP
  • Nécessite un paramètre d'adresse IP
  • Retourne le texte brut

ipapi.co

Essayez-le:  https://ipapi.co/json/

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

Résultats:

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

Limites:

  • 1 000 demandes par jour
  • Nécessite SSL (https)

IP-API.com

Essayez-le:  http://ip-api.com/json

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

Résultats:

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

Limites:

  • 150 demandes par minute
  • Pas de SSL (https) avec le plan gratuit

Ipdata.co

Essayez-le:  https://api.ipdata.co

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

Résultats:

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

Limites:

  • 1500 demandes par jour
  • Nécessite SSL (https)

IP Trouver

Essayez-le:  https://ipfind.co/me?auth= <votre clé d'api>

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

Résultats:

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

Limites:

  • 300 demandes par jour
  • Nécessite une inscription pour obtenir votre clé d'API

ipgeolocation

Essayez-le:  https://api.ipgeolocation.io/ipgeo?apiKey= <votre clé d'api>

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

Résultats:

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

Limites:

  • 50 000 demandes par mois
  • Nécessite une inscription pour obtenir votre clé d'API

ipify

Essayez-le:  https://api.ipify.org/?format=json

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

Résultats:

{
  "ip": "116.12.250.1"
}

Limites:

  • Aucun

IPInfoDB

Essayez-le:  https://api.ipinfodb.com/v3/ip-city/?key= <votre clé d'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));
});

Résultats:

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

Limites:

  • Deux demandes par seconde
  • Nécessite une inscription pour obtenir votre clé d'API

ipinfo.io

Essayez-le:  https://ipinfo.io/json

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

Résultats:

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

Limites:

  • 1 000 demandes par jour

ipstack (anciennement freegeoip.net)

Essayez-le:  http://api.ipstack.com/ <adresse IP>? access_key =<votre clé d'api>

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

Résultats:

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

Limites:

  • 10 000 demandes par mois
  • Nécessite un paramètre d'adresse IP
  • Nécessite une inscription pour obtenir votre clé d'API
  • Pas de SSL (https) avec le plan gratuit

jsonip.com

Essayez-le:  https://jsonip.com

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

Résultats:

{
  "ip": "116.12.250.1",
  "about": "/about",
  "Pro!": "http://getjsonip.com",
  "reject-fascism": "Liberal America will prevail"
}

Limites:

  • La réponse comprend upsell et la politique

Test JSON

Essayez-le:  http://ip.jsontest.com/

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

Résultats:

{
  "ip": "116.12.250.1"
}

Limites:

  • Pas de SSL (https)
  • Descend beaucoup (hors quota), donc je ne l'utiliserais pas pour la production
  • Renvoie l'adresse IPv6 si vous en avez une, ce qui peut ne pas être ce que vous voulez

Nekudo

Essayez-le:  https://geoip.nekudo.com/api

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

Résultats:

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

Limites:

  • Bloqué par des bloqueurs de publicité utilisant la liste EasyPrivacy

Outils Web stupides

Essayez-le:  http://www.stupidwebtools.com/api/my_ip.json

$.getJSON('http://www.stupidwebtools.com/api/my_ip.json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Résultats:

{
  "my_ip": {
    "ip": "116.12.250.1",
    "others": []
  }
}

Limites:

  • Pas de SSL (https)

Gardez à l'esprit que puisque ce sont tous des services gratuits, votre kilométrage peut varier en termes de dépassement de quota et de temps de fonctionnement, et qui sait quand / si ils seront déconnectés sur la route (pièce A: Telize). La plupart de ces services offrent également un niveau payé au cas où vous voulez plus de fonctionnalités comme le support SSL.

De plus, comme l'a noté skobaljic dans les commentaires ci-dessous, les quotas de demandes sont pour la plupart académiques puisque cela se produit côté client et la plupart des utilisateurs finaux ne dépasseront jamais le quota.

MISES À JOUR


464
2018-02-01 04:40



Mettre à jour: J'ai toujours voulu faire une version min / uglified du code, donc voici un code 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))

Remarque: Ce nouveau code minifié ne retournerait qu'une seule adresse IP si vous voulez toutes les adresses IP de l'utilisateur (ce qui pourrait être plus en fonction de son réseau), utilisez le code original ...


grâce à WebRTC, il est très facile d'obtenir l'adresse IP locale dans les navigateurs pris en charge par WebRTC (du moins pour l'instant). J'ai modifié le code source, réduit les lignes, ne faites aucune demande d'étourdissement puisque vous ne voulez que l'IP locale, pas l'IP publique, le code ci-dessous fonctionne dans Firefox et Chrome, il suffit de lancer l'extrait et de vérifier par vous-même:

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>

ce qui se passe ici, c'est que nous sommes en train de créer une connexion d'homologue fictive, et pour que l'homologue distant nous contacte, nous échangeons généralement des candidats de glace entre nous. Et en lisant les candidats de la glace (à partir de la description de la session locale et onIceCandidateEvent) nous pouvons dire l'adresse IP de l'utilisateur.

où j'ai pris le code de -> La source


203
2017-09-29 10:03



Vous pouvez le relayer via le serveur avec JSONP

Et tout en googler pour en trouver un, l'a trouvé ici sur SO Puis-je effectuer une recherche DNS (nom d'hôte à l'adresse IP) en utilisant Javascript côté 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>

Remarque : L'API telize.com a une permanence fermer au 15 novembre 2015.


177
2018-05-01 07:02



La plupart des réponses ici "contourner" le besoin de code côté serveur en ... Frapper le serveur de quelqu'un d'autre. Ce qui est une technique totalement valable, sauf si vous en fait besoin pour obtenir l'adresse IP sans toucher un serveur.

Traditionnellement, ce n'était pas possible sans une sorte de plugin (et même alors, vous obtiendriez probablement le faux Adresse IP si vous étiez derrière un routeur NAT), mais avec l'avènement de WebRTC, il est effectivement possible de le faire ... Sivous ciblez navigateurs prenant en charge WebRTC (actuellement: Firefox, Chrome et Opera)

S'il vous plaît lire la réponse de mido Pour plus de détails sur la façon dont vous pouvez récupérer des adresses IP client utiles en utilisant WebRTC.


95
2017-12-24 18:25



Vous pouvez faire un appel ajax à hostip.info ou un service similaire ...

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

En prime, les informations de géolocalisation sont renvoyées dans le même appel.


81
2018-03-08 22:21



Essaye ça
$.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);
    });
});

Violon


72
2017-11-13 12:06



Cherchez pas plus loin

Check-out http://www.ipify.org/

Selon eux:

  • Tu peux l'utiliser sans limite (même si vous faites des millions de requêtes par minute)
  • ipify est complètement open source (consultez le GitHub référentiel).

Voici un exemple JS fonctionnel (au lieu de vous demander pourquoi cette réponse a si peu de votes, essayez-la vous-même pour la voir en action):

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

Trop paresseux pour copier / coller? J'aime ça. Voici une démo 

Trop paresseux pour cliquer? :O

Remarque: Désactivez Adblock Plus / uBlock & co avant d'exécuter la démo. Sinon, cela ne fonctionnera pas.

j'ai rien à faire avec l'équipe IPify. Je pense juste qu'il est ridiculement cool que quelqu'un fournisse un tel service pour le bien général.


43
2018-01-14 05:28



Tu ne peux pas. Vous devriez demander à un serveur.


40
2018-04-09 03:09



Vous pouvez utiliser mon service http://ipinfo.io pour cela, qui vous donnera l'adresse IP du client, le nom d'hôte, les informations de géolocalisation et le propriétaire du réseau. Voici un exemple simple qui enregistre l'adresse IP:

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

Voici un exemple plus détaillé de JSFiddle qui imprime également l'information de réponse complète, de sorte que vous pouvez voir tous les détails disponibles: http://jsfiddle.net/zK5FN/2/


24
2017-07-23 10:48



Incluez ce code dans votre page: <script type="text/javascript" src="http://l2.io/ip.js"></script>

plus doc ici


20
2018-06-16 13:56