Wie erhalte ich die IP-Adresse des Kunden mit JavaScript?

560

Ich muss irgendwie die IP-Adresse des Clients mit JavaScript abrufen. Kein serverseitiger Code, nicht einmal SSI.

Ich bin jedoch nicht gegen die Verwendung eines kostenlosen Skripts / Dienstes von Drittanbietern.

FlySwat
quelle

Antworten:

772

Ich würde einen Webdienst verwenden, der JSON zurückgeben kann (zusammen mit jQuery, um die Dinge einfacher zu machen). Nachfolgend finden Sie alle kostenlosen aktiven IP-Suchdienste, die ich finden konnte, und die Informationen, die sie zurückgeben. Wenn Sie mehr wissen, fügen Sie bitte einen Kommentar hinzu und ich werde diese Antwort aktualisieren.


Cloudflare

Probieren Sie es aus: 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)
})

Kehrt zurück:

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

Einschränkungen:

  • Gibt einfachen Text zurück

DB-IP

Probieren Sie es aus: http://api.db-ip.com/addrinfo?api_key= < Ihr API-Schlüssel > & addr = < IP-Adresse >

Kehrt zurück:

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

Einschränkungen:

  • 2.500 Anfragen pro Tag
  • Unterstützt keine JSONP-Rückrufe
  • Erfordert IP-Adressparameter
  • Benötigt eine E-Mail-Adresse, um Ihren API-Schlüssel zu erhalten
  • Kein SSL (https) mit dem kostenlosen Plan

Geobyten

Probieren Sie es aus: http://gd.geobytes.com/GetCityDetails

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

Kehrt zurück:

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

Einschränkungen:

  • 16.384 Anfragen pro Stunde
  • Kein SSL (https) mit dem kostenlosen Plan
  • Kann den falschen Ort zurückgeben (ich bin in Singapur, nicht in Saudi-Arabien)

GeoIPLookup.io

Probieren Sie es aus: https://json.geoiplookup.io/api

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

Kehrt zurück:

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

Einschränkungen:

  • 10.000 Anfragen pro Stunde
  • Die kostenlose API erlaubt nur die nichtkommerzielle Nutzung

geoPlugin

Probieren Sie es aus: http://www.geoplugin.net/json.gp

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

Kehrt zurück:

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

Einschränkungen:

  • 120 Anfragen pro Minute
  • Kein SSL (https) mit dem kostenlosen Plan

Hacker-Ziel

Probieren Sie es aus: https://api.hackertarget.com/geoip/?q= < IP-Adresse >

Kehrt zurück:

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

Einschränkungen:

  • 50 Anfragen pro Tag
  • Unterstützt keine JSONP-Rückrufe
  • Erfordert IP-Adressparameter
  • Gibt einfachen Text zurück

ipapi.co

Probieren Sie es aus: https://ipapi.co/json/

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

Kehrt zurück:

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

Einschränkungen:

  • 1.000 Anfragen pro Tag
  • Benötigt SSL (https)

IP-API.com

Probieren Sie es aus: http://ip-api.com/json

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

Kehrt zurück:

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

Einschränkungen:

  • 150 Anfragen pro Minute
  • Kein SSL (https) mit dem kostenlosen Plan

Ipdata.co

Probieren Sie es aus: https://api.ipdata.co

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

Kehrt zurück:

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

Einschränkungen:

  • 1.500 Anfragen pro Tag
  • Benötigt eine E-Mail-Adresse, um Ihren API-Schlüssel zu erhalten
  • Benötigt SSL (https)

IP-Suche

Probieren Sie es aus: https://ipfind.co/me?auth= < Ihr API-Schlüssel >

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

Kehrt zurück:

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

Einschränkungen:

  • 300 Anfragen pro Tag
  • Erfordert eine Registrierung, um Ihren API-Schlüssel zu erhalten

ipgeolocation

Probieren Sie es aus: https://api.ipgeolocation.io/ipgeo?apiKey= < Ihr API-Schlüssel >

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

Kehrt zurück:

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

Einschränkungen:

  • 50.000 Anfragen pro Monat
  • Erfordert eine Registrierung, um Ihren API-Schlüssel zu erhalten

ipify

Probieren Sie es aus: https://api.ipify.org/?format=json

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

Kehrt zurück:

{
  "ip": "116.12.250.1"
}

Einschränkungen:

  • Keiner

IPInfoDB

Probieren Sie es aus: https://api.ipinfodb.com/v3/ip-city/?key= < Ihr API-Schlüssel > & 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));
});

Kehrt zurück:

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

Einschränkungen:

  • Zwei Anfragen pro Sekunde
  • Erfordert eine Registrierung, um Ihren API-Schlüssel zu erhalten

ipinfo.io

Probieren Sie es aus: https://ipinfo.io/json

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

Kehrt zurück:

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

Einschränkungen:

  • 1.000 Anfragen pro Tag

Ipregistry

Probieren Sie es aus: https://api.ipregistry.co/?key= < Ihr API-Schlüssel >

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

Kehrt zurück:

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

Einschränkungen:

  • Der kostenlose Plan enthält 100.000 Anfragen
  • Erfordert eine Registrierung, um Ihren API-Schlüssel zu erhalten

ipstack (früher freegeoip.net)

Probieren Sie es aus: http://api.ipstack.com/ < IP-Adresse >? Access_key = <Ihr API-Schlüssel>

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

Kehrt zurück:

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

Einschränkungen:

  • 10.000 Anfragen pro Monat
  • Erfordert IP-Adressparameter
  • Erfordert eine Registrierung, um Ihren API-Schlüssel zu erhalten
  • Kein SSL (https) mit dem kostenlosen Plan

jsonip.com

Probieren Sie es aus: https://jsonip.com

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

Kehrt zurück:

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

Einschränkungen:

  • Die Antwort beinhaltet Upsell

JSON-Test

Probieren Sie es aus: http://ip.jsontest.com/

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

Kehrt zurück:

{
  "ip": "116.12.250.1"
}

Einschränkungen:

  • Kein SSL (https)
  • Geht viel runter (über Quote), also würde ich es nicht für die Produktion verwenden
  • Gibt die IPv6-Adresse zurück, wenn Sie eine haben, die möglicherweise nicht Ihren Wünschen entspricht

Nekudo

Probieren Sie es aus: https://geoip.nekudo.com/api

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

Kehrt zurück:

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

Einschränkungen:

  • Von Werbeblockern mithilfe der EasyPrivacy-Liste blockiert

Da dies alles kostenlose Dienste sind, kann Ihr Kilometerstand in Bezug auf die Überschreitung von Kontingent und Betriebszeit variieren und wer weiß, wann / ob sie später offline geschaltet werden (Exponat A: Telize ). Die meisten dieser Dienste bieten auch eine kostenpflichtige Stufe, falls Sie weitere Funktionen wie SSL-Unterstützung wünschen.

Wie skobaljic in den Kommentaren unten feststellte, sind die Anforderungsquoten größtenteils akademisch, da dies clientseitig geschieht und die meisten Endbenutzer das Kontingent niemals überschreiten.

AKTUALISIERUNG

thdoan
quelle
3
@AfolabiOlaoluwaAkinwumi können Sie so etwas versuchen: $.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. Einschränkungen in der Regel bedeuten nichts: Guten Punkt, und vielleicht einen Grund , von denen zu bleiben weg , die einen API - Schlüssel benötigen, weil Verwendung des Schlüssels kann gezählt werden.
Nick Rice
2
@JohnWeisz Stimmt, aber wenn das OP einfach bedeutete, dass sie nur die Seite aktualisieren und nichts serverseitiges tun konnten (unklar aus der Frage), dann beantworten diese Optionen die Frage gut.
Nick Rice
1
@RobWaa danke, ich habe die Werbeblocker-Beschränkung im 4/14-Update hinzugefügt. Ich werde in Kürze geoiplookup.io hinzufügen.
thdoan
1
Alle diese Antworten basieren auf einem Drittanbieter-Service. Dies ist ein großer Nachteil, nicht nur, weil Sie darauf angewiesen sind, dass dieser Service rechtzeitig reagiert, sondern auch, wenn dies nicht der Fall ist und Sie kein angemessenes Zeitlimit festlegen (was immer der Fall sein wird) Wenn Sie später als später auftreten, verzögern Sie die Ladezeit Ihrer Seite, was überhaupt nicht gut ist. Warum also nicht einfach Ihren eigenen Server verwenden, um die IP des Clients zurückzugeben? Dies ist übrigens eine triviale Aufgabe mit jeder Programmiersprache.
Daniel J.
280

Letztes Update

Diese Lösung würde nicht mehr funktionieren, da Browser das Webrtc-Leck beheben: Weitere Informationen hierzu finden Sie in der folgenden Frage: RTCIceCandidate gibt keine IP mehr zurück


Update : Ich wollte immer eine min / uglified-Version des Codes erstellen, daher hier ein ES6-Promise-Code:

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

Hinweis: Dieser neue minimierte Code gibt nur eine einzige IP zurück, wenn Sie alle IPs des Benutzers (die möglicherweise mehr von seinem Netzwerk abhängen) verwenden möchten. Verwenden Sie den Originalcode ...


Dank WebRTC ist es sehr einfach, lokale IP-Adressen in von WebRTC unterstützten Browsern abzurufen (zumindest vorerst). Ich habe den Quellcode geändert, die Zeilen reduziert und keine Betäubungsanforderungen gestellt, da Sie nur die lokale IP und nicht die öffentliche IP möchten. Der folgende Code funktioniert in den neuesten Versionen von Firefox und Chrome. Führen Sie einfach das Snippet aus und überprüfen Sie es selbst:

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>

Was hier passiert, ist, dass wir eine Dummy-Peer-Verbindung herstellen und dass der Remote-Peer uns kontaktiert, tauschen wir im Allgemeinen Eiskandidaten miteinander aus. Beim Lesen der Eiskandidaten (aus der lokalen Sitzungsbeschreibung und onIceCandidateEvent) können wir die IP des Benutzers ermitteln.

wo ich Code von -> Quelle genommen habe

mido
quelle
12
Upvote, weil hier zweifellos die beste Antwort ist, auch danke für das großartige GitHub-Repo!
Kano
28
Warnung: Hier wird nicht Ihre öffentliche IP angezeigt, sondern nur die des lokalen Netzwerks. Sie können es nicht zum Erkennen eines Benutzerlandes verwenden, wenn es sich beispielsweise in einem LAN befindet
FloatingRock
1
@FloatingRock Sie können auch öffentliche IP-Adressen mithilfe des STUN-Servers abrufen (und diese beim Erstellen des Peers konfigurieren). Dann müssten Sie einen STUN-Server warten / verwenden und den Servercode ins Bild bringen.
Mitte
10
Dies ist als WebRTC-Leck bekannt. Sollte von allen Bürgermeister-Browsern behoben werden, ist es aber nicht. Weitere Informationen hier: privacytools.io/webrtc.html Möglicherweise im Zusammenhang mit dem Tor-Browser, der Ihre echte IP- Adresse verliert .
Kapitein Witbaard
1
Obwohl mir die Antwort gefallen hat, kann der Client diesen Prozess umgehen,
ni8mr
175

Sie können es über die Serverseite mit JSONP weiterleiten

Und während ich googelte, um eine zu finden, fand ich sie hier auf SO Kann ich eine DNS-Suche (Hostname zu IP-Adresse) mit clientseitigem Javascript durchführen?

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

Hinweis: Die telize.com-API wurde zum 15. November 2015 endgültig heruntergefahren .

Chad Grant
quelle
45
Obwohl ich dieses Snippet sehr schätze, denke ich, dass das Laden eines JavaScript-Textinhalts und die Bewertung durch eine Funktion ein schwerwiegendes Sicherheitsrisiko darstellt. Was passiert, wenn sich der Inhalt der Antwort ändert und alle über 100 Personen hier, die diese Antwort gewählt und möglicherweise dieses Snippet verwendet haben, eine Funktion mit möglicherweise unsicherem Inhalt aufrufen? Ich würde dies nur verwenden, wenn es eine JSON-Zeichenfolge wäre.
Auco
32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M
28
Dies ist keine gute Antwort, da es sich um eine serverseitige Anforderung handelt. In der Frage stand eindeutig "reines Javascript".
Micah
2
Micah, es gibt keine Möglichkeit, eine IP-Adresse mit reinem Javascript zu erhalten. Ich schlage vor, Sie lesen etwas über NAT und wie das funktioniert. Sie benötigen einen Server, um Ihre Internet-IP-Adresse an Sie zurückzusenden
Chad Grant
11
Der Dienst ist jetzt nicht verfügbar.
Cyril N.
109

Die meisten Antworten hier "umgehen" die Notwendigkeit von serverseitigem Code, indem sie ... den Server eines anderen treffen. Dies ist eine absolut gültige Technik, es sei denn, Sie müssen die IP-Adresse tatsächlich abrufen , ohne einen Server zu treffen.

Traditionell war dies ohne ein Plugin nicht möglich (und selbst dann würden Sie wahrscheinlich die falsche IP-Adresse erhalten, wenn Sie sich hinter einem NAT-Router befinden), aber mit dem Aufkommen von WebRTC ist dies tatsächlich möglich. . Wenn Sie Targeting - Browser , dass die Unterstützung WebRTC (aktuell: Firefox, Chrome und Opera).

Bitte lesen Sie die Antwort von mido, um zu erfahren, wie Sie nützliche Web- IP-Adressen mit WebRTC abrufen können.

Shog9
quelle
23
@oscar: Dies scheint die gleiche Technik zu sein (JSONP-zurückgegebene Server-sichtbare IP), die Chad in seiner Antwort erwähnt hat. Dies entspricht nicht der Anforderung des OP "kein serverseitiger Code". Aber ja, das ist eine Möglichkeit, dies zu erreichen, wenn Sie diese Anforderung ignorieren.
Shog9
Diese Antwort ist wegen WebRTC veraltet: stackoverflow.com/questions/20194722/…
Akam
1
Aktualisiert, @Akam. Sie sollten mido einige Requisiten geben, um darauf vor ein paar Monaten hinzuweisen (nach JAHREN von Leuten, die peinlich falsche Antworten veröffentlicht haben, für die noch Serverunterstützung erforderlich war).
Shog9
Wird WebRTC jetzt stärker unterstützt?!
Oldboy
1
Laut diesem "CanIUse" -Link ist es @BugWhisperer. Es sei denn, Sie benötigen IE.
Shog9
81

Sie können einen Ajax-Aufruf an hostip.info oder einen ähnlichen Dienst senden ...

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

Als Bonus werden Geolokalisierungsinformationen im selben Anruf zurückgegeben.

Malta
quelle
6
Sie können eine JSON-Darstellung auch mit api.hostip.info/get_json.php abrufen und dann den JSON mit der Browserfunktion jQuery oder Prototype analysieren.
Brad Folkens
2
Gibt es ein Anforderungslimit für " api.hostip.info/get_html.php "? Wo kann ich diese API-Details sehen
Navin Leon
Es gibt die IP der Netzwerk-Firewall zurück. nicht die tatsächliche Client-IP. Gibt es eine Möglichkeit, die tatsächliche Client-IP zu ermitteln?
Leela Addagulla
76
Versuche dies
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

ODER

$(document).ready(function () {
    $.getJSON("http://jsonip.com/?callback=?", function (data) {
        console.log(data);
        alert(data.ip);
    });
});

Geige

Sridhar R.
quelle
das funktioniert $ .get (" ipinfo.io ", function (response) {alert (response.ip);}, "jsonp"); aber wie speichere ich den Wert in einer Variablen? es scheint außerhalb dieser get request Schleife zu verschwinden
1
Eine Liste aller kostenlosen IP- Suchdienste finden
Uhr
Wie sende ich diese Funktion, um den Wert der IP zurückzugeben?
Neftali Acosta
67

Das kannst du nicht. Sie müssten einen Server fragen.

SteveShaffer
quelle
5
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Himanshu
28
Aber das tut es irgendwie, oder? Ich meine, wenn die Antwort nur "Nein, du kannst nicht" ist, dann würde ich behaupten, dass dies eine korrektere Antwort ist als die derzeit hochgestufte "hier benutze diese zufällige Appspot-App", was wie eine gefährliche Antwort auf die Frage zu sein scheint Oben auf der Liste.
SteveShaffer
16
IMO Dies ist die richtige Antwort und sollte akzeptiert werden. Die Frage lautet speziell "kein serverseitiger Code".
Matthewwithanm
2
@matthewwithanm Ich könnte nicht mehr zustimmen. Ich blätterte durch alle Antworten, um zu sehen, ob jemand genau das gesagt hatte - und war bereit, es selbst als Antwort anzubieten. Alle hoch bewerteten Antworten sind zwar informativ, beantworten jedoch eine andere Frage. Zitat der Frage: "Ich muss die IP-Adresse des Clients irgendwie mit reinem JavaScript abrufen; kein serverseitiger Code, nicht einmal SSI." Diese Antwort ist tatsächlich die richtige Antwort. Browser-Sandbox-Javascript kann dies nicht (unabhängig von NAT oder Proxys). Die Frage sollte geändert werden, wenn eine der anderen Antworten akzeptiert werden soll.
Wally
64

Suchen Sie nicht weiter

Überprüfen Sie http://www.ipify.org/

Nach ihnen:

  • Sie können es unbegrenzt verwenden (selbst wenn Sie Millionen von Anfragen pro Minute ausführen).
  • ipify ist vollständig Open Source (siehe GitHub-Repository ).

Hier ist ein funktionierendes JS-Beispiel (anstatt sich zu fragen, warum diese Antwort so wenige Stimmen hat, versuchen Sie es selbst, um sie in Aktion zu sehen):

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

Zu faul zum Kopieren / Einfügen? Ich mag das. Hier ist eine 💻 Demo

Zu faul zum Klicken? :O

Hinweis : Schalten Sie Adblock Plus / uBlock & Co aus, bevor Sie die Demo ausführen. Andernfalls funktioniert es einfach nicht.

Ich habe nichts mit dem IPify-Team zu tun. Ich finde es einfach lächerlich cool, dass jemand einen solchen Service für das Allgemeinwohl anbietet.

FloatingRock
quelle
4
Das Beste daran ist, dass dies von "https" kommt, während meine Anrufe an http IP-Helfer blockiert werden, weil sie "nicht sicher" sind.
Tessa
Hey, es zeigt mir den CORS-Fehler. Was soll ich tun?
Säbelprashant
@saberprashant benutzt du "HTTPS"?
FloatingRock
@FloatingRock, nein, ich benutze HTTP
Säbelprashant
26

Sie können hierfür meinen Dienst http://ipinfo.io verwenden , der Ihnen die Client-IP, den Hostnamen, die Geolocation-Informationen und den Netzwerkbesitzer angibt. Hier ist ein einfaches Beispiel, das die IP protokolliert:

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

Hier ist ein detaillierteres JSFiddle-Beispiel, in dem auch die vollständigen Antwortinformationen ausgedruckt werden, sodass Sie alle verfügbaren Details sehen können: http://jsfiddle.net/zK5FN/2/

Ben Dowling
quelle
Um die Probleme mit Richtlinien für gemischten Inhalt zu vermeiden, ändern Sie http://ipinfo.iozu //ipinfo.iooder https
Samuel Elh
Wir möchten Ihren Service nutzen. Haben Sie ein Rabattangebot für Stackoverflow-Benutzer?
Mehdi Dehghani
@MehdiDehghani wir sind frei für bis zu 50.000 Anfragen / Monat, für 100.000 mit einem Backlink - siehe ipinfo.io/contact/creditlink
Ben Dowling
19

Fügen Sie diesen Code in Ihre Seite ein: <script type="text/javascript" src="http://l2.io/ip.js"></script>

mehr doc hier

L2.IO
quelle
1
Hm. Es sieht interessant aus ... Haben sie Grenzen?
Indapublic
1
Bibliothek offline
riccardo.tasso
Mit l2.io ref ist ein gewisses Maß an Spam-Popups verbunden. Ref: hybrid-analysis.com/sample/… ermöglicht das Einbetten von Links wie im Beispiel 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

Ich würde sagen, Tschad und Malta haben eine großartige Antwort. Ihre sind jedoch kompliziert. Daher schlage ich diesen Code vor, den ich aus Anzeigen nach Länder-Plugins gefunden habe

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

Kein Ajax. Einfach nur Javascripts. : D.

Wenn Sie zu http://j.maxmind.com/app/geoip.js gehen, werden Sie sehen, dass es enthält

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

Es beantwortet die Frage noch nicht wirklich, weil

http://j.maxmind.com/app/geoip.js enthält keine IP (obwohl ich wette, dass es die IP verwendet, um das Land zu erhalten).

Aber es ist so einfach, ein PhP-Skript zu erstellen, das so etwas wie Pop enthält

function visitorsIP()   { return '123.123.123.123'; }

Das machen. Setzen Sie auf http://yourdomain.com/yourip.php .

Dann mach

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

In der Frage wird ausdrücklich erwähnt, dass KEIN Skript von Drittanbietern verwendet werden darf. Es geht nicht anders. Javascript kann Ihre IP nicht kennen. Aber auch andere Server, auf die über Javascript zugegriffen werden kann, funktionieren problemlos.

user4951
quelle
7
Das Laden eines JavaScript von einem Remote-Server und das Aufrufen von Funktionen mit unbekanntem Inhalt scheint mir ein großes Sicherheitsrisiko zu sein (was ist, wenn sich der Funktionsinhalt ändert?). Ich würde lieber eine JSON-Antwort analysieren.
Auco
3
Fehler 404: Objekt nicht gefunden
Trejder
Es ist sehr lange her. Die Antwort ist eigentlich ziemlich falsch. Ich wusste nicht, dass Javascript die IP nicht kennen kann.
user4951
Oh, es ist richtig, die Funktion VisitorsIP ist nicht als PHP-Code gedacht. Es ist ein Javacript-Code, der durch PHP-Code generiert wird
user4951
Sie können dann einfach Ihren eigenen Server verwenden, um einen Javascript-Code zu drucken, der den Besuchern eine IP zuweist.
user4951
15

Zu dieser Frage gibt es zwei Interpretationen. Die meisten Leute interpretierten "Client-IP" als die öffentliche IP-Adresse, die Webserver außerhalb des LAN und im Internet sehen. Dies ist jedoch in den meisten Fällen nicht die IP-Adresse des Client-Computers

Ich benötigte die tatsächliche IP-Adresse des Computers, auf dem der Browser ausgeführt wird, in dem meine JavaScript-Software gehostet wird (dies ist fast immer eine lokale IP-Adresse in einem LAN, das sich hinter einer NAT-Schicht befindet).

Mido hat oben eine FANTASTISCHE Antwort gepostet, die anscheinend die einzige Antwort ist, die wirklich die IP-Adresse des Clients angegeben hat.

Danke dafür, Mido!

Die dargestellte Funktion wird jedoch asynchron ausgeführt. Ich muss die IP-Adresse in meinem Code tatsächlich VERWENDEN. Bei einer asynchronen Lösung kann ich versuchen, die IP-Adresse zu verwenden, bevor sie abgerufen / gelernt / gespeichert wird. Ich musste warten können, bis die Ergebnisse eintrafen, bevor ich sie verwenden konnte.

Hier ist eine "Waitable" -Version von Midos Funktion. Ich hoffe es hilft jemand anderem:

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

Es gibt einen einfacheren und kostenlosen Ansatz, bei dem Ihr Besucher nicht um Erlaubnis gebeten wird.

Es besteht darin, eine sehr einfache Ajax-POST-Anfrage an http://freegeoip.net/json zu senden . Sobald Sie Ihre Standortinformationen in JSON erhalten haben, reagieren Sie entsprechend, indem Sie die Seite aktualisieren oder auf eine neue umleiten.

So senden Sie Ihre Anfrage nach Standortinformationen:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );
Jijo Paulose
quelle
Es scheint, dass sie am 1. Juli 2018
Nithin PH
13

Nun, ich schweife von der Frage ab, aber ich hatte heute ein ähnliches Bedürfnis und obwohl ich die ID des Kunden mit Javascript nicht finden konnte, habe ich Folgendes getan.

Auf der Serverseite: -

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

Verwenden von Javascript

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

Ich verwende ASP.Net Ajax, aber Sie können getElementById anstelle von $ get () verwenden.

Was passiert ist, ich habe ein verstecktes div-Element auf der Seite mit der vom Server gerenderten IP des Benutzers. Als in Javascript lade ich nur diesen Wert.

Dies könnte für einige Leute mit ähnlichen Anforderungen wie Ihre hilfreich sein (wie ich, obwohl ich das nicht herausgefunden hatte).

Prost!

Cyril Gupta
quelle
20
-1: Das OP erwähnt ausdrücklich "kein serverseitiger Code", Sie verwenden jedoch etwas C #.
Bruno Reis
8
Wäre es nicht besser, nur auszugeben <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines
Abgesehen von der Verwendung von serverseitigem Code sollte das DOM niemals zum Speichern von Daten verwendet werden. Das ist einfach überall schlecht. Hainesy hat eine bessere Idee, nur JS var zuzuweisen.
Coblr
13

Bei Verwendung der Smart-IP.net Geo-IP-API . Beispiel: Verwenden von jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});
Mikhus
quelle
15
"Dienst vorübergehend nicht verfügbar".
Iago
schrieb eine einfache API [ geoip.immanuel.co/myip] , um Client-IP-Adresse, SSL aktiviert und unbegrenzt zu erhalten
Immanuel
12

Im Allgemeinen nicht möglich, es sei denn, Sie nutzen einen externen Dienst.

Eugene Lazutkin
quelle
In der Tat ist dies mit Javascript möglich, indem Sie sich auf einen Drittanbieter-Dienst wie Ipregistry verlassen (Haftungsausschluss: Ich führe den Dienst aus): ipregistry.co/docs/getting-location-from-ip-address#javascript Sie können die IP-Adresse abrufen und viele verwandte Informationen, einschließlich Bedrohungsdaten, alle in einem einzigen Anruf.
Laurent
9

Holen Sie sich Ihre IP mit jQuery

Sie können Ihre öffentliche IP-Adresse mit einer Zeile von JS erhalten? Es gibt einen kostenlosen Service, der dies für Sie anbietet, und eine Get-Anfrage ist alles, was Sie tun müssen:

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

Damit das obige Snippet funktioniert, muss Ihr Browser CORS (Cross-Origin Request Sharing) unterstützen. Andernfalls würde eine Sicherheitsausnahme ausgelöst. In älteren Browsern können Sie diese Version verwenden, die eine JSON-P-Anforderung verwendet:

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

Sie können die Javascript-Bibliothek userinfo.io verwenden.

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

Sie können das Skript auch mit requirejs laden.

Sie erhalten die IP-Adresse Ihres Besuchers sowie einige Daten zu seinem Standort (Land, Stadt usw.). Es basiert auf der Maxmind Geoip Datenbank.

Haftungsausschluss: Ich habe diese Bibliothek geschrieben

Vincent Durmont
quelle
8

Javascript / jQuery erhalten die IP-Adresse und den Standort des Kunden (Land, Stadt)

Sie müssen nur ein Tag mit dem Link "src" in den Server einbetten. Der Server gibt "codehelper_ip" als Objekt / JSON zurück und Sie können es sofort verwenden.

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

Weitere Informationen finden Sie unter Javascript Detect Real IP Address Plus Country

Wenn Sie jQUery verwenden, können Sie Folgendes versuchen:

console.log(codehelper_ip); 

Es werden Ihnen weitere Informationen zum zurückgegebenen Objekt angezeigt.

Wenn Sie eine Rückruffunktion wünschen, versuchen Sie Folgendes:

// 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
quelle
1
Verwenden Sie kein languageAttribut, type="text/javascript"sondern stattdessen mehr auf MDN
Alex K
Wie bereits erwähnt, ist die Sprache veraltet und wird nur in Legacy-Code verwendet. Verwenden Sie stattdessen 'type = "text / javascript"' für maximale Kompatibilität.
Gautham C.
1
Nur zu Ihrer Information - das Typfeld wird für HTML5 nicht benötigt (JS ist die Standardeinstellung). w3schools.com/tags/att_script_type.asp
pmont
Nur für den Fall, dass Sie diese anderen Kommentare verpasst haben, sollten Sie Typ anstelle von Sprache verwenden
Mike
8

Der Rückrufdienst von Appspot.com ist nicht verfügbar. ipinfo.io scheint zu funktionieren.

Ich habe einen zusätzlichen Schritt gemacht und alle Geoinformationen mit AngularJS abgerufen. (Danke an Ricardo) Schau es dir an.

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

Arbeitsseite hier: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

Yamenator
quelle
8

Wenn Sie immer eine Datei einfügen, können Sie einen einfachen Ajax-Vorgang ausführen:

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

Und ajax.getIp.phpwäre das:

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

Ich mag api.ipify.orges wirklich, weil es sowohl HTTP als auch HTTPS unterstützt.

Hier sind einige Beispiele für das Abrufen der IP mithilfe api.ipify.orgvon jQuery.

JSON-Format über 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>

JSON-Format über 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>

Textformat über HTTPS

Wenn Sie es in JSON nicht möchten, gibt es auch eine Klartextantwort über HTTPS

https://api.ipify.org

Textformat über HTTP

Und es gibt auch eine Klartextantwort über HTTP

http://api.ipify.org
Tim Penner
quelle
8

Verwenden Sie ipdata.co .

Die API bietet auch Geolokalisierungsdaten und verfügt über 10 globale Endpunkte, die jeweils> 800 Millionen Anfragen pro Tag verarbeiten können!

Diese Antwort verwendet einen 'Test'-API-Schlüssel, der sehr begrenzt ist und nur zum Testen einiger Aufrufe gedacht ist. Melden Sie sich für Ihren eigenen kostenlosen API-Schlüssel an und erhalten Sie täglich bis zu 1500 Anfragen für die Entwicklung.

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

Es gibt keine wirklich zuverlässige Möglichkeit, die IP-Adresse des Client-Computers abzurufen.

Dies geht durch einige der Möglichkeiten. Der Code, der Java verwendet, wird unterbrochen, wenn der Benutzer über mehrere Schnittstellen verfügt.

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

Wenn Sie sich die anderen Antworten hier ansehen, möchten Sie möglicherweise die öffentliche IP-Adresse des Clients abrufen, die wahrscheinlich die Adresse des Routers ist, mit dem er eine Verbindung zum Internet herstellt. Viele der anderen Antworten hier sprechen darüber. Ich würde empfehlen, eine eigene serverseitige Seite zu erstellen und zu hosten, um die Anfrage zu empfangen und mit der IP-Adresse zu antworten, anstatt von dem Dienst eines anderen abhängig zu sein, der möglicherweise weiterhin funktioniert oder nicht.

Sarel Botha
quelle
7

Ich werde eine Methode anbieten, die ich häufig verwende, wenn ich Informationen auf der HTML-Seite speichern möchte und mein Javascript Informationen lesen soll, ohne tatsächlich Parameter an das Javascript übergeben zu müssen. Dies ist besonders nützlich, wenn auf Ihr Skript extern und nicht inline verwiesen wird.

Es erfüllt jedoch nicht das Kriterium "kein serverseitiges Skript". Wenn Sie jedoch serverseitiges Scripting in Ihr HTML aufnehmen können, gehen Sie folgendermaßen vor:

Erstellen Sie versteckte Beschriftungselemente am unteren Rand Ihrer HTML-Seite direkt über dem Endkörper-Tag.

Ihr Etikett sieht folgendermaßen aus:

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

Stellen Sie sicher, dass eine Klasse aufgerufen hiddenlabelund so eingestellt wird, visibility:hiddendass niemand das Etikett tatsächlich sieht. Auf diese Weise können Sie viele Dinge in versteckten Etiketten speichern.

In Ihrem Javascript können Sie nun die auf dem Etikett gespeicherten Informationen (in diesem Fall die IP-Adresse des Clients) abrufen:

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

Jetzt entspricht Ihre Variable "ip" der IP-Adresse. Jetzt können Sie die IP an Ihre API-Anfrage übergeben.

* 2 JAHRE SPÄTER BEARBEITEN * Zwei kleinere Verbesserungen :

Ich verwende diese Methode routinemäßig, rufe aber das Label auf class="data", da es tatsächlich eine Möglichkeit ist, Daten zu speichern. Der Klassenname "hiddenlabel" ist eine Art dummer Name.

Die zweite Änderung befindet sich im Stylesheet anstelle von visibility:hidden:

.data{
    display:none;
}

... ist der bessere Weg, es zu tun.

TARKUS
quelle
3
Speichern Sie keine Daten im DOM. Warum sollte jemand das auch 2 Jahre später vorschlagen? Wenn Sie irgendetwas in die HTML-Datei einfügen können, fügen Sie diesen Wert einfach so in eine JS-Variable ein. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script>. Zumindest dann werden Screenreader es vermissen und es ist kein getElementById oder $ ('# dummname') erforderlich.
Coblr
@fractalspawn, Aus dem Grund, dass Sie keinen PHP-Code in eine .js-Datei einfügen können. Ich habe nicht daran gedacht, hast du schicke Hosen! ;)
TARKUS
Nun, Sie könnten, wenn Sie <script type = "text / javascript" src = "path / to / fantasie / javascript.php"> </ script> tun würden, obwohl ich nicht sicher bin, warum Sie das auch tun würden. Mein Punkt ist, dass, wenn PHP etwas in den HTML-Code einfügen kann, den es rendert, die beste Vorgehensweise darin besteht, einen Wert in eine JS-Variable innerhalb eines Inline-Skript-Tags einzufügen, anstatt in ein DOM-Element, das Sie dann analysieren müssten heraus, um zu verwenden, und könnte möglicherweise von Bildschirmlesern gelesen werden, es sei denn, Sie haben zusätzliche Maßnahmen ergriffen, um dies zu verhindern.
Coblr
Es gibt absolut keinen guten Grund, warum Sie dem DOM keine Datenhalteelemente hinzufügen können oder sollten, und es gibt viele gute Gründe dafür. In der Tat sind diese Gründe in meiner Antwort, wenn Sie es noch einmal lesen möchten. Es ist zuverlässig, einfach zu steuern und besonders nützlich, wenn sich Ihre Javascript-Datei auf einem Remote-Standort befindet. Apropos Remote-Skript: Ihr Beispiel für "javascript.php" ist eine schreckliche Idee und würde wahrscheinlich sowieso nicht funktionieren. Denken Sie an Remote-Skripte wie DISQUS.
TARKUS
3
Zu Ihrem anderen Kommentar darüber, warum die DOM-Datenspeicherung schlecht ist. Nun, Sie können ein Auto immer noch anhalten, indem Sie sanft gegen eine Wand an Ihrem Zielort schlagen, aber es gibt jetzt bessere Tools für den Job. Wir wissen es jetzt besser und haben großartige Rahmenbedingungen, um dies zu mildern. Ich habe an einem Ort gearbeitet, an dem das DOM nur eine riesige Konfigurationsdatei für das JS war, und es war ein Albtraum, als es neu gestaltet wurde. Wenn Sie der Meinung sind, dass die Verwendung von <script src = "Something.php"> ein "grober Hack" ist, das Speichern von Daten im DOM, die nur in Javascript einen Wert haben, jedoch nicht, dann bin ich wirklich froh, dass wir nicht funktionieren zusammen und werde wieder gerne zustimmen, nicht zuzustimmen. :)
Coblr
6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });
Atif Hussain
quelle
6

Zuallererst die eigentliche Antwort : Es ist nicht möglich, rein clientseitig ausgeführten Code zu verwenden, um Ihre eigene IP-Adresse herauszufinden.

Sie können jedoch einfach ein GET in Richtung https://api.muctool.de/whois durchführen und so etwas wie die IP-Adresse eines Clients erhalten

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

Sie können dies vollständig clientseitig und meistens in JavaScript tun, indem Sie ein Flash-Objekt verwenden, das die js aufrufen können. Flash kann auf die IP-Adresse des lokalen Computers zugreifen, was möglicherweise nicht sehr nützlich ist.

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

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

data.hostist die IP-Adresse. Rufen Sie dies einfach über Ihren Browser auf.

http://smart-ip.net/geoip-json?callback=? [Ohne Anführungszeichen] und bekomme die IP.

Jawwad Ahmed
quelle
Entschuldigung, was bedeutet $ in Javascript?
GHOST