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

560

Je dois en quelque sorte récupérer 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.

FlySwat
la source

Réponses:

774

J'utiliserais un service Web qui peut renvoyer JSON (avec jQuery pour simplifier les choses). Vous trouverez ci-dessous tous les services de recherche IP actifs gratuits que j'ai pu trouver et les informations qu'ils renvoient. Si vous en savez plus, veuillez ajouter un commentaire et je mettrai à jour cette réponse.


Cloudflare

Essayez-le: 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)
})

Retour:

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

Limites:

  • Renvoie du texte brut

DB-IP

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

Retour:

{
  "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é API
  • Pas de SSL (https) avec le plan gratuit

Géobytes

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

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

Retour:

{
  "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 au 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));
});

Retour:

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

  • 10 000 demandes par heure
  • L'API gratuite permet uniquement une utilisation non commerciale

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

Retour:

{
  "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 requêtes par minute
  • Pas de SSL (https) avec le plan gratuit

Cible de pirate

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

Retour:

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
  • Renvoie du texte brut

ipapi.co

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

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

Retour:

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

  • 1000 demandes par jour
  • SSL requis (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));
});

Retour:

{
  "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 requêtes 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));
});

Retour:

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

  • 1 500 demandes par jour
  • Nécessite une adresse e-mail pour obtenir votre clé API
  • SSL requis (https)

Recherche IP

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

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

Retour:

{
  "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
  • Inscription requise pour obtenir votre clé API

ipgeolocation

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

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

Retour:

{
  "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
  • Inscription requise pour obtenir votre clé 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));
});

Retour:

{
  "ip": "116.12.250.1"
}

Limites:

  • Aucun

IPInfoDB

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

Retour:

{
  "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 requêtes par seconde
  • Inscription requise pour obtenir votre clé API

ipinfo.io

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

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

Retour:

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

  • 1000 demandes par jour

Ipregistry

Essayez-le: https://api.ipregistry.co/?key= < votre clé api >

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

Retour:

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

Limites:

  • Le plan gratuit comprend 100 000 demandes
  • Inscription requise pour obtenir votre clé API

ipstack (anciennement freegeoip.net)

Essayez-le: http://api.ipstack.com/ < adresse ip >? Access_key = <votre clé api>

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

Retour:

{
    "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
  • Inscription requise pour obtenir votre clé 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));
});

Retour:

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

Limites:

  • La réponse comprend la vente incitative

Test JSON

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

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

Retour:

{
  "ip": "116.12.250.1"
}

Limites:

  • Pas de SSL (https)
  • Descend beaucoup (au-dessus du quota), donc je ne l'utiliserais pas pour la production
  • Renvoie l'adresse IPv6 si vous en avez une, qui peut ne pas être celle que vous souhaitez

Nekudo

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

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

Retour:

{
  "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 les bloqueurs de publicités à l'aide de la liste EasyPrivacy

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 disponibilité, et qui sait quand / s'ils seront mis hors ligne sur la route (pièce A: Telize ). La plupart de ces services offrent également un niveau payant au cas où vous souhaiteriez plus de fonctionnalités telles que le support SSL.

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

MISES À JOUR

thdoan
la source
3
@AfolabiOlaoluwaAkinwumi vous pouvez essayer quelque chose comme ceci: $.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. limitations ne signifiant généralement rien: bon point, et peut-être une raison de rester à l'écart de celles qui ont besoin d'une clé api, car l'utilisation de la clé peut être comptée.
Nick Rice
2
@JohnWeisz True, mais si l'OP signifiait simplement qu'ils pouvaient seulement mettre à jour la page et ne rien faire côté serveur (ce qui n'est pas clair d'après la question), alors ces options répondent bien à la question.
Nick Rice
1
@RobWaa merci, j'ai ajouté la limitation du bloqueur de publicités dans la mise à jour 4/14. J'ajouterai geoiplookup.io sous peu.
thdoan
1
Toutes ces réponses reposent sur un service tiers, ce qui est un gros inconvénient, non seulement parce que vous dépendez de la réponse de ce service en temps opportun, mais parce que si ce n'est pas le cas et que vous ne définissez pas de délai d'expiration approprié (qui sera toujours arriver plus tard), vous retarderez le temps de chargement de votre page, ce qui n'est pas bon du tout. Alors, pourquoi ne pas simplement utiliser votre propre serveur pour renvoyer l'IP du client?, Ce qui est BTW une tâche triviale avec n'importe quel langage de programmation.
Daniel J.
280

Mise à jour finale

Cette solution ne fonctionnerait plus car les navigateurs corrigent la fuite de webrtc: pour plus d'informations à ce sujet, lisez cette autre question: RTCIceCandidate ne retourne plus IP


Mise à jour : j'ai toujours voulu faire une version min / uglified du code, voici donc 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 IP si vous voulez toutes les IP de l'utilisateur (qui pourraient être plus en fonction de son réseau), utilisez le code d'origine ...


grâce à WebRTC , il est très facile d'obtenir une adresse IP locale dans les navigateurs pris en charge par WebRTC (au moins pour l'instant). J'ai modifié le code source, réduit les lignes, ne faisant aucune demande d'étourdissement car vous ne voulez que l'IP locale, pas l'IP publique, le code ci-dessous fonctionne dans les derniers Firefox et Chrome, exécutez simplement l'extrait de code et vérifiez 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 créons une connexion factice entre pairs, et pour que le pair distant nous contacte, nous échangeons généralement des candidats de glace entre eux. Et en lisant les candidats de glace (à partir de la description de la session locale et onIceCandidateEvent), nous pouvons dire l'IP de l'utilisateur.

d'où j'ai pris le code -> Source

mido
la source
12
Upvote car de loin la meilleure réponse ici, merci aussi pour le repo génial GitHub!
kano
28
Avertissement: cela ne montre pas votre adresse IP publique, juste celle du réseau local. Vous ne pouvez pas l'utiliser pour détecter un pays d'utilisateurs, par exemple, s'ils sont sur un réseau local
FloatingRock
1
@FloatingRock, vous pouvez également récupérer l'IP publique, en utilisant le serveur STUN (et le configurer lors de la création de l'homologue), puis encore une fois, cela vous obligerait à maintenir / utiliser un serveur STUN, à mettre le code du serveur en image.
mido
10
Ceci est connu sous le nom de fuite WebRTC. Devrait être corrigé par tous les navigateurs du maire, mais ce n'est pas le cas. Plus d'informations ici: privacytools.io/webrtc.html Peut-être lié au navigateur Tor qui fuit votre véritable ip.
Kapitein Witbaard
1
Cependant, j'ai aimé la réponse, le client peut contourner ce processus en désactivant WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr
175

Vous pouvez, en le relayant côté serveur avec JSONP

Et lors de la recherche sur Google, je l'ai trouvé ici sur SO Puis-je effectuer une recherche DNS (nom d'hôte vers 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 été définitivement arrêtée le 15 novembre 2015 .

Chad Grant
la source
45
bien que j'apprécie cet extrait, je pense que le chargement d'un contenu texte JavaScript et l'évaluation que grâce à une fonction est un grave risque pour la sécurité. Et si le contenu de la réponse change et que les 100+ personnes ici qui ont voté pour cette réponse et éventuellement utilisé cet extrait finissent par invoquer une fonction avec un contenu potentiellement non sécurisé. Je n'utiliserais cela que si c'était une chaîne JSON.
auco
32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M
28
Ce n'est pas une bonne réponse car cela implique une requête côté serveur. La question indiquait clairement «javascript pur».
Micah
2
Micah, il n'y a aucun moyen d'obtenir une adresse IP avec du javascript pur. Je vous suggère de faire quelques lectures sur NAT et comment cela fonctionne. Vous avez besoin d'un serveur pour vous renvoyer votre adresse IP Internet
Chad Grant
11
Le service est maintenant en panne.
Cyril N.
109

La plupart des réponses ici "contournent" le besoin de code côté serveur en ... frappant le serveur de quelqu'un d'autre. C'est une technique totalement valable, sauf si vous avez réellement besoin d'obtenir l'adresse IP sans toucher un serveur.

Traditionnellement, cela n'était pas possible sans une sorte de plugin (et même alors, vous obtiendriez probablement la mauvaise adresse IP si vous étiez derrière un routeur NAT), mais avec l'avènement de WebRTC, il est en fait possible de le faire .. . Si vous ciblez les navigateurs qui supportent WebRTC (actuellement: Firefox, Chrome et Opera).

Veuillez lire la réponse de mido pour plus de détails sur la façon de récupérer des adresses IP clientes utiles à l'aide de WebRTC.

Shog9
la source
23
@oscar: cela semble être la même technique (IP visible par le serveur retournée par JSONP) que Tchad mentionne dans sa réponse. Ce qui ne correspond pas à l'exigence du PO "pas de code côté serveur". Mais oui, c'est une façon d'y parvenir si vous ignorez cette exigence.
Shog9
Cette réponse est obsolète à cause de WebRTC: stackoverflow.com/questions/20194722/…
Akam
1
Mis à jour, @Akam. Vous devriez donner à Mido quelques accessoires pour le signaler il y a quelques mois (après des ANNÉES de gens affichant des réponses embarrassantes et erronées qui nécessitaient toujours le support du serveur).
Shog9
WebRTC est-il désormais plus largement pris en charge?!
oldboy
1
Selon ce lien "CanIUse", il s'agit de @BugWhisperer. Sauf si vous avez besoin d'IE.
Shog9
81

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 retournées dans le même appel.

Malte
la source
6
Vous pouvez également obtenir une représentation JSON en utilisant api.hostip.info/get_json.php , puis analyser le JSON avec la fonction de navigateur, jQuery ou Prototype.
Brad Folkens
2
y a-t-il une limite de demande sur " api.hostip.info/get_html.php "? où puis-je voir les détails de cette API
Navin Leon
Il renvoie l'IP du pare-feu réseau. pas l'adresse IP réelle du client. Existe-t-il un moyen d'obtenir l'IP client réel?
Leela Addagulla
76
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

Sridhar R
la source
cela fonctionne $ .get (" ipinfo.io ", function (response) {alert (response.ip);}, "jsonp"); mais comment puis-je stocker la valeur dans une variable? il semble disparaître en dehors de cette boucle de demande get
1
Pour une liste de tous les services de recherche IP gratuits, vous pouvez vous référer à ma réponse pour stackoverflow.com/questions/391979/…
thdoan
Comment envoyer cette fonction pour renvoyer la valeur de l'ip?
Neftali Acosta
67

Tu ne peux pas. Il faudrait demander à un serveur.

SteveShaffer
la source
5
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article.
Himanshu
28
Mais c'est le cas, non? Je veux dire, si la réponse est simplement "non, vous ne pouvez pas", alors je dirais que c'est une réponse plus correcte que celle actuellement surévaluée "ici, utilisez cette application aléatoire", ce qui semble être une réponse dangereuse d'être au haut de la liste.
SteveShaffer
16
OMI C'est la bonne réponse et doit être acceptée. La question dit spécifiquement "pas de code côté serveur".
matthewwithanm
2
@matthewwithanm Je ne pourrais pas être plus d'accord. Je parcourais toutes les réponses pour voir si quelqu'un avait dit exactement cela - et j'étais prêt à l'offrir moi-même comme réponse. Toutes les réponses très appréciées, bien qu'informatives, répondent toutes à une question différente. Citant la question: "Je dois en quelque sorte extraire l'adresse IP du client à l'aide de JavaScript pur; pas de code côté serveur, pas même SSI." Cette réponse est, en fait, la bonne réponse. Le Javascript mis en sandbox par le navigateur ne peut pas faire cela (indépendamment du NAT ou des mandataires). La question doit être modifiée si l'une des autres réponses doit être acceptée.
wally
64

Cherchez pas plus loin

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

Selon eux:

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

Voici un exemple de JS qui fonctionne (au lieu de vous demander pourquoi cette réponse a si peu de votes, essayez 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? Je l'aime. 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 tout simplement pas.

Je n'ai rien à voir avec l'équipe IPify. Je pense simplement que c'est ridiculement cool que quelqu'un fournisse un tel service pour le bien général.

FloatingRock
la source
4
La meilleure partie est que cela vient de "https" alors que mes appels aux assistants IP http seraient bloqués car ils ne sont "pas sécurisés".
Tessa
hé, ça me montre l'erreur CORS, que dois-je faire?
saberprashant
@saberprashant utilisez-vous "HTTPS"?
FloatingRock
@FloatingRock, non j'utilise HTTP
saberprashant
26

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'IP:

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

Voici un exemple JSFiddle plus détaillé qui imprime également les informations de réponse complètes, afin que vous puissiez voir tous les détails disponibles: http://jsfiddle.net/zK5FN/2/

Ben Dowling
la source
Pour éviter les problèmes de stratégie de contenu mixte, http://ipinfo.io//ipinfo.io
passez
Nous voulons utiliser votre service, avez-vous une offre de réduction pour les utilisateurs de Stackoverflow?
Mehdi Dehghani
@MehdiDehghani, nous sommes gratuits jusqu'à 50 000 demandes / mois, pour 100 000 avec un backlink - voir ipinfo.io/contact/creditlink
Ben Dowling
19

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

plus de doc ici

L2.IO
la source
1
Hm. Ça a l'air intéressant ... Y a-t-il des limites?
indapublic
1
bibliothèque hors ligne
riccardo.tasso
Il existe un certain degré de pop-ups de spam associés à la référence l2.io : hybrid-analysis.com/sample/… permet l'incorporation de liens comme dans l'exemple 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

Je dirais que le Tchad et Malte ont une excellente réponse. Cependant, les leurs sont compliqués. Je suggère donc ce code que j'ai trouvé à partir d'annonces par plugin de pays

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

Pas d'ajax. Juste des javascripts simples. :RÉ

Si vous allez sur http://j.maxmind.com/app/geoip.js, vous verrez qu'il contient

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

Cela ne répond pas encore vraiment à la question car

http://j.maxmind.com/app/geoip.js ne contient pas l'IP (bien que je parie qu'il utilise l'IP pour obtenir le pays).

Mais il est si facile de créer un script PhP qui ressemble à quelque chose

function visitorsIP()   { return '123.123.123.123'; }

Fais ça. Mettez sur http://yourdomain.com/yourip.php .

Alors fais

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

La question mentionne spécifiquement de NE PAS utiliser de script tiers. Il n'y a pas d'autre moyen. Javascript ne peut pas connaître votre IP. Mais d'autres serveurs accessibles via javascript peuvent également fonctionner sans problème.

user4951
la source
7
charger un JavaScript à partir d'un serveur distant et appeler des fonctions avec un contenu inconnu me semble être un énorme risque pour la sécurité (et si le contenu de la fonction change?). Je préfère analyser une réponse JSON.
auco
3
Erreur 404: objet introuvable
trejder
Cela fait très longtemps., La réponse est assez fausse en fait. Je ne savais pas que javascript ne pouvait pas connaître l'IP.
user4951
oh c'est correct la fonction visiteursIP n'est pas censé être un code php. C'est un code javacript généré par du code php
user4951
vous pouvez simplement utiliser votre propre serveur pour imprimer un code javascript qui attribue l'ip des visiteurs.
user4951
15

Il y a deux interprétations à cette question. La plupart des gens ont interprété «IP client» comme signifiant l'adresse IP publique que le serveur Web voit en dehors du LAN et sur Internet. Ce n'est pas l'adresse IP de l'ordinateur client dans la plupart des cas, bien que

J'avais besoin de la véritable adresse IP de l'ordinateur qui exécute le navigateur qui héberge mon logiciel JavaScript (qui est presque toujours une adresse IP locale sur un LAN qui se trouve derrière quelque chose de cette couche NAT).

Mido a posté une réponse FANTASTIQUE, ci-dessus, qui semble être la seule réponse qui a vraiment fourni l'adresse IP du client.

Merci pour ça, Mido!

Cependant, la fonction présentée s'exécute de manière asynchrone. J'ai besoin d'utiliser réellement l'adresse IP dans mon code, et avec une solution asynchrone, je pourrais essayer d'utiliser l'adresse IP avant qu'elle ne soit récupérée / apprise / stockée. Je devais pouvoir attendre les résultats pour arriver avant de les utiliser.

Voici une version "en attente" de la fonction de Mido. J'espère que cela aide quelqu'un d'autre:

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>

BRebey
la source
14

Il existe une approche plus facile et gratuite qui ne demandera aucune autorisation à votre visiteur.

Elle consiste à soumettre une simple requête Ajax POST à http://freegeoip.net/json . Une fois que vous recevez vos informations de localisation, dans JSON, vous réagissez en conséquence en mettant à jour la page ou en la redirigeant vers une nouvelle.

Voici comment vous soumettez votre demande d'informations sur l'emplacement:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );
Jijo Paulose
la source
Il semble qu'ils aient fermé le 1er juillet 2018
Nithin PH
13

Eh bien, je m'éloigne de la question, mais j'avais un besoin similaire aujourd'hui et même si je n'ai pas pu trouver l'ID du client en utilisant Javascript, j'ai fait ce qui suit.

Côté serveur: -

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

Utiliser Javascript

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

J'utilise ASP.Net Ajax, mais vous pouvez utiliser getElementById au lieu de $ get ().

Ce qui se passe, c'est que j'ai un élément div caché sur la page avec l'IP de l'utilisateur rendue depuis le serveur. Que dans Javascript, je charge juste cette valeur.

Cela pourrait être utile à certaines personnes ayant une exigence similaire à la vôtre (comme moi alors que je n'avais pas compris cela).

À votre santé!

Cyril Gupta
la source
20
-1: L'OP mentionne spécifiquement "pas de code côté serveur", mais vous utilisez du C #.
Bruno Reis
8
Ne serait-il pas préférable de simplement produire <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines
en dehors de l'utilisation du code côté serveur, il ne faut jamais utiliser le DOM pour stocker des données. C'est tout simplement mauvais partout. Hainesy a une meilleure idée de simplement assigner à JS var.
coblr
13

En utilisant l'API Geo-IP Smart-IP.net . Par exemple, en utilisant jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});
Mikhus
la source
15
"Service temporaire non disponible".
Iago
a écrit une simple api [ geoip.immanuel.co/myip] pour obtenir l'adresse IP du client, SSL activé et aucune limite
Immanuel
12

Pas possible en général sauf si vous utilisez une sorte de service externe.

Eugene Lazutkin
la source
En effet, cela est possible en utilisant Javascript en s'appuyant sur un service tiers tel que Ipregistry (avertissement: je lance le service): ipregistry.co/docs/getting-location-from-ip-address#javascript Vous pouvez obtenir l'adresse IP et de nombreuses informations connexes, y compris des données sur les menaces, le tout en un seul appel.
Laurent
9

Obtenez votre IP avec jQuery

vous pouvez obtenir votre adresse IP publique avec une seule ligne de JS? Il y a un service gratuit qui vous offre cela et une demande d'obtention est tout ce que vous devez faire:

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

Pour que l'extrait ci-dessus fonctionne, votre navigateur devra prendre en charge CORS (partage de demande d'origine croisée). Sinon, une exception de sécurité serait levée. Dans les navigateurs plus anciens, vous pouvez utiliser cette version, qui utilise une requête JSON-P:

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

Vous pouvez utiliser la bibliothèque 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
});

Vous pouvez également utiliser requirejs pour charger le script.

Il vous donnera l'adresse IP de votre visiteur, ainsi que quelques données sur sa localisation (pays, ville, etc.). Il est basé sur la base de données geoip maxmind.

Avertissement: j'ai écrit cette bibliothèque

Vincent Durmont
la source
8

Javascript / jQuery obtient l'adresse IP et l'emplacement du client (pays, ville)

Il vous suffit d'intégrer une balise avec un lien "src" au serveur. Le serveur renverra "codehelper_ip" en tant qu'objet / JSON, et vous pouvez l'utiliser immédiatement.

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

Plus d'informations sur Javascript Detect Real IP Address Plus Country

Si vous utilisez jQUery, vous pouvez essayer:

console.log(codehelper_ip); 

Il vous montrera plus d'informations sur l'objet retourné.

Si vous souhaitez une fonction de rappel, veuillez essayer ceci:

// 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>
Ken Le
la source
1
n'utilisez pas d' languageattribut, utilisez type="text/javascript"plutôt, plus sur MDN
Alex K
comme @Alex déjà mentionné, le langage est obsolète et n'est utilisé que dans le code hérité. Utilisez plutôt 'type = "text / javascript"' pour une compatibilité maximale.
Gautham C.
1
juste FYI - le champ type n'est pas nécessaire pour HTML5 (JS est la valeur par défaut). w3schools.com/tags/att_script_type.asp
pmont
Au cas où vous auriez manqué ces autres commentaires, vous devriez utiliser le type au lieu de la langue
Mike
8

Le service de rappel Appspot.com n'est pas disponible. ipinfo.io semble fonctionner.

J'ai fait une étape supplémentaire et récupéré toutes les informations géographiques à l'aide d'AngularJS. (Merci à Ricardo) Vérifiez-le.

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

Page de travail ici: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

Yamenator
la source
8

Si vous incluez toujours un fichier, vous pouvez faire un simple ajax get:

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

Et ce ajax.getIp.phpserait:

<?=$_SERVER['REMOTE_ADDR']?>
Martijn
la source
8

J'aime beaucoup api.ipify.orgcar il prend en charge HTTP et HTTPS.

Voici quelques exemples d'obtention de l'IP à l' api.ipify.orgaide de jQuery.

Format JSON sur 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>

Format JSON sur 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>

Format de texte sur HTTPS

Si vous ne le voulez pas en JSON, il y a aussi une réponse en clair sur HTTPS

https://api.ipify.org

Format de texte sur HTTP

Et il y a aussi une réponse en clair sur HTTP

http://api.ipify.org
Tim Penner
la source
8

Utilisez ipdata.co .

L'API fournit également des données de géolocalisation et dispose de 10 points de terminaison mondiaux capables chacun de gérer> 800 millions de demandes par jour!

Cette réponse utilise une clé API «test» très limitée et destinée uniquement à tester quelques appels. Inscrivez -vous à votre propre clé API gratuite et recevez jusqu'à 1500 demandes par jour pour le développement.

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

Jonathan
la source
7

Il n'y a pas vraiment de moyen fiable d'obtenir l'adresse IP de l'ordinateur client.

Cela passe par certaines des possibilités. Le code qui utilise Java se cassera si l'utilisateur a plusieurs interfaces.

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

En regardant les autres réponses ici, il semble que vous souhaitiez obtenir l'adresse IP publique du client, qui est probablement l'adresse du routeur qu'ils utilisent pour se connecter à Internet. Beaucoup d'autres réponses ici en parlent. Je recommanderais de créer et d'héberger votre propre page côté serveur pour recevoir la demande et répondre avec l'adresse IP au lieu de dépendre du service de quelqu'un d'autre qui peut ou non continuer à fonctionner.

Sarel Botha
la source
7

Je vais proposer une méthode que j'utilise beaucoup lorsque je veux stocker des informations dans la page html, et que mon javascript lise les informations sans avoir à passer de paramètres au javascript. Cela est particulièrement utile lorsque votre script est référencé en externe, plutôt qu'en ligne.

Cependant, il ne répond pas au critère "pas de script côté serveur". Mais si vous pouvez inclure des scripts côté serveur dans votre html, procédez comme suit:

Créez des éléments d'étiquette cachés au bas de votre page html, juste au-dessus de la balise de fin de corps.

Votre étiquette ressemblera à ceci:

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

Assurez-vous de créer une classe appelée hiddenlabelet de définirvisibility:hidden pour que personne ne voie réellement l'étiquette. Vous pouvez stocker de nombreuses choses de cette façon, dans des étiquettes cachées.

Maintenant, dans votre javascript, pour récupérer les informations stockées dans l'étiquette (dans ce cas l'adresse IP du client), vous pouvez le faire:

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

Maintenant, votre variable "ip" est égale à l'adresse ip. Vous pouvez maintenant transmettre l'ip à votre demande d'API.

* MODIFIER 2 ANS PLUS TARD * Deux améliorations mineures:

J'utilise régulièrement cette méthode, mais j'appelle l'étiquette class="data" , car, en fait, c'est un moyen de stocker des données. Le nom de classe "hiddenlabel" est une sorte de nom stupide.

La deuxième modification se trouve dans la feuille de style, au lieu de visibility:hidden:

.data{
    display:none;
}

... est la meilleure façon de le faire.

TARKUS
la source
3
Ne stockez pas de données dans le DOM. Pourquoi voudrait-on suggérer cela, même 2 ans plus tard? Si vous pouvez injecter quoi que ce soit dans le fichier HTML, injectez simplement cette valeur dans une variable JS comme ceci. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script>. Au moins, les lecteurs d'écran le manqueront et aucun getElementById ou $ ('# stupidname') requis.
coblr
@fractalspawn, Pour la raison que vous ne pouvez pas insérer de code php dans un fichier .js. Vous n'y avez pas pensé, avez-vous un pantalon chic! ;)
TARKUS
Eh bien, vous pourriez le faire si vous aviez <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script> mais je ne sais pas pourquoi vous le feriez non plus. Mon point est que si PHP peut insérer quoi que ce soit dans le HTML qu'il rend, la meilleure pratique serait de lui faire insérer une valeur dans une variable JS dans une balise de script en ligne, plutôt que dans un élément DOM que vous auriez alors à analyser afin de pouvoir l'utiliser, et pourrait potentiellement être lu par les lecteurs d'écran, sauf si vous avez pris des mesures supplémentaires pour l'empêcher.
coblr
Il n'y a absolument aucune bonne raison pour laquelle vous ne pouvez pas ou ne devriez pas ajouter d'éléments contenant des données au DOM, et il y a de nombreuses bonnes raisons de le faire. En fait, ces raisons sont dans ma réponse, si vous voulez bien la relire. Il est fiable, facile à contrôler et particulièrement utile lorsque votre fichier javascript apparaît sur un site distant. En parlant de script distant, votre exemple de "javascript.php" est une idée horrible, et ne fonctionnerait probablement pas de toute façon. Pensez en termes de scripts distants, tels que DISQUS.
TARKUS
3
Pour votre autre commentaire sur les raisons pour lesquelles le stockage de données DOM est mauvais .. eh bien, vous pouvez toujours arrêter une voiture en frappant doucement un mur à votre destination, mais il existe de meilleurs outils pour le travail maintenant. Nous savons maintenant mieux et avons d'excellents cadres pour y remédier. J'ai travaillé dans un endroit où le DOM n'était qu'un énorme fichier de configuration pour le JS, et c'était un cauchemar lorsqu'il a été redessiné. Si vous pensez que l'utilisation de <script src = "something.php"> est un "hack grossier", mais que le stockage de données dans le DOM qui n'a de valeur qu'à l'intérieur de Javascript ne l'est pas, alors je suis vraiment content que nous ne travaillions pas ensemble et seront de nouveau d'accord avec plaisir pour être en désaccord. :)
coblr
6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });
Atif Hussain
la source
6

Tout d'abord, la vraie réponse : il n'est pas possible d'utiliser du code exécuté purement côté client pour trouver votre propre adresse IP.

Cependant, vous pouvez simplement faire un GET vers https://api.muctool.de/whois et recevoir quelque chose comme pour obtenir l'adresse IP d'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
}
Alex
la source
5

Vous pouvez le faire entièrement côté client et principalement en JavaScript en utilisant un objet Flash que les js peuvent appeler. Flash peut accéder à l'adresse IP de la machine locale qui peut ne pas être très utile.

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

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

data.hostest l'adresse IP. Appelez simplement cela depuis votre navigateur.

http://smart-ip.net/geoip-json?callback=? [Sans guillemets] et obtenez l'ip.

Jawwad Ahmed
la source
désolé, que signifie $ en javascript?
GHOST