在 JS 中获取当前 IP(无第三方服务)[重复]
Posted
技术标签:
【中文标题】在 JS 中获取当前 IP(无第三方服务)[重复]【英文标题】:Get current IP in JS (no third party services) [duplicate] 【发布时间】:2016-09-07 06:31:23 【问题描述】:是否可以使用 WebRTC JS API 和 ICE 协议(公共 IP 为 STUN)获取客户端 IP?
【问题讨论】:
在JS中无法获取机器的IP。另请注意,无法在其本地域上获取机器的 IP。只能使用服务器端 IP 查找,并且这些只会去客户端网络的第一个外部源,通常是路由器或 ISP 服务器。 您可以尝试加载net.ipcalf.com 并阅读:document.getElementById('list').textContent.substr(0,document.getElementById('list').textContent。 indexOf(' ')), 但是没有原生的js或者jQuery函数可以解决你的问题 【参考方案1】:是的,您可以,使用 WebRTC JS API 和 ICE 协议(STUN 用于公共 IP)。
更多信息here。
//get the IP addresses associated with an account
function getIPs(callback)
var ip_dups = ;
//compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
//bypass naive webrtc blocking using an iframe
if(!RTCPeerConnection)
//NOTE: you need to have an iframe in the page right above the script tag
//
//<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
//<script>...getIPs called in here...
//
var win = iframe.contentWindow;
RTCPeerConnection = win.RTCPeerConnection
|| win.mozRTCPeerConnection
|| win.webkitRTCPeerConnection;
useWebKit = !!win.webkitRTCPeerConnection;
//minimal requirements for data connection
var mediaConstraints =
optional: [RtpDataChannels: true]
;
var servers = iceServers: [urls: "stun:stun.services.mozilla.com"];
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints);
function handleCandidate(candidate)
//match just the IP address
var ip_regex = /([0-9]1,3(\.[0-9]1,3)3|[a-f0-9]1,4(:[a-f0-9]1,4)7)/
var ip_addr = ip_regex.exec(candidate)[1];
//remove duplicates
if(ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
//listen for candidate events
pc.onicecandidate = function(ice)
//skip non-candidate events
if(ice.candidate)
handleCandidate(ice.candidate.candidate);
;
//create a bogus data channel
pc.createDataChannel("");
//create an offer sdp
pc.createOffer(function(result)
//trigger the stun server request
pc.setLocalDescription(result, function(), function());
, function());
//wait for a while to let everything done
setTimeout(function()
//read candidate info from local description
var lines = pc.localDescription.sdp.split('\n');
lines.forEach(function(line)
if(line.indexOf('a=candidate:') === 0)
handleCandidate(line);
);
, 1000);
//Test: Print the IP addresses into the console
getIPs(function(ip)console.log(ip););
【讨论】:
这在 Safari 浏览器中不起作用会给出错误提示:TypeError: undefined is not an object (evaluating 'win.RTCPeerConnection')
。
stun.services.mozilla.com 怎么不是第三方服务器?
ERROR TypeError: Cannot read property 'sdp' of null
,不幸的是在 chrome 中不能正常工作以上是关于在 JS 中获取当前 IP(无第三方服务)[重复]的主要内容,如果未能解决你的问题,请参考以下文章