Відповіді:
Я б використовував веб-сервіс, який може повернути JSON (разом з jQuery, щоб зробити речі простішими). Нижче наведено всі безкоштовні послуги активного пошуку IP, які я міг знайти, та інформацію, яку вони повертають. Якщо ви знаєте що-небудь більше, то будь ласка, додайте коментар, і я оновлю цю відповідь.
Спробуйте: 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)
})
Повернення:
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
Обмеження:
Спробуйте: http://api.db-ip.com/addrinfo?api_key= < ключ api > & addr = < ip адреса >
Повернення:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
Обмеження:
Спробуйте: http://gd.geobytes.com/GetCityDetails
$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
Обмеження:
Спробуйте: https://json.geoiplookup.io/api
$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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
}
Обмеження:
Спробуйте: http://www.geoplugin.net/json.gp
$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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
}
Обмеження:
Спробуйте: https://api.hackertarget.com/geoip/?q= < ip address >
Повернення:
IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
Обмеження:
Спробуйте: https://ipapi.co/json/
$.getJSON('https://ipapi.co/json/', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
Обмеження:
Спробуйте: http://ip-api.com/json
$.getJSON('http://ip-api.com/json?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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": ""
}
Обмеження:
Спробуйте: https://api.ipdata.co
$.getJSON('https://api.ipdata.co', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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
}
}
Обмеження:
Спробуйте: https://ipfind.co/me?auth= < ключ api >
$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
]
}
Обмеження:
Спробуйте: https://api.ipgeolocation.io/ipgeo?apiKey= < клавіша api >
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
}
Обмеження:
Спробуйте: https://api.ipify.org/?format=json
$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"ip": "116.12.250.1"
}
Обмеження:
Спробуйте: https://api.ipinfodb.com/v3/ip-city/?key= < клавіша api > & format = json
$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
Обмеження:
Спробуйте: https://ipinfo.io/json
$.getJSON('https://ipinfo.io/json', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
Обмеження:
Спробуйте: https://api.ipregistry.co/?key= < ключ api >
$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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
}
}
Обмеження:
Спробуйте: http://api.ipstack.com/ < ip address >? Access_key = <ваш ключ api>
$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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
}
}
Обмеження:
Спробуйте: https://jsonip.com
$.getJSON('https://jsonip.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"ip": "116.12.250.1",
"about": "https://jsonip.com/about",
"Pro!": "http://getjsonip.com",
"Get Notifications": "https://jsonip.com/notify"
}
Обмеження:
Спробуйте: http://ip.jsontest.com/
$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"ip": "116.12.250.1"
}
Обмеження:
Спробуйте: https://geoip.nekudo.com/api
$.getJSON('https://geoip.nekudo.com/api', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Повернення:
{
"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"
}
Обмеження:
Майте на увазі, що оскільки це все безкоштовні послуги, ваш пробіг може змінюватись за перевищенням квоти та тривалості роботи, і хто знає, коли / якщо вони будуть відведені в автономному режимі вниз по дорозі (виставка А: Теліз ). Більшість цих послуг також пропонують платний рівень, якщо ви хочете отримати більше функцій, таких як підтримка SSL.
Крім того, як зазначає skobaljic у коментарях нижче, квоти на запит здебільшого є академічними, оскільки це відбувається на стороні клієнта, і більшість кінцевих користувачів ніколи не перевищуватиме квоту.
ОНОВЛЕННЯ
Остаточне оновлення
Це рішення більше не працюватиме, оскільки браузери виправляють протікання webrtc: для отримання додаткової інформації про це прочитайте інше питання: RTCIceCandidate більше не повертає IP
Оновлення : я завжди хотів зробити мінімальну / невідомі версію коду, тому ось Обіцяючий код 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))
Примітка. Цей новий мінімізований код поверне лише один IP-код, якщо ви хочете, щоб усі IP-адреси користувача (що може бути більше залежно від його мережі), використовуйте оригінальний код ...
завдяки WebRTC дуже просто отримати локальний IP в браузерах, підтримуваних WebRTC (принаймні поки що). Я змінив вихідний код, скоротив рядки, не робив жодних запитів на оглушення, оскільки ви хочете лише локальний IP, а не публічний IP, наведений нижче код працює в останніх Firefox та Chrome, просто запустіть фрагмент і перевірте:
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>
що тут відбувається, ми створюємо манекенне однорангове з'єднання, і для віддаленого однорангового зв`язку з нами, ми, як правило, обмінюємось кандидатами з льоду між собою. І читаючи льодових кандидатів (з опису локальної сесії та onIceCandidateEvent), ми можемо сказати IP користувача.
звідки я взяв код -> Джерело
Ви можете, передаючи його через сервер на JSONP
І хоч googling, щоб знайти його, знайшов його тут на SO Чи можу я виконати пошук DNS (ім'я хоста на IP-адресу) за допомогою клієнтського Javascript?
<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>
Примітка: API telize.com остаточно закрито з 15 листопада 2015 року .
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Більшість відповідей тут "обходить" необхідність коду на стороні сервера, ... Забиваючи чужий сервер. Це цілком правильна методика, якщо вам насправді не потрібно отримувати IP-адресу, не потрапляючи на сервер.
Традиційно це було неможливо без якогось плагіна (і навіть тоді ви, ймовірно, отримаєте неправильну IP-адресу, якщо б ви стояли за NAT-роутером), але з появою WebRTC це реально зробити. . Якщо ви орієнтуєтеся браузери, підтримка WebRTC ( в даний час: Firefox, Chrome і Opera).
Будь ласка, прочитайте відповідь mido, щоб отримати детальну інформацію про те, як отримати корисні IP-адреси клієнта за допомогою WebRTC.
Ви можете здійснити дзвінок Ajax на hostip.info або подібний сервіс ...
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;
}
Як бонус, інформація про геолокалізацію повертається в той же дзвінок.
Спробуйте це
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
АБО
$(document).ready(function () {
$.getJSON("http://jsonip.com/?callback=?", function (data) {
console.log(data);
alert(data.ip);
});
});
Ви не можете. Вам доведеться запитати сервер.
Перевірте http://www.ipify.org/
За їх словами:
- Ви можете користуватися ним без обмежень (навіть якщо ви робите мільйони запитів в хвилину).
- ipify є повністю відкритим кодом (перегляньте сховище GitHub ).
Ось робочий приклад JS (замість того, щоб запитати, чому ця відповідь має так мало голосів, спробуйте самі, щоб побачити її в дії):
<script>
function getIP(json) {
alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
Занадто ліниво копіювати / вставляти? Мені це подобається. Ось 💻 демонстрація
Лено натискати? :O
Примітка . Вимкніть Adblock Plus / uBlock & co перед запуском демонстрації .. інакше це просто не працюватиме.
Я не маю нічого спільного з командою IPify. Я просто думаю, що смішно круто, що хтось надав би таку послугу на загальне благо.
Ви можете скористатися моєю службою http://ipinfo.io для цього, яка дасть вам клієнтський IP, ім'я хоста, інформацію про геолокацію та власника мережі. Ось простий приклад, який реєструє IP:
$.get("http://ipinfo.io", function(response) {
console.log(response.ip);
}, "jsonp");
Ось більш детальний приклад JSFiddle, який також виводить повну інформацію про відповіді, так що ви можете побачити всі доступні дані: http://jsfiddle.net/zK5FN/2/
http://ipinfo.io
на //ipinfo.io
або https
Включіть цей код на свою сторінку: <script type="text/javascript" src="http://l2.io/ip.js"></script>
більше док. тут
Я б сказав, що Чад і Мальта чудово відповідають. Однак їх складність. Тому я пропоную цей код, який я знайшов у плагінах оголошень по країні
<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>
Ніякого аяксу. Просто прості javascripts. : D
Якщо ви перейдете на сторінку http://j.maxmind.com/app/geoip.js, ви побачите, що вона містить
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 ''; }
Це ще не відповідає на це питання
http://j.maxmind.com/app/geoip.js не містить IP-адреси (хоча, я думаю, він використовує IP для отримання країни).
Але так просто зробити PHP-скрипт, що з'являється щось подібне
function visitorsIP() { return '123.123.123.123'; }
Зробіть це. Надіньте http://yourdomain.com/yourip.php .
Тоді робіть
<script language="javascript" src="http://yourdomain.com/yourip.php"></script>
У питанні конкретно згадується НЕ використовувати сценарій сторонніх розробників. Іншого шляху немає. Javascript не може знати вашу IP-адресу. Але інші сервери, до яких можна отримати доступ через javascript, можуть працювати так само добре, як без проблем.
На це питання є дві інтерпретації. Більшість людей інтерпретують "Клієнтський IP" означає загальнодоступну IP-адресу, яку веб-сервер бачить за межами локальної мережі та поза Інтернетом. Однак у більшості випадків це не IP-адреса клієнтського комп'ютера
Мені потрібна справжня IP-адреса комп'ютера, на якому працює браузер, на якому розміщено моє програмне забезпечення JavaScript (що майже завжди є локальною IP-адресою в локальній мережі, що знаходиться за чимось таким шаром NAT).
Mido розмістив вище відповідь FANTASTIC, що, здається, єдина відповідь, яка дійсно надала IP-адресу клієнта.
Дякую за це, Мідо!
Однак представлена функція працює асинхронно. Мені потрібно реально ВИКОРИСТИТИ IP-адресу в своєму коді, і за допомогою асинхронного рішення я можу спробувати використовувати IP-адресу, перш ніж її буде отримано / вивчено / збережено. Мені довелося чекати результатів, перш ніж їх використовувати.
Ось "Очікувана" версія функції Mido. Я сподіваюся, що це допоможе комусь іншому:
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>
Існує простіший і безкоштовний підхід, який не вимагає від відвідувача дозволу.
Він полягає у поданні дуже простого запиту Ajax POST на http://freegeoip.net/json . Отримавши інформацію про своє місцезнаходження, в JSON ви реагуєте відповідно оновленням сторінки або перенаправленням на нову.
Ось як ви подаєте запит на інформацію про місцезнаходження:
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.log(location)
}
} );
Ну, я відступаю від запитання, але в мене була подібна потреба сьогодні, і хоча я не зміг знайти ідентифікатор від клієнта за допомогою Javascript, я зробив наступне.
На стороні сервера: -
<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>
Використання Javascript
var ip = $get("uip").innerHTML;
Я використовую ASP.Net Ajax, але ви можете використовувати getElementById замість $ get ().
Що відбувається, у мене є прихований елемент div на сторінці з IP-адресою користувача, що надається з сервера. Тож у Javascript я просто завантажую це значення.
Це може бути корисним для деяких людей із подібною вимогою, як ваша (як я, поки я цього не з'ясував).
Ура!
<script>var uip='<%= Request.UserHostAddress %>';</script>
?
За допомогою Smart -IP.net Geo-IP API . Наприклад, використовуючи jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
Загалом це неможливо, якщо ви не використовуєте якусь зовнішню послугу.
Отримайте свій IP-адресу за допомогою jQuery
ви можете отримати вашу загальнодоступну IP-адресу одним рядком JS? Є безкоштовна послуга, яка пропонує вам це, і запит на отримання - це все, що вам потрібно зробити:
$.get('http://jsonip.com/', function(r){ console.log(r.ip); });
Для роботи вищевказаного фрагмента ваш веб-переглядач повинен буде підтримувати CORS (обмін запитом між походженнями). Інакше викид з безпеки буде кинутий. У старих браузерах ви можете використовувати цю версію, яка використовує запит JSON-P:
$.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });
Ви можете використовувати userinfo.io бібліотеку JavaScript.
<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
});
Ви також можете використовувати Requjs для завантаження сценарію.
Він дасть вам IP-адресу вашого відвідувача, а також декілька даних про його місцезнаходження (країну, місто тощо). Він заснований на базі даних maxmind geoip.
Відмова: Я написав цю бібліотеку
Javascript / jQuery отримати IP-адресу та місцезнаходження клієнта (країна, місто)
Вам потрібно лише вставити тег із посиланням "src" на сервер. Сервер поверне "codehelper_ip" як Object / JSON, і ви можете ним скористатися відразу.
// 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>
Більше інформації на Javascript Detect Real IP Address Plus Country
Якщо ви використовуєте jQUery, ви можете спробувати:
console.log(codehelper_ip);
Він покаже вам більше інформації про повернений об’єкт.
Якщо ви хочете функцію зворотного дзвінка, спробуйте:
// 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>
Послуга зворотного дзвінка Appspot.com недоступна. ipinfo.io, здається, працює.
Я зробив додатковий крок і отримав всю геоінформацію за допомогою AngularJS. (Спасибі Рікардо) Перевірте це.
<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>
Робоча сторінка тут: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html
Мені дуже подобається, api.ipify.org
тому що він підтримує і HTTP, і HTTPS.
Ось кілька прикладів отримання IP за api.ipify.org
допомогою 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>
Якщо ви не хочете цього в JSON, є також відповідь у прямому тексті через HTTPS
https://api.ipify.org
А також є відповідь на відкритий текст через HTTP
http://api.ipify.org
Використовуйте ipdata.co .
API також надає геолокаційні дані та має 10 глобальних кінцевих точок, кожна з яких може обробляти> 800M запитів на день!
У цій відповіді використовується тестовий ключ API, який дуже обмежений і призначений лише для тестування кількох викликів. Підпишіться на свій власний Безкоштовний ключ API та отримуйте до 1500 запитів щодня на розвиток.
$.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>
Насправді надійний спосіб отримати IP-адресу клієнтського комп'ютера.
Це проходить через деякі можливості. Код, який використовує Java, порушиться, якщо користувач має кілька інтерфейсів.
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
З огляду на інші відповіді тут, схоже, ви можете отримати загальнодоступну IP-адресу клієнта, яка, ймовірно, адреса маршрутизатора, який вони використовують для підключення до Інтернету. Багато інших відповідей тут говорять про це. Я рекомендую створити та розмістити свою власну сторону сервера для отримання запиту та відповіді з IP-адресою, а не залежно від чужої послуги, яка може або не може продовжувати працювати.
Я збираюся запропонувати метод, який я багато використовую, коли хочу зберігати інформацію на html-сторінці, і хочу, щоб мій JavaScript читав інформацію, фактично не передаваючи параметри на JavaScript. Це особливо корисно, коли на ваш сценарій посилаються зовні, а не вбудовані.
Однак він не відповідає критерію "сценарій без сервера". Але якщо ви можете включити скрипт на стороні сервера у свій HTML, зробіть це:
Зробіть приховані елементи мітки внизу сторінки html, трохи вище кінцевого тегу корпусу.
Ваш ярлик буде виглядати приблизно так:
<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>
Обов’язково створіть клас з назвою hiddenlabel
та встановіть visibility:hidden
так, щоб ніхто насправді не бачив мітку. Ви можете зберігати багато речей таким чином у прихованих етикетках.
Тепер, у вашому JavaScript, для отримання інформації, що зберігається на етикетці (у цьому випадку ip-адреса клієнта), ви можете зробити це:
var ip = document.getElementById("ip").innerHTML;
Тепер ваша змінна "ip" дорівнює ip-адресі. Тепер ви можете передати ip до свого запиту API.
* РЕДАКТУЙТЕ 2 РОКІВ ПІСНЕ * Два незначні уточнення:
Я звичайно використовую цей метод, але називаю мітку class="data"
, оскільки, насправді, це спосіб зберігання даних. Назва класу "hiddenlabel" - це різновид дурного імені.
Друга модифікація знаходиться в таблиці стилів замість visibility:hidden
:
.data{
display:none;
}
... це кращий спосіб зробити це.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Спробуйте це: http://httpbin.org/ip (або https://httpbin.org/ip )
Приклад із https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['origin']);
});
Джерело: http://httpbin.org/
Перш за все, власне відповідь : Неможливо використовувати суто виконаний на базі клієнта код, щоб дізнатися власну IP-адресу.
Однак ви можете просто зробити GET у напрямку https://api.muctool.de/whois і отримати щось на кшталт отримання IP-адреси клієнта.
{
"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
}
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
- ip-адреса. Просто зателефонуйте до цього із свого браузера.
http://smart-ip.net/geoip-json?callback=?
[Без лапок] і отримаємо ip.
$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });