Câu trả lời:
Tôi sẽ sử dụng một dịch vụ web có thể trả về JSON (cùng với jQuery để làm cho mọi thứ đơn giản hơn). Dưới đây là tất cả các dịch vụ tra cứu IP hoạt động miễn phí mà tôi có thể tìm thấy và thông tin họ trả về. Nếu bạn biết thêm bất cứ điều gì, xin vui lòng thêm một nhận xét và tôi sẽ cập nhật câu trả lời này.
Hãy dùng thử: 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)
})
Trả về:
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
Hạn chế:
Hãy dùng thử: http://api.db-ip.com/addrinfo?api_key= < khóa api của bạn > & addr = < địa chỉ ip >
Trả về:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
Hạn chế:
Hãy dùng thử: http://gd.geobytes.com/GetCityDetails
$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
}
Hạn chế:
Hãy dùng thử: https://json.geoiplookup.io/api
$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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
}
Hạn chế:
Hãy dùng thử: http://www.geoplugin.net/json.gp
$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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
}
Hạn chế:
Hãy dùng thử: https://api.hackertarget.com/geoip/?q= < địa chỉ ip >
Trả về:
IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
Hạn chế:
Hãy dùng thử: https://ipapi.co/json/
$.getJSON('https://ipapi.co/json/', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
}
Hạn chế:
Hãy dùng thử: http://ip-api.com/json
$.getJSON('http://ip-api.com/json?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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": ""
}
Hạn chế:
Hãy dùng thử: https://api.ipdata.co
$.getJSON('https://api.ipdata.co', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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
}
}
Hạn chế:
Hãy dùng thử: https://ipfind.co/me?auth= < khóa api của bạn >
$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
]
}
Hạn chế:
Hãy dùng thử: https://api.ipgeolocation.io/ipgeo?apiKey= < khóa api của bạn >
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
}
}
Hạn chế:
Hãy dùng thử: https://api.ipify.org/?format=json
$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"ip": "116.12.250.1"
}
Hạn chế:
Hãy dùng thử: https://api.ipinfodb.com/v3/ip-city/?key= < khóa api của bạn > & 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));
});
Trả về:
{
"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"
}
Hạn chế:
Hãy dùng thử: https://ipinfo.io/json
$.getJSON('https://ipinfo.io/json', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
}
Hạn chế:
Hãy dùng thử: https://api.ipregistry.co/?key= < khóa api của bạn >
$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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
}
}
Hạn chế:
Hãy dùng thử: http://api.ipstack.com/ < địa chỉ ip >? Access_key = <khóa api của bạn>
$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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
}
}
Hạn chế:
Hãy dùng thử: https://jsonip.com
$.getJSON('https://jsonip.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"ip": "116.12.250.1",
"about": "https://jsonip.com/about",
"Pro!": "http://getjsonip.com",
"Get Notifications": "https://jsonip.com/notify"
}
Hạn chế:
Hãy dùng thử: http://ip.jsontest.com/
$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"ip": "116.12.250.1"
}
Hạn chế:
Hãy dùng thử: https://geoip.nekudo.com/api
$.getJSON('https://geoip.nekudo.com/api', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Trả về:
{
"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"
}
Hạn chế:
Hãy nhớ rằng vì đây là tất cả các dịch vụ miễn phí, số dặm của bạn có thể khác nhau về việc vượt quá hạn ngạch và thời gian hoạt động, và ai biết khi nào / nếu chúng sẽ được đưa ra ngoại tuyến (triển lãm A: Telize ). Hầu hết các dịch vụ này cũng cung cấp một tầng trả phí trong trường hợp bạn muốn có nhiều tính năng hơn như hỗ trợ SSL.
Ngoài ra, như skobaljic đã lưu ý trong các bình luận bên dưới, hạn ngạch yêu cầu chủ yếu mang tính học thuật vì điều này xảy ra ở phía khách hàng và hầu hết người dùng cuối sẽ không bao giờ vượt quá hạn ngạch.
CẬP NHẬT
Cập nhật cuối cùng
Giải pháp này sẽ không còn hoạt động vì các trình duyệt đang sửa lỗi rò rỉ webrtc: để biết thêm thông tin về việc đọc câu hỏi khác này: RTCIceCandidate không còn trả lại IP
Cập nhật : Tôi luôn muốn tạo một phiên bản mã tối thiểu / xấu xí, vì vậy đây là mã 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))
Lưu ý: Mã rút gọn mới này sẽ chỉ trả về một IP duy nhất nếu bạn muốn tất cả IP của người dùng (có thể phụ thuộc nhiều hơn vào mạng của anh ấy), sử dụng mã gốc ...
nhờ có WebRTC , rất dễ dàng để có được IP cục bộ trong các trình duyệt được hỗ trợ WebRTC (ít nhất là bây giờ). Tôi đã sửa đổi mã nguồn, giảm các dòng, không thực hiện bất kỳ yêu cầu gây choáng nào vì bạn chỉ muốn IP cục bộ, không phải IP công cộng, mã dưới đây hoạt động trong Firefox và Chrome mới nhất, chỉ cần chạy đoạn trích và tự kiểm tra:
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>
những gì đang xảy ra ở đây là, chúng tôi đang tạo ra một kết nối ngang hàng giả, và để các đồng nghiệp từ xa liên hệ với chúng tôi, chúng tôi thường trao đổi các ứng cử viên băng với nhau. Và đọc các ứng cử viên băng (từ mô tả phiên địa phương và onIceCandidateEvent), chúng tôi có thể cho biết IP của người dùng.
nơi tôi lấy mã từ -> Nguồn
Bạn có thể, chuyển tiếp nó qua phía máy chủ với JSONP
Và trong khi tìm kiếm một cái, tìm thấy nó ở đây trên SO Tôi có thể thực hiện tra cứu DNS (tên máy chủ thành địa chỉ IP) bằng Javascript phía máy khách không?
<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>
Lưu ý: API telize.com đã ngừng hoạt động vĩnh viễn kể từ ngày 15 tháng 11 năm 2015 .
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Hầu hết các câu trả lời ở đây "giải quyết" nhu cầu về mã phía máy chủ bằng cách ... Đánh vào máy chủ của người khác. Đây là một kỹ thuật hoàn toàn hợp lệ, trừ khi bạn thực sự cần lấy địa chỉ IP mà không cần nhấn máy chủ.
Theo truyền thống, điều này là không thể nếu không có một số plugin (và thậm chí sau đó, bạn có thể nhận được địa chỉ IP sai nếu bạn đứng sau bộ định tuyến NAT), nhưng với sự ra đời của WebRTC, thực sự có thể làm điều này .. . Nếu bạn đang nhắm mục tiêu các trình duyệt hỗ trợ WebRTC (hiện tại: Firefox, Chrome và Opera).
Vui lòng đọc câu trả lời của mid để biết chi tiết về cách bạn có thể truy xuất các địa chỉ IP khách hàng hữu ích bằng WebRTC.
Bạn có thể thực hiện cuộc gọi ajax đến hostip.info hoặc một dịch vụ tương tự ...
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;
}
Như một phần thưởng, thông tin định vị địa lý được trả lại trong cùng một cuộc gọi.
Thử cái này
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
HOẶC LÀ
$(document).ready(function () {
$.getJSON("http://jsonip.com/?callback=?", function (data) {
console.log(data);
alert(data.ip);
});
});
Bạn không thể. Bạn sẽ phải hỏi một máy chủ.
Hãy xem http://www.ipify.org/
Theo họ:
- Bạn có thể sử dụng nó không giới hạn (ngay cả khi bạn đang thực hiện hàng triệu yêu cầu mỗi phút).
- ipify là nguồn mở hoàn toàn (kiểm tra kho GitHub ).
Đây là một ví dụ về JS hoạt động (thay vì tự hỏi tại sao câu trả lời này có quá ít phiếu bầu, hãy tự mình thử xem nó hoạt động):
<script>
function getIP(json) {
alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
Quá lười để sao chép / dán? Tôi thích nó. Đây là bản demo
Quá lười để nhấp? :O
Lưu ý : Tắt Adblock Plus / uBlock & co trước khi chạy bản demo .. nếu không, nó sẽ không hoạt động.
Tôi không có gì để làm với nhóm IPify. Tôi chỉ nghĩ rằng thật tuyệt vời khi ai đó sẽ cung cấp một dịch vụ như vậy vì lợi ích chung.
Bạn có thể sử dụng dịch vụ của tôi http://ipinfo.io cho việc này, dịch vụ này sẽ cung cấp cho bạn IP khách, tên máy chủ, thông tin định vị địa lý và chủ sở hữu mạng. Đây là một ví dụ đơn giản ghi nhật ký IP:
$.get("http://ipinfo.io", function(response) {
console.log(response.ip);
}, "jsonp");
Dưới đây là một ví dụ JSFiddle chi tiết hơn cũng in ra thông tin phản hồi đầy đủ, vì vậy bạn có thể thấy tất cả các chi tiết có sẵn: http://jsfiddle.net/zK5FN/2/
http://ipinfo.io
thành //ipinfo.io
hoặc https
Bao gồm mã này trong trang của bạn: <script type="text/javascript" src="http://l2.io/ip.js"></script>
thêm tài liệu ở đây
Tôi muốn nói Chad và Malta có câu trả lời tuyệt vời. Tuy nhiên, chúng rất phức tạp. Vì vậy, tôi đề xuất mã này mà tôi tìm thấy từ quảng cáo của plugin quốc gia
<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>
Không có ajax. Chỉ cần javascripts. : D
Nếu bạn truy cập http://j.maxmind.com/app/geoip.js bạn sẽ thấy nó chứa
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 ''; }
Nó không thực sự trả lời câu hỏi vì
http://j.maxmind.com/app/geoip.js không chứa IP (mặc dù tôi cá là nó sử dụng IP để lấy quốc gia).
Nhưng thật dễ dàng để tạo một tập lệnh PhP nổi bật như
function visitorsIP() { return '123.123.123.123'; }
Làm điều đó Đặt trên http://yourdomain.com/yourip.php .
Sau đó làm
<script language="javascript" src="http://yourdomain.com/yourip.php"></script>
Câu hỏi đề cập cụ thể KHÔNG sử dụng tập lệnh của bên thứ ba. Không có cách nào khác. Javascript không thể biết IP của bạn. Nhưng các máy chủ khác có thể được truy cập thông qua javascript có thể hoạt động tốt mà không có vấn đề gì.
Có hai cách giải thích cho câu hỏi này. Hầu hết mọi người giải thích "IP khách hàng" có nghĩa là Địa chỉ IP công cộng mà máy chủ Web nhìn thấy bên ngoài mạng LAN và trên Internet. Tuy nhiên, đây không phải là địa chỉ IP của máy khách
Tôi cần địa chỉ IP thực của máy tính đang chạy trình duyệt đang lưu trữ phần mềm JavaScript của tôi (gần như luôn luôn là địa chỉ IP cục bộ trên mạng LAN nằm sau lớp NAT).
Mido đã đăng một câu trả lời FANTASTIC, ở trên, đó dường như là câu trả lời duy nhất thực sự cung cấp địa chỉ IP của khách hàng.
Cảm ơn vì điều đó, Mido!
Tuy nhiên, chức năng được trình bày chạy không đồng bộ. Tôi thực sự cần phải sử dụng địa chỉ IP trong mã của mình và với giải pháp không đồng bộ, tôi có thể thử sử dụng địa chỉ IP trước khi lấy / học / lưu trữ. Tôi đã phải chờ kết quả để đến trước khi sử dụng chúng.
Đây là phiên bản "Chờ" của chức năng Mido. Tôi hy vọng nó sẽ giúp người khác:
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>
Có một cách tiếp cận dễ dàng và miễn phí hơn sẽ không yêu cầu khách truy cập của bạn cho phép.
Nó bao gồm việc gửi một yêu cầu POST POST rất đơn giản tới http://freegeoip.net/json . Khi bạn nhận được thông tin vị trí của mình, trong JSON, bạn sẽ phản ứng tương ứng bằng cách cập nhật trang hoặc chuyển hướng đến một trang mới.
Đây là cách bạn gửi yêu cầu của bạn cho thông tin vị trí:
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.log(location)
}
} );
Vâng, tôi đang lạc đề từ câu hỏi, nhưng tôi có một nhu cầu tương tự ngày hôm nay và mặc dù tôi không thể tìm thấy ID từ khách hàng bằng Javascript, tôi đã làm như sau.
Về phía máy chủ: -
<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>
Sử dụng Javascript
var ip = $get("uip").innerHTML;
Tôi đang sử dụng ASP.Net Ajax, nhưng bạn có thể sử dụng getEuityById thay vì $ get ().
Điều gì đang xảy ra là, tôi đã có một yếu tố div ẩn trên trang với IP của người dùng được hiển thị từ máy chủ. Hơn trong Javascript tôi chỉ tải giá trị đó.
Điều này có thể hữu ích cho một số người có yêu cầu tương tự như của bạn (như tôi trong khi tôi chưa tìm ra điều này).
Chúc mừng!
<script>var uip='<%= Request.UserHostAddress %>';</script>
?
Với việc sử dụng API Geo-IP Smart-IP.net . Ví dụ: bằng cách sử dụng jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
Nói chung là không thể trừ khi bạn sử dụng một số loại dịch vụ bên ngoài.
Nhận IP của bạn với jQuery
bạn có thể lấy địa chỉ IP công cộng của mình bằng một dòng JS không? Có một dịch vụ miễn phí cung cấp dịch vụ này cho bạn và yêu cầu nhận là tất cả những gì bạn cần làm:
$.get('http://jsonip.com/', function(r){ console.log(r.ip); });
Để đoạn mã trên hoạt động, trình duyệt của bạn sẽ phải hỗ trợ CORS (chia sẻ yêu cầu nguồn gốc chéo). Nếu không, một ngoại lệ bảo mật sẽ được ném. Trong các trình duyệt cũ hơn, bạn có thể sử dụng phiên bản này, sử dụng yêu cầu JSON-P:
$.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });
Bạn có thể sử dụng thư viện 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
});
Bạn cũng có thể sử dụng các yêu cầu để tải tập lệnh.
Nó sẽ cung cấp cho bạn địa chỉ IP của khách truy cập của bạn, cũng như một vài dữ liệu về vị trí của nó (quốc gia, thành phố, v.v.). Nó dựa trên cơ sở dữ liệu maxmind Geoip.
Tuyên bố miễn trừ trách nhiệm: Tôi đã viết thư viện này
Javascript / jQuery nhận Địa chỉ & Địa chỉ IP của Khách hàng (Quốc gia, Thành phố)
Bạn chỉ cần nhúng một thẻ với liên kết "src" đến máy chủ. Máy chủ sẽ trả về "codehelper_ip" dưới dạng Object / JSON và bạn có thể sử dụng nó ngay lập tức.
// 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>
Thêm thông tin tại Javascript Phát hiện địa chỉ IP thực cộng với quốc gia
Nếu bạn đang sử dụng jQUery, bạn có thể thử:
console.log(codehelper_ip);
Nó sẽ cho bạn thấy nhiều thông tin hơn về đối tượng trả lại.
Nếu bạn muốn chức năng gọi lại, vui lòng thử điều này:
// 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>
Dịch vụ gọi lại của Appspot.com không khả dụng. ipinfo.io dường như đang làm việc.
Tôi đã làm thêm một bước và lấy tất cả thông tin địa lý bằng AngularJS. (Cảm ơn Ricardo) Hãy xem thử.
<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>
Trang làm việc tại đây: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html
Tôi thật sự thích api.ipify.org
vì nó hỗ trợ cả HTTP và HTTPS.
Dưới đây là một số ví dụ về việc sử dụng địa chỉ IP api.ipify.org
cách sử dụng 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>
Nếu bạn không muốn nó trong JSON, thì cũng có một phản hồi rõ ràng trên HTTPS
https://api.ipify.org
Và cũng có một phản hồi rõ ràng qua HTTP
http://api.ipify.org
sử dụng ipdata.co .
API cũng cung cấp dữ liệu định vị địa lý và có 10 điểm cuối toàn cầu, mỗi điểm có thể xử lý> 800 triệu yêu cầu mỗi ngày!
Câu trả lời này sử dụng Khóa API 'kiểm tra' rất hạn chế và chỉ có nghĩa là để thử nghiệm một vài cuộc gọi. Đăng ký Khóa API miễn phí của riêng bạn và nhận tới 1500 yêu cầu hàng ngày để phát triển.
$.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>
Thực sự không có cách nào đáng tin cậy để lấy địa chỉ IP của máy khách.
Điều này đi qua một số khả năng. Mã sử dụng Java sẽ bị hỏng nếu người dùng có nhiều giao diện.
http://nanoagent.blogspot.com/2006/09/how-to-find-evalu-remoteaddrclents.html
Nhìn vào các câu trả lời khác ở đây, có vẻ như bạn có thể muốn lấy địa chỉ IP công khai của khách hàng, có lẽ là địa chỉ của bộ định tuyến họ đang sử dụng để kết nối với internet. Rất nhiều câu trả lời khác ở đây nói về điều đó. Tôi sẽ khuyên bạn nên tạo và lưu trữ trang bên máy chủ của riêng bạn để nhận yêu cầu và trả lời bằng địa chỉ IP thay vì phụ thuộc vào dịch vụ của người khác có thể tiếp tục hoạt động.
Tôi sẽ cung cấp một phương pháp mà tôi sử dụng rất nhiều khi tôi muốn lưu trữ thông tin trong trang html và muốn javascript của tôi đọc thông tin mà không thực sự phải truyền tham số cho javascript. Điều này đặc biệt hữu ích khi tập lệnh của bạn được tham chiếu bên ngoài, thay vì nội tuyến.
Tuy nhiên, nó không đáp ứng tiêu chí "không có kịch bản phía máy chủ". Nhưng nếu bạn có thể bao gồm kịch bản phía máy chủ trong html của mình, hãy làm điều này:
Tạo các thành phần nhãn ẩn ở cuối trang html của bạn, ngay phía trên thẻ thân cuối.
Nhãn của bạn sẽ trông như thế này:
<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>
Hãy chắc chắn để tạo một lớp được gọi hiddenlabel
và thiết lậpvisibility:hidden
để không ai thực sự nhìn thấy nhãn. Bạn có thể lưu trữ nhiều thứ theo cách này, trong các nhãn ẩn.
Bây giờ, trong javascript của bạn, để lấy thông tin được lưu trong nhãn (trong trường hợp này là địa chỉ IP của khách hàng), bạn có thể làm điều này:
var ip = document.getElementById("ip").innerHTML;
Bây giờ biến "ip" của bạn bằng địa chỉ ip. Bây giờ bạn có thể chuyển ip cho yêu cầu API của bạn.
* CHỈNH SỬA 2 NĂM Hai sàng lọc nhỏ:
Tôi thường xuyên sử dụng phương pháp này, nhưng gọi nhãn class="data"
, bởi vì, trên thực tế, đó là một cách để lưu trữ dữ liệu. Tên lớp "hiddenlabel" là một loại tên ngu ngốc.
Sửa đổi thứ hai là trong biểu định kiểu, thay vì visibility:hidden
:
.data{
display:none;
}
... là cách tốt hơn để làm điều đó.
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Hãy thử điều này: http://httpbin.org/ip (hoặc https://httpbin.org/ip )
Ví dụ với https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['origin']);
});
Nguồn: http://httpbin.org/
Trước hết câu trả lời thực tế : Không thể sử dụng mã thực thi hoàn toàn phía máy khách để tìm ra địa chỉ IP của riêng bạn.
Tuy nhiên, bạn chỉ có thể thực hiện NHẬN về https://api.muctool.de/whois và nhận được một cái gì đó như để có được địa chỉ IP của khách hàng
{
"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
}
Bạn có thể thực hiện điều này hoàn toàn phía máy khách và chủ yếu bằng JavaScript bằng cách sử dụng đối tượng Flash mà js có thể gọi. Flash có thể truy cập địa chỉ IP của máy cục bộ có thể không hữu ích lắm.
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.host);
});
data.host
là địa chỉ IP. Đơn giản chỉ cần gọi đây từ trình duyệt của bạn.
http://smart-ip.net/geoip-json?callback=?
[Không có dấu ngoặc kép] và nhận được ip.
$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });