如何使用JavaScript获取客户端的IP地址? [已关闭]
如何使用JavaScript获取客户端的IP地址? [已关闭]
通过使用JSONP在服务器端进行中转
在Google中寻找,发现在SO上找到了这个问题的答案:可以使用客户端JavaScript执行DNS查找(主机名到IP地址)?
<script type="application/javascript">
function getip(json){
alert(json.ip); // 弹出IP地址
}
</script>
<script type="application/javascript" src="http://www.telize.com/jsonip?callback=getip"></script>
注意:telize.com API已经在2015年11月15日永久关闭。
虽然我很欣赏这个代码片段,但是我认为加载JavaScript文本内容并通过函数进行评估存在严重的安全风险。如果响应内容发生变化,那么所有100多人都会调用这个可能包含不安全内容的函数。我只会在返回的是JSON字符串时使用这个方法。
错误 配额超限 此应用程序暂时超过了其服务配额。请稍后重试。
这不是一个好的答案,因为它涉及到服务器端请求。问题明确说明了“纯粹的JavaScript”。
Micah,没有可能仅通过JavaScript获取IP地址。我建议你阅读一下NAT以及它的工作原理。你需要一个服务器来将你的互联网IP地址回传给你。
该服务现已关闭。
是的,该服务的创建者关闭了它,因为它被垃圾邮件/恶意软件滥用。请参阅他的帖子:cambus.net/adventures-in-running-a-free-public-api
stupidwebtools.com/api/my_ip.txt 或 stupidwebtools.com/api/my_ip.json 或 stupidwebtools.com/api/my_ip.xml
此基于互联网的脚本现在永久失效。删除无效的代码后,这个答案变成了“你可以Google来找到一些东西”的答案。所以它不再是Stack Overflow的答案定义中的答案了。很抱歉,但我建议你将其删除以便给工作的答案提供可见性。
如何使用JavaScript获取客户端的IP地址?[已关闭]
最近的一个Github存储库webrtc-ip显示,您现在可以使用WebRTC泄露用户的公共IP地址。不幸的是,由于逐渐转向mDNS(至少对于WebRTC),此泄漏不适用于私有IP。然而,下面的代码段是一个可行的演示:
getIPs().then(res => document.write(res.join('\n')))
此存储库的编译源代码可以在此处找到。
(之前的)最终更新:此解决方案将不再起作用,因为浏览器正在修复webrtc泄漏。有关更多信息,请阅读此问题:RTCIceCandidate不再返回IP。
更新:我一直想制作代码的精简/混淆版本,这是一个ES6 Promise代码示例:
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));
感谢WebRTC,使用受WebRTC支持的浏览器非常容易获取本地IP(至少目前如此)。我修改了源代码,减少了行数,不进行任何STUN请求,因为您只想要本地IP而不是公共IP,下面的代码在最新的Firefox和Chrome中运行正常,请运行片段进行检查:
function findIP(onNewIP) { var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 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(""); 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); pc.onicecandidate = function(ice) { 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);
在这里发生的情况是,我们创建了一个虚拟对等连接,并且为了远程对等方与我们联系,我们通常会互换ice候选项。通过读取ice候选项(从本地会话描述和onIceCandidateEvent中),我们可以获取用户的IP。
我从这里获取了代码。
在Firefox 26中出现了“错误:RTCPeerConnection构造函数传递了无效的RTCConfiguration - 格式错误的URI:undefined”。
更新代码以在Firefox 26中正常工作,已在Windows机器上检查,请您确认一下。
我可以获取到我的内部网络IP地址,太棒了!
在三星移动设备的com.android.chrome上无法正常工作-返回的是MAC地址。
警告:这不显示您的公共IP,只显示本地网络IP。例如,您不能使用它来检测用户所在的国家,如果他们在LAN上。
您也可以使用STUN服务器获取公共IP(并在创建对等方时进行配置),但这将需要您维护/使用STUN服务器,并引入服务器代码。
这被称为WebRTC泄漏。所有主要浏览器应该解决此问题,但事实并非如此。有关更多信息,请参阅此处:privacytools.io/webrtc.html。可能与Tor浏览器泄漏您的真实IP地址有关。
这显示了我的私有地址,而不是公共地址。
如何使用JavaScript获取客户端的IP地址?
要获取客户端的IP地址,可以使用以下方法之一:
1. 使用Web服务和jQuery进行JSON返回。下面是一些免费的IP查找服务和它们返回的信息:
- Abstract:
let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2'; $.getJSON('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- BigDataCloud:
let apiKey = 'd9e53816d07345139c58d0ea733e3870'; $.getJSON('https://api.bigdatacloud.net/data/ip-geolocation?key=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- Cloudflare:
$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) { data = data.trim().split('\n').reduce(function(obj, pair) { pair = pair.split('='); return obj[pair[0]] = pair[1], obj; }, {}); console.log(data); });
- DB-IP:
$.getJSON('https://api.db-ip.com/v2/free/self', function(data) { console.log(JSON.stringify(data, null, 2)); });
- Geobytes:
$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); });
- GeoIPLookup.io:
$.getJSON('https://json.geoiplookup.io/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); });
- geoPlugin:
$.getJSON('http://www.geoplugin.net/json.gp', function(data) { console.log(JSON.stringify(data, null, 2)); });
- Hacker Target:
$.get('https://api.hackertarget.com/geoip/?q=116.12.250.1', function(data) { data = data.trim().split('\n').reduce(function(obj, pair) { pair = pair.split(': '); return obj[pair[0]] = pair[1], obj; }, {}); console.log(data); });
- ipapi:
$.getJSON('https://ipapi.co/json/', function(data) { console.log(JSON.stringify(data, null, 2)); });
- IP-API:
$.getJSON('http://ip-api.com/json', function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipdata:
let apiKey = 'be0f755b93290b4c100445d77533d291763a417c75524e95e07819ad'; $.getJSON('https://api.ipdata.co?api-key=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- IP Find:
let apiKey = '50e887ce-e3bb-4f00-a9b9-667597db5539'; $.getJSON('https://ipfind.co/me?auth=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipgeolocation:
let apiKey = 'f8e0b361e8f4405c94613ab534959fdf'; $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipify:
$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); });
- IPInfoDB:
let apiKey = '25864308b6a77fd90f8bf04b3021a48c1f2fb302a676dd3809054bc1b07f5b42'; $.getJSON('https://api.ipinfodb.com/v3/ip-city/?format=json&key=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipinfo.io:
$.getJSON('https://ipinfo.io/json', function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipregistry:
$.getJSON('https://api.ipregistry.co/?key=tryout', function(data) { console.log(JSON.stringify(data, null, 2)); });
- ipstack:
$.getJSON('http://api.ipstack.com/116.12.250.1?access_key=7d558868069cc34f545d822af056be3c', function(data) { console.log(JSON.stringify(data, null, 2)); });
- jsonip.com:
$.getJSON('https://jsonip.com/', function(data) { console.log(JSON.stringify(data, null, 2)); });
- JSON Test:
$.getJSON('http://ip.jsontest.com/', function(data) { console.log(JSON.stringify(data, null, 2)); });
- Snoopi.io:
let apiKey = 'ed5ebbeba257b8f262a6a9bbc0ec678e'; $.getJSON('https://api.snoopi.io/116.12.250.1?apikey=' + apiKey, function(data) { console.log(JSON.stringify(data, null, 2)); });
2. 使用现代浏览器中的Fetch API。以下是一个使用Fetch API获取IP地址的示例:
let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2'; fetch('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey) .then(response => response.json()) .then(data => { console.log(JSON.stringify(data, null, 2)) });
请注意,由于这些都是免费服务,不确定何时/是否会在将来停止使用。大多数服务还提供付费服务以获得更多功能和稳定性。
这些方法中的大多数都需要进行注册以获得API密钥。此外,一些服务可能对请求频率有限制。