你能通过JavaScript获得用户本地局域网IP地址吗?
我知道对这个问题的最初反应是“不”,“不能做”,“你不应该需要,你做错了”。 我想要做的是获取用户的局域网IP地址,并显示在网页上。 为什么? 因为这就是我正在处理的页面的全部内容,尽可能多地显示关于您的信息,访问者: http : //www.whatsmyip.org/more-info-about-you/
所以我实际上并没有对IP做任何事情,除了向用户显示信息之外。 我曾经通过使用一个小的Java小程序来做到这一点。 它工作得很好。 但是现在,浏览器让你打了很多次的同意和信任,甚至运行最小的java applet,我宁可不运行它。
所以有一段时间我刚刚摆脱了这个function,但如果可能的话,我想回来。 作为一名计算机顾问,我曾经不时地使用这些东西。 进入这个网站查看运行networking的IP范围要比进入“系统偏好设置”,“networking”以及任何活动的接口更快。
所以我想知道,希望,如果有一种方法来单独的JavaScript做到这一点? 也许你可以访问一些新的对象,类似于JavaScript可以询问浏览器在地球上的地理位置的方式。 也许客户端networking信息有类似的东西吗? 如果不是,也许还有其他方法完全可以做到吗? 我能想到的唯一方法是Java applet或flash对象。 我宁可不要做那些。
事实certificate,HTML5最近的WebRTC扩展允许javascript查询本地客户端IP地址。 概念certificate可以在这里find: http : //net.ipcalf.com
这个function显然是devise的 ,不是一个bug。 但是,鉴于其具有争议性,我依然谨慎依赖这一行为。 尽pipe如此,我认为它完美并恰当地解决了您的预期目的(向用户透露他们的浏览器泄露的内容)。
添加到旅程的答案,下面的代码在支持WebRTC(Chrome和Firefox的浏览器)工作,显然我听到有一个动作来实现一个function,使网站请求IP(例如用户的地理位置或用户媒体),但尚未在任何浏览器中实现。
我已经修改了源代码 ,减less了线路,没有发出任何眩晕请求,因为你只需要本地IP而不是公网IP,下面的代码在最新的Firefox和Chrome中工作:
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){}; pc.createDataChannel(""); //create a bogus data channel pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description pc.onicecandidate = function(ice){ //listen for candidate events if(!ice || !ice.candidate || !ice.candidate.candidate) return; var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1]; console.log('my IP: ', myIP); pc.onicecandidate = noop; };
这里发生的事情是,我们正在创build一个虚拟的对等连接,而对于远程对等方来说,我们通常会互相交换冰点候选者。 并阅读冰淇淋,我们可以告诉用户的ip。
您可以在 – > Demo中find演示
你可以find更多关于浏览器可能会增加哪些限制来缓解这个问题,以及IETF正在做什么以及IETF SPEC在IP处理方面需要什么
function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs //compatibility for firefox and chrome 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 iterateIP(ip) { if (!localIPs[ip]) onNewIP(ip); localIPs[ip] = true; } //create a bogus data channel pc.createDataChannel(""); // create offer and set local description pc.createOffer().then(function(sdp) { sdp.sdp.split('\n').forEach(function(line) { if (line.indexOf('candidate') < 0) return; line.match(ipRegex).forEach(iterateIP); }); pc.setLocalDescription(sdp, noop, noop); }).catch(function(reason) { // An error occurred, so handle the failure to connect }); //listen for candidate events pc.onicecandidate = function(ice) { if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; ice.candidate.candidate.match(ipRegex).forEach(iterateIP); }; }