Odpowiedzi:
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ź.
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:
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:
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:
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:
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": "$",
"geoplugin_currencySymbol_UTF8": "$",
"geoplugin_currencyConverter": 1.4239
}
Ograniczenia:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
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
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 .
Error Over Quota This application is temporarily over its serving quota. Please try again later.
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.
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.
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);
});
});
Nie możesz Musisz zapytać serwer.
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.
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/
http://ipinfo.io
do //ipinfo.io
lub https
Dodaj ten kod na swojej stronie: <script type="text/javascript" src="http://l2.io/ip.js"></script>
więcej dokumentów tutaj
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.
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>
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)
}
} );
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!
<script>var uip='<%= Request.UserHostAddress %>';</script>
?
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);
}
);
});
Zwykle nie jest to możliwe, chyba że korzystasz z usług zewnętrznych.
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); });
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ę
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>
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
Bardzo mi się podoba, api.ipify.org
ponieważ obsługuje zarówno HTTP, jak i HTTPS.
Oto kilka przykładów uzyskiwania adresu IP przy api.ipify.org
użyciu jQuery.
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>
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>
Jeśli nie chcesz tego w JSON, istnieje również odpowiedź w postaci zwykłego tekstu przez HTTPS
https://api.ipify.org
Istnieje również odpowiedź w postaci zwykłego tekstu przez HTTP
http://api.ipify.org
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>
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ć.
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 hiddenlabel
i 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.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Spróbuj tego: http://httpbin.org/ip (lub https://httpbin.org/ip )
Przykład z https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['origin']);
});
Źródło: http://httpbin.org/
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
}
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.
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
to 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.
$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });