ฉันต้องการดึงที่อยู่ IP ของลูกค้าโดยใช้ JavaScript ไม่มีรหัสฝั่งเซิร์ฟเวอร์หรือแม้แต่ SSI
อย่างไรก็ตามฉันไม่ได้ใช้สคริปต์ / บริการของบุคคลที่สามฟรี
ฉันต้องการดึงที่อยู่ IP ของลูกค้าโดยใช้ JavaScript ไม่มีรหัสฝั่งเซิร์ฟเวอร์หรือแม้แต่ SSI
อย่างไรก็ตามฉันไม่ได้ใช้สคริปต์ / บริการของบุคคลที่สามฟรี
คำตอบ:
ฉันจะใช้บริการเว็บที่สามารถส่งคืน 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 >
ผลตอบแทน:
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 >? 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"
}
ข้อ จำกัด :
โปรดทราบว่าเนื่องจากบริการเหล่านี้เป็นบริการฟรีระยะทางของคุณอาจแตกต่างกันไปในแง่ของโควต้าและเวลาที่เกินและใครจะรู้ว่าเมื่อใดที่พวกเขาจะถูกพาไปที่ออฟไลน์ (แสดง A: Telize ) บริการเหล่านี้ส่วนใหญ่มีระดับแบบชำระเงินในกรณีที่คุณต้องการคุณสมบัติเพิ่มเติมเช่นการสนับสนุน SSL
นอกจากนี้ตามที่ skobaljic ระบุไว้ในความคิดเห็นด้านล่างโควต้าคำขอส่วนใหญ่เป็นข้อมูลเชิงวิชาการเนื่องจากสิ่งนี้เกิดขึ้นกับลูกค้าและผู้ใช้ส่วนใหญ่จะไม่เกินโควต้า
การปรับปรุง
การปรับปรุงครั้งสุดท้าย
วิธีนี้จะไม่ทำงานอีกต่อไปเพราะเบราว์เซอร์กำลังแก้ไขการรั่วไหลของ webrtc: สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านคำถามอื่น ๆ นี้: RTCIceCandidate ไม่ส่งคืน IP
อัปเดต : ฉันต้องการสร้างรหัสรุ่น min / uglified เสมอดังนั้นนี่คือรหัสสัญญา 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 (อย่างน้อยก็ตอนนี้) ฉันได้แก้ไขซอร์สโค้ดลดจำนวนบรรทัดไม่ทำการร้องขอใด ๆ เพราะคุณต้องการเฉพาะ Local IP ไม่ใช่ Public 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>
หมายเหตุ: telize.com API ได้อย่างถาวรปิด ณ วันที่ 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>
ไม่มีอาแจ็กซ์ เพียงแค่จาวาสคริปต์ : 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 ของคุณ แต่เซิร์ฟเวอร์อื่น ๆ ที่สามารถเข้าถึงได้ผ่านทางจาวาสคริปต์สามารถทำงานได้ดีและไม่มีปัญหา
คำถามนี้มีการตีความสองแบบ คนส่วนใหญ่ตีความว่า "IP ของลูกค้า" เพื่อหมายถึงที่อยู่ IP สาธารณะที่เว็บเซิร์ฟเวอร์มองเห็นนอก LAN และบนอินเทอร์เน็ต อย่างไรก็ตามนี่ไม่ใช่ที่อยู่ IP ของคอมพิวเตอร์ไคลเอนต์ในกรณีส่วนใหญ่
ฉันต้องการที่อยู่ IP ที่แท้จริงของคอมพิวเตอร์ที่ใช้งานเบราว์เซอร์ที่โฮสต์ซอฟต์แวร์ JavaScript ของฉัน (ซึ่งมักจะเป็นที่อยู่ IP ในระบบ LAN ที่อยู่เบื้องหลังสิ่งที่เลเยอร์ NAT)
Mido โพสต์คำตอบ FANTASTIC ข้างต้นดูเหมือนจะเป็นคำตอบเดียวที่ให้ที่อยู่ IP ของลูกค้า
ขอบคุณสำหรับสิ่งนั้นมิโดะ!
อย่างไรก็ตามฟังก์ชั่นที่นำเสนอทำงานแบบอะซิงโครนัส ฉันจำเป็นต้องใช้ที่อยู่ IP ในรหัสของฉันและด้วยวิธีแก้ปัญหาแบบอะซิงโครนัสฉันอาจลองใช้ที่อยู่ IP ก่อนที่จะดึง / เรียนรู้ / เก็บไว้ ฉันต้องสามารถรอผลที่จะมาถึงก่อนที่จะใช้พวกเขา
นี่คือฟังก์ชันของ Mido เวอร์ชัน "Waitable" ฉันหวังว่ามันจะช่วยคนอื่น:
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>
มีวิธีการที่ง่ายและฟรีที่จะไม่ขออนุญาตจากผู้เยี่ยมชมของคุณ
มันประกอบในการส่งคำขออาแจ็กซ์ POST ง่ายมากที่จะhttp://freegeoip.net/json เมื่อคุณได้รับข้อมูลตำแหน่งของคุณใน JSON คุณจะตอบสนองตามนั้นโดยอัพเดทหน้าเว็บหรือเปลี่ยนเส้นทางไปยังหน้าใหม่
นี่คือวิธีที่คุณส่งคำขอข้อมูลตำแหน่งที่ตั้ง:
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.log(location)
}
} );
ดีฉันกำลังพูดนอกเรื่องจากคำถาม แต่ฉันมีความต้องการที่คล้ายกันในวันนี้และแม้ว่าฉันไม่พบ ID จากไคลเอนต์ที่ใช้ 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
คุณสามารถรับที่อยู่สาธารณะของคุณด้วย 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); });
คุณสามารถใช้ไลบรารี 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
});
คุณยังสามารถใช้ requirejs เพื่อโหลดสคริปต์
มันจะให้ที่อยู่ 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 (ขอบคุณ Ricardo) ลองดูสิ
<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
หากคุณรวมไฟล์ anways คุณสามารถทำ ajax ง่ายๆ
function ip_callback() {
$.get("ajax.getIp.php",function(data){ return data; }
}
และajax.getIp.php
จะเป็นเช่นนี้:
<?=$_SERVER['REMOTE_ADDR']?>
ฉันชอบ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
API ยังให้ข้อมูลตำแหน่งทางภูมิศาสตร์และมีจุดปลาย 10 จุดทั่วโลกแต่ละแห่งสามารถจัดการ> คำขอ 800M ต่อวัน!
คำตอบนี้ใช้คีย์ 'ทดสอบ' API ที่มี จำกัด มากและใช้สำหรับการทดสอบการโทรไม่กี่ครั้งเท่านั้น ลงทะเบียนสำหรับรหัส API ฟรีของคุณเองและรับคำขอได้มากถึง 1,500 คำขอต่อวันเพื่อการพัฒนา
$.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 และต้องการให้จาวาสคริปต์ของฉันอ่านข้อมูลโดยไม่ต้องผ่านพารามิเตอร์ไปยังจาวาสคริปต์ สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อสคริปต์ของคุณถูกอ้างอิงจากภายนอกแทนที่จะเป็นแบบอินไลน์
อย่างไรก็ตามไม่เป็นไปตามเกณฑ์ของ "ไม่มีสคริปต์ฝั่งเซิร์ฟเวอร์" แต่ถ้าคุณสามารถรวมสคริปต์ฝั่งเซิร์ฟเวอร์ไว้ใน html ของคุณให้ทำดังนี้:
สร้างองค์ประกอบป้ายกำกับที่ซ่อนอยู่ที่ด้านล่างของหน้า html ของคุณเหนือแท็กส่วนท้าย
ป้ายกำกับของคุณจะมีลักษณะดังนี้:
<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>
ตรวจสอบให้แน่ใจว่าได้เรียกคลาสhiddenlabel
แล้วตั้งค่าvisibility:hidden
ให้ไม่มีใครเห็นป้ายกำกับจริง คุณสามารถจัดเก็บสิ่งต่าง ๆ มากมายด้วยวิธีนี้ในป้ายกำกับที่ซ่อนอยู่
ตอนนี้ในจาวาสคริปต์ของคุณเพื่อดึงข้อมูลที่เก็บไว้ในฉลาก (ในกรณีนี้คือที่อยู่ IP ของลูกค้า) คุณสามารถทำได้:
var ip = document.getElementById("ip").innerHTML;
ตอนนี้ตัวแปร "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
}
คุณสามารถทำได้ทั้งฝั่งไคลเอ็นต์และส่วนใหญ่ใน JavaScript โดยใช้วัตถุ Flash ที่ js สามารถโทรได้ Flash สามารถเข้าถึงที่อยู่ IP ของเครื่องในพื้นที่ซึ่งอาจไม่มีประโยชน์มาก
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'); });