Jak uzyskać adres IP klienta za pomocą JavaScript?

560

Muszę jakoś odzyskać adres IP klienta za pomocą JavaScript; brak kodu po stronie serwera, nawet SSI.

Nie jestem jednak przeciwny korzystaniu z darmowego skryptu / usługi innej firmy.

FlySwat
źródło

Odpowiedzi:

771

Chciałbym skorzystać z usługi internetowej, która może zwrócić JSON (wraz z jQuery, aby uprościć sprawę). Poniżej znajdują się wszystkie bezpłatne aktywne usługi wyszukiwania adresów IP, które mogłem znaleźć, i informacje, które zwracają. Jeśli wiesz coś więcej, dodaj komentarz, a ja zaktualizuję tę odpowiedź.


Cloudflare

Wypróbuj: 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)
})

Zwroty:

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

Ograniczenia:

  • Zwraca zwykły tekst

DB-IP

Wypróbuj: http://api.db-ip.com/addrinfo?api_key= < Twój klucz API > i addr = < adres IP >

Zwroty:

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

Ograniczenia:

  • 2500 wniosków dziennie
  • Nie obsługuje wywołań zwrotnych JSONP
  • Wymaga parametru adresu IP
  • Wymaga adresu e-mail, aby uzyskać klucz API
  • Bez SSL (https) w bezpłatnym abonamencie

Geobajty

Wypróbuj: http://gd.geobytes.com/GetCityDetails

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

Zwroty:

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

Ograniczenia:

  • 16,384 wniosków na godzinę
  • Bez SSL (https) w bezpłatnym abonamencie
  • Może zwrócić niewłaściwą lokalizację (jestem w Singapurze, nie w Arabii Saudyjskiej)

GeoIPLookup.io

Wypróbuj: https://json.geoiplookup.io/api

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

Zwroty:

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

Ograniczenia:

  • 10 000 wniosków na godzinę
  • Bezpłatny interfejs API pozwala tylko na wykorzystanie niekomercyjne

geoPlugin

Wypróbuj: http://www.geoplugin.net/json.gp

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

Zwroty:

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

Ograniczenia:

  • 120 żądań na minutę
  • Bez SSL (https) w bezpłatnym abonamencie

Cel hakera

Wypróbuj: https://api.hackertarget.com/geoip/?q= < adres ip >

Zwroty:

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

Ograniczenia:

  • 50 wniosków dziennie
  • Nie obsługuje wywołań zwrotnych JSONP
  • Wymaga parametru adresu IP
  • Zwraca zwykły tekst

ipapi.co

Wypróbuj: https://ipapi.co/json/

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

Zwroty:

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

Ograniczenia:

  • 1000 wniosków dziennie
  • Wymaga SSL (https)

IP-API.com

Wypróbuj: http://ip-api.com/json

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

Zwroty:

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

Ograniczenia:

  • 150 wniosków na minutę
  • Bez SSL (https) w bezpłatnym abonamencie

Ipdata.co

Wypróbuj: https://api.ipdata.co

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

Zwroty:

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

Ograniczenia:

  • 1500 wniosków dziennie
  • Wymaga adresu e-mail, aby uzyskać klucz API
  • Wymaga SSL (https)

Znajdź IP

Wypróbuj: https://ipfind.co/me?auth= < Twój klucz API >

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

Zwroty:

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

Ograniczenia:

  • 300 wniosków dziennie
  • Wymaga rejestracji, aby uzyskać klucz API

ipgeolocation

Wypróbuj: https://api.ipgeolocation.io/ipgeo?apiKey= < Twój klucz API >

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

Zwroty:

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

Ograniczenia:

  • 50 000 wniosków miesięcznie
  • Wymaga rejestracji, aby uzyskać klucz API

ipify

Wypróbuj: https://api.ipify.org/?format=json

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

Zwroty:

{
  "ip": "116.12.250.1"
}

Ograniczenia:

  • Żaden

IPInfoDB

Spróbuj: https://api.ipinfodb.com/v3/ip-city/?key= < your api key > & 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));
});

Zwroty:

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

Ograniczenia:

  • Dwa zapytania na sekundę
  • Wymaga rejestracji, aby uzyskać klucz API

ipinfo.io

Wypróbuj: https://ipinfo.io/json

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

Zwroty:

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

Ograniczenia:

  • 1000 wniosków dziennie

Ipregistry

Wypróbuj: https://api.ipregistry.co/?key= < Twój klucz API >

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

Zwroty:

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

Ograniczenia:

  • Bezpłatny plan obejmuje 100 000 wniosków
  • Wymaga rejestracji, aby uzyskać klucz API

ipstack (wcześniej freegeoip.net)

Wypróbuj: http://api.ipstack.com/ < adres ip >? Access_key = <twój klucz api>

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

Zwroty:

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

Ograniczenia:

  • 10 000 wniosków miesięcznie
  • Wymaga parametru adresu IP
  • Wymaga rejestracji, aby uzyskać klucz API
  • Bez SSL (https) w bezpłatnym abonamencie

jsonip.com

Wypróbuj: https://jsonip.com

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

Zwroty:

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

Ograniczenia:

  • Odpowiedź obejmuje wyprzedaży

Test JSON

Wypróbuj: http://ip.jsontest.com/

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

Zwroty:

{
  "ip": "116.12.250.1"
}

Ograniczenia:

  • Bez SSL (https)
  • Dużo spada (ponad limit), więc nie użyłbym tego do produkcji
  • Zwraca adres IPv6, jeśli go masz, co może nie być tym, czego chcesz

Nekudo

Wypróbuj: https://geoip.nekudo.com/api

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

Zwroty:

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

Ograniczenia:

  • Blokowane przez programy blokujące reklamy korzystające z listy EasyPrivacy

Należy pamiętać, że ponieważ są to wszystkie bezpłatne usługi, przebieg może się różnić pod względem przekroczenia limitu i czasu pracy, a kto wie, kiedy / czy zostaną one odłączone w trybie offline w drodze ( załącznik A: Telize ). Większość z tych usług oferuje również płatną warstwę, na wypadek gdybyś potrzebował więcej funkcji, takich jak obsługa SSL.

Ponadto, jak zauważył skobaljic w poniższych komentarzach, kwoty wniosków są w większości akademickie, ponieważ dzieje się to po stronie klienta, a większość użytkowników końcowych nigdy nie przekroczy limitu.

AKTUALIZACJE

thdoan
źródło
3
@AfolabiOlaoluwaAkinwumi możesz spróbować czegoś takiego: $.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. ograniczenia zwykle nic nie znaczą: Dobra uwaga i być może powód, by trzymać się z dala od tych, które potrzebują klucza API, ponieważ można liczyć użycie klucza .
Nick Rice
2
@JohnWeisz Prawda, ale jeśli PO oznaczało po prostu, że mogliby tylko zaktualizować stronę i nie robić nic po stronie serwera (niejasne z pytania), wówczas te opcje dobrze odpowiadają na pytanie.
Nick Rice
1
@RobWaa dzięki, dodałem ograniczenie blokady reklam w aktualizacji 4/14. Wkrótce dodam geoiplookup.io.
thdoan
1
Wszystkie te odpowiedzi opierają się na usłudze strony trzeciej, co jest dużą wadą, nie tylko dlatego, że polegasz na tym, że usługa ta reaguje w odpowiednim czasie, ale także dlatego, że jeśli nie, i nie ustawisz odpowiedniego limitu czasu (który zawsze będzie występuje później niż później), opóźnisz czas ładowania strony, co wcale nie jest dobre. Dlaczego więc nie użyć własnego serwera do zwrócenia adresu IP klienta ?, co jest BTW banalnym zadaniem w każdym języku programowania.
Daniel J.
280

Ostatnia aktualizacja

To rozwiązanie już nie działałoby, ponieważ przeglądarki naprawiają wyciek webrtc: aby uzyskać więcej informacji, przeczytaj to drugie pytanie: RTCIceCandidate nie zwraca już adresu IP


Aktualizacja : Zawsze chciałem stworzyć minimalną / nieglifikowaną wersję kodu, więc oto kod Promise ES6:

var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})

/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e))

Uwaga: ten nowy zminimalizowany kod zwróci tylko jeden adres IP, jeśli chcesz uzyskać wszystkie adresy IP użytkownika (które mogą być większe w zależności od jego sieci), użyj oryginalnego kodu ...


dzięki WebRTC bardzo łatwo jest uzyskać lokalny adres IP w przeglądarkach obsługiwanych przez WebRTC (przynajmniej na razie). Zmodyfikowałem kod źródłowy, zmniejszyłem liczbę wierszy, nie wysyłając żadnych żądań ogłuszenia, ponieważ chcesz tylko lokalny adres IP, a nie publiczny adres IP, poniższy kod działa w najnowszych przeglądarkach Firefox i Chrome, po prostu uruchom fragment kodu i sprawdź sam:

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>

to, co się tutaj dzieje, tworzymy fałszywe połączenie peer, a aby zdalny peer mógł się z nami skontaktować, zazwyczaj wymieniamy między sobą kandydatów do lodu. I czytając lodowych kandydatów (z lokalnego opisu sesji i onIceCandidateEvent) możemy powiedzieć adres IP użytkownika.

skąd wziąłem kod z -> Źródło

mido
źródło
12
Głosuj, bo tutaj najlepsza odpowiedź, a także dzięki za niesamowite repozytorium GitHub!
kano
28
Ostrzeżenie: To nie pokazuje twojego publicznego adresu IP, tylko adres sieci lokalnej. Nie można go użyć do wykrywania kraju użytkownika, na przykład, jeśli jest on w sieci LAN
FloatingRock,
1
@ FloatingRock możesz również odzyskać publiczny adres IP, używając serwera STUN (i skonfigurować go podczas tworzenia elementu równorzędnego), a następnie wymagałoby to utrzymania / używania serwera STUN, przedstawienia kodu serwera.
środę
10
Jest to znane jako wyciek WebRTC. Powinny zostać naprawione przez wszystkie przeglądarki Mayor, ale tak nie jest. Więcej informacji tutaj: privacytools.io/webrtc.html Możliwe, że związane z wyciekaniem twojej przeglądarki z przeglądarki Tor.
Kapitein Witbaard
1
Chociaż podobała mi się odpowiedź, klient może pominąć
ni8mr
175

Możesz, przekazując go po stronie serwera za pomocą JSONP

A podczas wyszukiwania go w Google, znalazłem go tutaj na SO. Czy mogę przeprowadzić wyszukiwanie DNS (nazwa hosta na adres IP) przy użyciu Javascript po stronie klienta?

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

Uwaga: interfejs API telize.com został trwale zamknięty od 15 listopada 2015 r .

Chad Grant
źródło
45
choć doceniam ten fragment kodu, myślę, że ładowanie treści tekstowej JavaScript i ocenianie, że funkcja jest poważnym zagrożeniem bezpieczeństwa. Co się stanie, jeśli treść odpowiedzi zmieni się, a wszystkie ponad 100 osób, które głosowały na tę odpowiedź i prawdopodobnie użyły tego fragmentu kodu, w końcu wywołają funkcję z potencjalnie niebezpieczną treścią. Użyłbym tego tylko, gdyby był to ciąg JSON.
auco,
32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M,
28
To nie jest dobra odpowiedź, ponieważ dotyczy żądania po stronie serwera. Pytanie wyraźnie brzmiało „czysty javascript”.
Micheasza
2
Micheasz, nie ma możliwości uzyskania adresu IP za pomocą czystego javascript. Sugeruję, abyś poczytał trochę o NAT i jak to działa. Potrzebujesz serwera, aby ponownie wysłać ci adres IP
Chad Grant
11
Usługa jest teraz wyłączona.
Cyril N.,
109

Większość odpowiedzi tutaj „omija” potrzebę kodu po stronie serwera, uderzając w serwer innej osoby. Jest to całkowicie poprawna technika, chyba że faktycznie potrzebujesz adresu IP bez uderzania w serwer.

Tradycyjnie nie było to możliwe bez jakiejś wtyczki (i nawet wtedy prawdopodobnie dostałbyś zły adres IP, gdybyś był za routerem NAT), ale wraz z pojawieniem się WebRTC jest to możliwe. . Jeśli jesteś kierowania przeglądarkach obsługujących WebRTC (obecnie: Firefox, Chrome i Opera).

Przeczytaj odpowiedź mido, aby uzyskać szczegółowe informacje na temat uzyskiwania użytecznych adresów IP klientów za pomocą WebRTC.

Shog9
źródło
23
@oscar: wydaje się, że jest to ta sama technika (zwrócony przez JSONP adres IP widoczny dla serwera), o której wspominał czad w swojej odpowiedzi. Który nie spełnia wymogu OP „brak kodu po stronie serwera”. Ale tak, jest to jeden ze sposobów na osiągnięcie tego, jeśli zignorujesz ten wymóg.
Shog9
Ta odpowiedź jest nieaktualna z powodu WebRTC: stackoverflow.com/questions/20194722/...
Akam
1
Zaktualizowano, @Akam. Powinieneś dać mido kilka rekwizytów za zwrócenie na to uwagi kilka miesięcy temu (po latach, gdy ludzie wysyłali żenująco błędne odpowiedzi, które nadal wymagały wsparcia serwera).
Shog9
czy WebRTC jest teraz szerzej obsługiwany ?!
oldboy
1
Według tego linku „CanIUse” jest to @BugWhisperer. Chyba że potrzebujesz IE.
Shog9,
81

Możesz wykonać wywołanie ajax do hostip.info lub podobnej usługi ...

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

Jako bonus, informacje o geolokalizacji są zwracane w ramach tego samego połączenia.

Malta
źródło
6
Możesz także uzyskać reprezentację JSON za pomocą api.hostip.info/get_json.php , a następnie przeanalizować JSON za pomocą funkcji przeglądarki, jQuery lub Prototype.
Brad Folkens,
2
czy jest jakiś limit żądań na „ api.hostip.info/get_html.php ”? gdzie mogę zobaczyć szczegóły tego interfejsu API
Navin Leon,
Zwraca adres IP zapory sieciowej. nie rzeczywisty adres IP klienta. Czy istnieje sposób na uzyskanie rzeczywistego adresu IP klienta?
Leela Addagulla
76
Spróbuj tego
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

LUB

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

Skrzypce

Sridhar R.
źródło
to działa $ .get („ ipinfo.io ”, funkcja (odpowiedź) {alert (response.ip);}, „jsonp”); ale jak przechowywać wartość w zmiennej? wydaje się, że znika poza tą pętlą żądania get
1
Aby uzyskać listę wszystkich bezpłatnych usług wyszukiwania adresów IP, możesz odnieść się do mojej odpowiedzi na stackoverflow.com/questions/391979/...
thdoan
Jak wysłać tę funkcję, aby zwrócić wartość ip?
Neftali Acosta
67

Nie możesz Musisz zapytać serwer.

SteveShaffer
źródło
5
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
Himanshu,
28
Ale to prawda, prawda? To znaczy, jeśli odpowiedź brzmi „nie, nie możesz”, to twierdzę, że jest to bardziej poprawna odpowiedź niż obecnie głosowana „tutaj, użyj tej losowej aplikacji appspot”, która wydaje się niebezpieczną odpowiedzią na na górze listy.
SteveShaffer,
16
IMO To poprawna odpowiedź i powinna zostać zaakceptowana. Pytanie wyraźnie mówi „brak kodu po stronie serwera”.
matthewwithanm
2
@matthewwithanm Nie mogłem się więcej zgodzić. Przewijałem wszystkie odpowiedzi, aby sprawdzić, czy ktoś dokładnie to powiedział - i sam byłem gotów udzielić odpowiedzi. Wszystkie bardzo wysoko ocenione odpowiedzi, choć pouczające, odpowiadają na inne pytanie. Cytując pytanie: „Muszę jakoś wyciągnąć adres IP klienta za pomocą czystego JavaScript; bez kodu po stronie serwera, nawet SSI”. Ta odpowiedź jest prawidłowa. JavaScript w piaskownicy nie może tego zrobić (bez względu na NAT lub proxy). Pytanie należy zmienić, jeśli jedna z pozostałych odpowiedzi ma zostać zaakceptowana.
wally
64

Nie szukaj dalej

Sprawdź http://www.ipify.org/

Według nich:

  • Możesz go używać bez ograniczeń (nawet jeśli wykonujesz miliony żądań na minutę).
  • ipify jest całkowicie otwartym oprogramowaniem (sprawdź repozytorium GitHub ).

Oto działający przykład JS (zamiast zastanawiać się, dlaczego ta odpowiedź ma tak mało głosów, spróbuj sam, aby zobaczyć ją w akcji):

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

Zbyt leniwy, aby skopiować / wkleić? Lubię to. Oto demo 💻

Zbyt leniwy, by kliknąć? :O

Uwaga : wyłącz Adblock Plus / uBlock & co przed uruchomieniem demo. W przeciwnym razie po prostu nie będzie działać.

Nie mam nic wspólnego z zespołem IPify. Myślę, że to absurdalnie fajne, że ktoś zapewniłby taką usługę dla ogólnego dobra.

FloatingRock
źródło
4
Najlepsze jest to, że pochodzi to od „https”, podczas gdy moje połączenia z pomocnikami http IP zostałyby zablokowane, ponieważ „nie są bezpieczne”.
Tessa
hej, pokazuje mi błąd CORS, co powinienem zrobić?
saberprashant
@ Saberprashant używasz „HTTPS”?
FloatingRock
@ FloatingRock, nie, używam HTTP
saberprashant
26

Możesz do tego użyć mojej usługi http://ipinfo.io , która da ci adres IP klienta, nazwę hosta, informacje o geolokalizacji i właściciela sieci. Oto prosty przykład, który rejestruje adres IP:

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

Oto bardziej szczegółowy przykład JSFiddle, który drukuje również pełne informacje o odpowiedzi, dzięki czemu można zobaczyć wszystkie dostępne szczegóły: http://jsfiddle.net/zK5FN/2/

Ben Dowling
źródło
Aby uniknąć problemów mieszanego politykę treści, zmiany http://ipinfo.iodo //ipinfo.iolub https
Samuel ELH
Chcemy skorzystać z Twojej usługi, czy masz jakieś zniżki dla użytkowników Stackoverflow?
Mehdi Dehghani,
@MehdiDehghani jesteśmy za darmo do 50 tys. Miesięcznie, za 100 tys. Z linkiem zwrotnym
Ben Dowling
19

Dodaj ten kod na swojej stronie: <script type="text/javascript" src="http://l2.io/ip.js"></script>

więcej dokumentów tutaj

L2.IO
źródło
1
Hm Wygląda interesująco ... Czy mają jakieś ograniczenia?
niejawne
1
biblioteka offline
riccardo.tasso
Istnieje pewien stopień spamerskich okien pop-up związanych z l2.io ref: hybrid-analysis.com/sample/… umożliwia osadzanie linków jak w próbce 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip ”,„ host ”:„ l2.io ”,„ referer ”:„ website.com/… } ”i screenheight = 768 i screenwidth = 1366 & tm = 1557565256073 & lib = true i odcisk palca = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza
16

Powiedziałbym, że Czad i Malta mają świetną odpowiedź. Ich są jednak skomplikowane. Sugeruję więc ten kod, który znalazłem w reklamach według wtyczek krajów

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

Brak ajax. Po prostu zwykłe javascripts. :RE

Jeśli przejdziesz na http://j.maxmind.com/app/geoip.js , zobaczysz, że zawiera

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

Tak naprawdę to jeszcze nie odpowiada na pytanie, ponieważ

http://j.maxmind.com/app/geoip.js nie zawiera adresu IP (chociaż założę się, że używa adresu IP w celu uzyskania kraju).

Ale tak łatwo jest stworzyć skrypt phP, który pop coś takiego

function visitorsIP()   { return '123.123.123.123'; }

Sprawiają, że. Załóż http://yourdomain.com/yourip.php .

Więc zrób

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

Pytanie wyraźnie wspomina NIE używać skryptu innej firmy. Nie ma innego wyjścia. JavaScript nie może poznać twojego adresu IP. Ale inne serwery, do których można uzyskać dostęp za pomocą javascript, mogą działać równie dobrze bez problemu.

użytkownik4951
źródło
7
ładowanie JavaScript ze zdalnego serwera i wywoływanie funkcji o nieznanej treści wydaje mi się ogromnym zagrożeniem dla bezpieczeństwa (a jeśli zawartość funkcji się zmieni?). Wolę parsować odpowiedź JSON.
auco,
3
Błąd 404: Nie znaleziono obiektu
trejder
Minęło bardzo dużo czasu., Właściwie odpowiedź jest dość fałszywa. Nie wiedziałem, że JavaScript nie może znać adresu IP.
user4951
och, to jest poprawne, funkcja VisitorsIP nie ma być kodem php. Jest to kod javacript generowany przez kod php
user4951
możesz po prostu użyć własnego serwera, aby wydrukować kod JavaScript, który przypisuje odwiedzającym ip.
user4951
15

Istnieją dwie interpretacje tego pytania. Większość ludzi interpretowała „klient IP” jako publiczny adres IP, który serwer sieciowy widzi poza siecią LAN i poza Internetem. Jednak w większości przypadków nie jest to adres IP komputera klienckiego

Potrzebowałem prawdziwego adresu IP komputera, na którym działa przeglądarka, która obsługuje moje oprogramowanie JavaScript (który prawie zawsze jest lokalnym adresem IP w sieci LAN za czymś takim warstwy NAT).

Mido opublikowało odpowiedź FANTASTYCZNĄ powyżej, która wydaje się być jedyną odpowiedzią, która naprawdę podała adres IP klienta.

Dzięki za to, Mido!

Przedstawiona funkcja działa jednak asynchronicznie. Muszę faktycznie UŻYWAĆ adresu IP w moim kodzie, a przy rozwiązaniu asynchronicznym mogę spróbować użyć adresu IP, zanim zostanie pobrany / wyuczony / zapisany. Musiałem być w stanie zaczekać na pojawienie się wyników przed ich użyciem.

Oto „Waiable” wersja funkcji Mido. Mam nadzieję, że pomoże to komuś innemu:

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
źródło
14

Jest łatwiejsze i darmowe podejście, które nie poprosi użytkownika o pozwolenie.

Polega ona na przesłaniu bardzo prostego żądania POST Ajax na http://freegeoip.net/json . Po otrzymaniu informacji o lokalizacji w JSON reagujesz odpowiednio, aktualizując stronę lub przekierowując na nową.

Oto jak przesyłasz zapytanie o informacje o lokalizacji:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );
Jijo Paulose
źródło
Wygląda na to, że
zamknęli
13

Cóż, odbiegam od pytania, ale dzisiaj miałem podobną potrzebę i chociaż nie mogłem znaleźć identyfikatora od klienta za pomocą Javascript, zrobiłem następujące.

Po stronie serwera:

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

Korzystanie z Javascript

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

Korzystam z ASP.Net Ajax, ale możesz użyć getElementById zamiast $ get ().

Co się dzieje, mam ukryty element div na stronie z adresem IP użytkownika renderowanym z serwera. Niż w JavaScript po prostu ładuję tę wartość.

Może to być pomocne dla niektórych osób o podobnych wymaganiach, takich jak twoje (takich jak ja, chociaż tego nie rozgryzłem).

Twoje zdrowie!

Cyril Gupta
źródło
20
-1: OP konkretnie wspomina o „braku kodu po stronie serwera”, ale używasz trochę C #.
Bruno Reis,
8
Czy nie byłoby lepiej po prostu wyjść <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines,
oprócz używania kodu po stronie serwera, nigdy nie należy używać DOM do przechowywania danych. To po prostu źle. Hainesy ma lepszy pomysł, aby po prostu przypisać do JS var.
coblr
13

Dzięki użyciu API Geo-IP Smart-IP.net . Na przykład za pomocą jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});
Mikhus
źródło
15
„Usługa chwilowo niedostępna”.
Iago
napisał prosty api [ geoip.immanuel.co/myip], aby uzyskać adres IP klienta, włączony ssl i bez ograniczeń
Immanuel
12

Zwykle nie jest to możliwe, chyba że korzystasz z usług zewnętrznych.

Eugene Lazutkin
źródło
Rzeczywiście jest to możliwe przy użyciu Javascript, polegając na usłudze innej firmy, takiej jak Ipregistry (zastrzeżenie: uruchamiam usługę): ipregistry.co/docs/getting-location-from-ip-address#javascript Możesz uzyskać adres IP oraz wiele powiązanych informacji, w tym danych o zagrożeniach, wszystko w jednym połączeniu.
Laurent
9

Uzyskaj swój adres IP dzięki jQuery

możesz uzyskać swój publiczny adres IP za pomocą jednej linii JS? Jest to bezpłatna usługa, która oferuje to za Ciebie, a prośba o pobranie to wszystko, co musisz zrobić:

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

Aby powyższy fragment działał, Twoja przeglądarka będzie musiała obsługiwać CORS (udostępnianie żądań między źródłami). W przeciwnym razie zostałby zgłoszony wyjątek bezpieczeństwa. W starszych przeglądarkach możesz użyć tej wersji, która korzysta z żądania JSON-P:

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

Możesz użyć biblioteki 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
});

Do załadowania skryptu można także użyć metody wymaganej.

Poda ci adres IP twojego gościa, a także kilka danych o jego lokalizacji (kraj, miasto itp.). Opiera się na bazie geoip maxmind.

Oświadczenie: Napisałem tę bibliotekę

Vincent Durmont
źródło
8

Javascript / jQuery uzyskać adres IP i lokalizację klienta (kraj, miasto)

Trzeba tylko osadzić tag z linkiem „src” do serwera. Serwer zwróci „codehelper_ip” jako Object / JSON i możesz go użyć od razu.

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

Więcej informacji na stronie Javascript Detect Real IP Address Plus Country

Jeśli używasz jQUery, możesz spróbować:

console.log(codehelper_ip); 

Pokaże ci więcej informacji na temat zwróconego obiektu.

Jeśli chcesz funkcji oddzwaniania, spróbuj tego:

// 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
źródło
1
nie używaj languageatrybutu, type="text/javascript"zamiast tego użyj , więcej na MDN
Alex K
jak już wspomniano @Alex, język jest przestarzały i jest używany tylko w starszym kodzie. Zamiast tego należy użyć parametru „type =" text / javascript ”, aby uzyskać maksymalną zgodność.
Gautham C.
1
tylko FYI - pole typu nie jest potrzebne dla HTML5 (domyślnie JS). w3schools.com/tags/att_script_type.asp
pmont
Na wypadek, gdybyś przeoczył te inne komentarze, powinieneś użyć pisma zamiast języka
Mike
8

Usługa oddzwaniania Appspot.com nie jest dostępna. Wygląda na to, że ipinfo.io działa.

Zrobiłem dodatkowy krok i odzyskałem wszystkie informacje geograficzne za pomocą AngularJS. (Dzięki Ricardo) Sprawdź to.

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

Strona robocza tutaj: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

Yamenator
źródło
8

Jeśli dołączasz plik zawsze, możesz zrobić prosty ajax:

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

I ajax.getIp.phpbyłoby to:

<?=$_SERVER['REMOTE_ADDR']?>
Martijn
źródło
8

Bardzo mi się podoba, api.ipify.orgponieważ obsługuje zarówno HTTP, jak i HTTPS.

Oto kilka przykładów uzyskiwania adresu IP przy api.ipify.orgużyciu jQuery.

Format JSON przez 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 przez 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 tekstowy przez HTTPS

Jeśli nie chcesz tego w JSON, istnieje również odpowiedź w postaci zwykłego tekstu przez HTTPS

https://api.ipify.org

Format tekstowy przez HTTP

Istnieje również odpowiedź w postaci zwykłego tekstu przez HTTP

http://api.ipify.org
Tim Penner
źródło
8

Użyj ipdata.co .

Interfejs API zapewnia również dane geolokalizacyjne i ma 10 globalnych punktów końcowych, z których każdy jest w stanie obsłużyć> 800 milionów żądań dziennie!

Ta odpowiedź wykorzystuje „testowy” klucz API, który jest bardzo ograniczony i przeznaczony tylko do testowania kilku połączeń. Zarejestruj swój bezpłatny klucz API i codziennie otrzymuj do 1500 wniosków o programowanie.

$.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
źródło
7

Naprawdę nie ma niezawodnego sposobu na uzyskanie adresu IP komputera klienckiego.

To dotyczy niektórych możliwości. Kod korzystający z Java ulegnie awarii, jeśli użytkownik ma wiele interfejsów.

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

Patrząc na inne odpowiedzi tutaj, wydaje się, że możesz chcieć uzyskać publiczny adres IP klienta, który prawdopodobnie jest adresem routera, którego używają do łączenia się z Internetem. Wiele innych odpowiedzi tutaj mówi o tym. Polecam utworzenie i hosting własnej strony po stronie serwera w celu otrzymania żądania i odpowiedzi adresem IP zamiast polegać na usługach innych osób, które mogą nadal działać.

Sarel Botha
źródło
7

Mam zamiar zaoferować metodę, której często używam, gdy chcę przechowywać informacje na stronie HTML i chcę, aby mój javascript czytał informacje bez konieczności przekazywania parametrów do javascript. Jest to szczególnie przydatne, gdy skrypt jest przywoływany zewnętrznie, a nie inline.

Jednak nie spełnia kryterium „bez skryptu po stronie serwera”. Ale jeśli możesz dołączyć skrypty po stronie serwera do html, wykonaj następujące czynności:

Twórz ukryte elementy etykiet u dołu strony HTML, tuż nad tagiem end body.

Twoja etykieta będzie wyglądać następująco:

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

Pamiętaj, aby utworzyć klasę o nazwie hiddenlabeli ustawićvisibility:hidden tak, aby nikt nie widział etykiety. W ten sposób możesz przechowywać wiele rzeczy w ukrytych etykietach.

Teraz, aby pobrać informacje przechowywane na etykiecie (w tym przypadku adres IP klienta) w skrypcie javascript, możesz to zrobić:

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

Teraz twoja zmienna „ip” jest równa adresowi ip. Teraz możesz przekazać ip do żądania API.

* EDYCJA 2 LATA PÓŹNIEJ * Dwa drobne poprawki:

Rutynowo używam tej metody, ale nazywam etykietę class="data" , ponieważ w rzeczywistości jest to sposób przechowywania danych. Nazwa klasy „hiddenlabel” to głupia nazwa.

Druga modyfikacja znajduje się w arkuszu stylów zamiast visibility:hidden:

.data{
    display:none;
}

... to lepszy sposób na zrobienie tego.

TARKUS
źródło
3
Nie przechowuj danych w DOM. Dlaczego ktokolwiek miałby to sugerować, nawet 2 lata później? Jeśli możesz wstrzyknąć cokolwiek do pliku HTML, po prostu wstrzyknij tę wartość do zmiennej JS. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script>. Przynajmniej czytniki ekranu tego przegapią i nie będzie wymagane getElementById ani $ ('# głupia nazwa').
coblr
@fractalspawn, Z tego powodu, że nie możesz wstawić kodu php do pliku .js. Nie myślałeś o TYM, czy smarty spodniach! ;)
TARKUS
Cóż, mógłbyś, gdybyś zrobił <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script>, chociaż nie jestem pewien, dlaczego to zrobiłbyś. Chodzi mi o to, że jeśli PHP może wstawić cokolwiek do renderowanego HTML, najlepszą praktyką byłoby, aby wstawił wartość do zmiennej JS w obrębie wbudowanego znacznika skryptu, a nie do elementu DOM, który musiałbyś następnie przeanalizować w celu użycia i może zostać odczytany przez czytniki ekranu, chyba że podejmiesz dodatkowe środki, aby temu zapobiec.
coblr
Nie ma absolutnie żadnego dobrego powodu, dla którego nie można lub nie należy dodawać elementów przechowujących dane do DOM, i istnieje wiele dobrych powodów, aby to zrobić. W rzeczywistości te powody są w mojej odpowiedzi, jeśli zechcesz przeczytać ją ponownie. Jest niezawodny, łatwy do kontrolowania, a szczególnie przydatny, gdy plik javascript występuje w zdalnej witrynie. Mówiąc o zdalnym skrypcie, twój przykład „javascript.php” jest okropnym pomysłem i prawdopodobnie i tak by nie zadziałał. Pomyśl o zdalnych skryptach, takich jak DISQUS.
TARKUS
3
Do drugiego komentarza, dlaczego przechowywanie danych DOM jest złe ... cóż, nadal możesz zatrzymać samochód, delikatnie uderzając o ścianę w miejscu docelowym, ale są teraz lepsze narzędzia do tego zadania. Teraz wiemy lepiej i mamy świetne ramy, aby to złagodzić. Pracowałem w miejscu, w którym DOM był po prostu ogromnym plikiem konfiguracyjnym dla JS, a po zmianie stylu był to koszmar. Jeśli uważasz, że użycie <script src = "something.php"> jest „prymitywnym włamaniem”, ale przechowywanie danych w DOM, która ma tylko wartość w JavaScript, nie jest, to naprawdę cieszę się, że nie działamy razem i znowu chętnie zgodzą się nie zgadzać. :)
coblr
6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });
Atif Hussain
źródło
6

Przede wszystkim faktyczna odpowiedź : nie można użyć kodu wykonanego wyłącznie po stronie klienta, aby znaleźć swój własny adres IP.

Możesz jednak zrobić GET w kierunku https://api.muctool.de/whois i otrzymać coś w rodzaju uzyskania adresu IP klienta

{
"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
źródło
5

Możesz to zrobić całkowicie po stronie klienta, głównie w JavaScript, używając obiektu Flash, który może wywołać js. Flash może uzyskać dostęp do adresu IP komputera lokalnego, co może nie być bardzo przydatne.

ładniejszy przewoźnik
źródło
4
var call_to = "http://smart-ip.net/geoip-json?callback=?";

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

data.hostto adres IP. Po prostu zadzwoń do tego z poziomu przeglądarki.

http://smart-ip.net/geoip-json?callback=? [Bez cytatów] i zdobądź ip.

Jawwad Ahmed
źródło
przepraszam, co oznacza $ w javascript?
GHOST