您的位置:

JS获取IP地址详解

一、JS获取IP地址

JavaScript是一种广泛使用的脚本语言,可用于在Web浏览器中编写交互式网页。在Web开发中,获取IP地址是一项非常重要的任务,因为它可以帮助开发人员确定用户的位置。在JavaScript中,可以使用以下代码来获取用户的IP地址:


function getIPAddress(onNewIP) { 
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
  var pc = new myPeerConnection({iceServers: []}), 
  noop = function(){}; 
  pc.createDataChannel(""); 
  pc.createOffer(pc.setLocalDescription.bind(pc), noop); 
  pc.onicecandidate = function(ice) { 
    if (ice && ice.candidate && ice.candidate.candidate) { 
        var myIP = ice.candidate.candidate.match(/(d{1,3}.d{1,3}.d{1,3}.d{1,3})/)[0]; 
        onNewIP(myIP); 
    } 
  }; 
}

这段代码用于创建一个RTCPeerConnection对象来获取用户的IP地址。它首先检查浏览器是否支持RTCPeerConnection对象,然后创建一个新的RTCPeerConnection对象,并通过createDataChannel()函数创建一个数据通道。接下来,通过createOffer()函数创建一个offer,然后通过setLocalDescription()函数将本地SDP描述设置为这个offer。最后,当获取到一个ICE candidate时,将通过正则表达式匹配出IP地址,并通过回调函数返回IP地址。

二、JS获取IPv6地址

IPv6是下一代IP协议,可以提供更多的地址空间和更好的安全性。在JavaScript中,可以使用以下代码来获取用户的IPv6地址:


function getIPv6Address(onNewIPv6) { 
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
  var pc = new myPeerConnection({iceServers: []}), 
  noop = function(){}; 
  pc.createDataChannel(""); 
  pc.createOffer(pc.setLocalDescription.bind(pc), noop); 
  pc.onicecandidate = function(ice) { 
    if (ice && ice.candidate && ice.candidate.candidate) { 
        var myIPv6 = ice.candidate.candidate.match(/([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7})/)[0]; 
        onNewIPv6(myIPv6); 
    } 
  }; 
}

这段代码与获取IP地址的代码类似,但是我们需要使用不同的正则表达式来匹配IPv6地址。在这个例子中,我们使用了一个匹配IPv6地址的正则表达式:([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7})。

三、JS获取IP和端口

在JavaScript中,可以使用以下代码来获取用户的IP和端口:


function getIPAndPort(onNewIPAndPort) { 
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
  var pc = new myPeerConnection({iceServers: []}), 
  noop = function(){}; 
  pc.createDataChannel(""); 
  pc.createOffer(pc.setLocalDescription.bind(pc), noop); 
  pc.onicecandidate = function(ice) { 
    if (ice && ice.candidate && ice.candidate.candidate) { 
        var myIPAndPort = ice.candidate.candidate.match(/(d{1,3}.d{1,3}.d{1,3}.d{1,3}):([0-9]+)/)[0]; 
        onNewIPAndPort(myIPAndPort); 
    } 
  }; 
}

这段代码类似于获取IP地址的代码,但是我们需要对正则表达式进行改变以匹配IP和端口的组合。在这个例子中,我们使用了如下正则表达式:(d{1,3}.d{1,3}.d{1,3}.d{1,3}):([0-9]+)。

四、JS获取IP和地区

在JavaScript中,可以通过调用第三方API或使用数据库来获取用户的地理位置信息,并与获取的IP地址进行匹配。以下是使用第三方API获取IP和地区信息的代码:


function getIPAndRegion(onNewIPAndRegion) { 
  var xhr = new XMLHttpRequest(); 
  xhr.open("GET", "https://api.ipify.org?format=json", true); 
  xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4 && xhr.status == 200) { 
        var result = JSON.parse(xhr.responseText); 
        var myIP = result.ip; 
        var xhr2 = new XMLHttpRequest(); 
        xhr2.open("GET", "https://ipapi.co/" + myIP + "/json/", true); 
        xhr2.onreadystatechange = function() { 
            if (xhr2.readyState == 4 && xhr2.status == 200) { 
                var result2 = JSON.parse(xhr2.responseText); 
                var myRegion = result2.region; 
                onNewIPAndRegion(myIP + ", " + myRegion); 
            } 
        }; 
        xhr2.send(); 
    } 
  }; 
  xhr.send(); 
}

这段代码首先使用XMLHttpRequest对象向https://api.ipify.org发送一个GET请求,以获取用户的IP地址。接下来,使用另一个XMLHttpRequest对象向https://ipapi.co发送一个GET请求,以根据IP地址获取用户的地区信息。最后,将IP地址和地区信息一起返回给回调函数。

五、JS获取IP地理位置

在JavaScript中,可以使用第三方API或自己的数据库来获取用户的地理位置信息。以下是使用第三方API获取IP地理位置的代码:


function getIPGeolocation(onNewIPGeolocation) { 
  var xhr = new XMLHttpRequest(); 
  xhr.open("GET", "https://api.ipify.org?format=json", true); 
  xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4 && xhr.status == 200) { 
        var result = JSON.parse(xhr.responseText); 
        var myIP = result.ip; 
        var xhr2 = new XMLHttpRequest(); 
        xhr2.open("GET", "https://ipapi.co/" + myIP + "/json/", true); 
        xhr2.onreadystatechange = function() { 
            if (xhr2.readyState == 4 && xhr2.status == 200) { 
                var result2 = JSON.parse(xhr2.responseText); 
                var myLocation = result2.city + ", " + result2.region_code + ", " + result2.country_name; 
                onNewIPGeolocation(myLocation); 
            } 
        }; 
        xhr2.send(); 
    } 
  }; 
  xhr.send(); 
}

这段代码与获取IP和地区的代码类似,但是它返回了用户的地理位置信息,而不仅仅是地区信息。

六、JS获取IP地址的方法

除了使用RTCPeerConnection对象外,还可以使用其他方法来获取IP地址。以下是使用WebRTC API中的RTCDataChannel来获取IP地址的代码:


function getIPAddressWithRTCDataChannel(onNewIP) { 
  var pc = new RTCPeerConnection({iceServers: []}), 
  noop = function(){}; 
  pc.createDataChannel(""); 
  pc.createOffer(pc.setLocalDescription.bind(pc), noop); 
  pc.onicecandidate = function(ice) { 
    if (ice && ice.candidate && ice.candidate.candidate) { 
        var myIP = ice.candidate.candidate.match(/(d{1,3}.d{1,3}.d{1,3}.d{1,3})/)[0]; 
        onNewIP(myIP); 
        pc.onicecandidate = noop; 
    } 
  }; 
}

此外,还可以使用第三方库,如geoip2.js和ipify.js来获取IP地址、地理位置和ASN(Autonomous System Number,自治系统号)信息。以下是使用geoip2.js和ipify.js获取IP地址和地理位置的代码:


// Load the necessary libraries 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script src="//js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js" type="text/javascript"></script> 
<script src="//cdnjs.cloudflare.com/ajax/libs/ipify/1.0.3/ipify.min.js" type="text/javascript"></script> 

// Get the IP address 
ipify(function(err, data) { 
  var myIP = data.ip; 
  
  // Get the geolocation 
  geoip2.city(myIP, function(result) { 
    var myCity = result.city.names.en; 
    var myRegion = result.subdivisions[0].iso_code; 
    var myCountry = result.country.names.en; 
    var myLocation = myCity + ", " + myRegion + ", " + myCountry; 
    onNewIPAndGeolocation(myIP + ", " + myLocation); 
  }); 
});

七、JS获取当前IP

在JavaScript中,可以使用以下代码来获取当前网络连接的IP地址:


function getCurrentIP(onNewIP) { 
  var myScript = document.createElement("script"); 
  myScript.src = "https://jsonip.com/?callback=getIP"; 
  document.body.appendChild(myScript); 
  window.getIP = function(json) { 
    onNewIP(json.ip); 
  }; 
}

这段代码通过向https://jsonip.com发送一个JSONP请求来获取当前的IP地址。

八、JS获取本机IP地址

在JavaScript中,可以通过WebSocket对象获取本地IP地址:


function getLocalIPAddress(onNewIP) { 
  var mySocket = new WebSocket("wss://websocket.org"); 
  mySocket.onopen = function() { 
    mySocket.send("hello"); 
  }; 
  mySocket.onerror = function() { 
    onNewIP("error"); 
  }; 
  mySocket.onmessage = function(msg) { 
    mySocket.close(); 
    var myIP = msg.data; 
    onNewIP(myIP); 
  }; 
}

这段代码创建一个WebSocket对象并连接到https://websocket.org。当连接打开时,它发送了一个“hello”消息,并等待接收到的消息来返回本地IP地址。请注意,这段代码要求WebSocket服务器返回客户端的IP地址。

九、JS获取本地IP

在JavaScript中,可以使用Navigator对象获取本地IP地址:


function getLocalIPAddressWithNavigator(onNewIP) { 
  window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
  var pc = new RTCPeerConnection({iceServers:[]}), 
  noop = function(){}; 
  pc.createDataChannel(""); 
  pc.createOffer(pc.setLocalDescription.bind(pc), noop); 
  pc.onicecandidate = function(ice) { 
    if (!ice || !ice.candidate) 
        return; 

    var myIP = /^candidate:.+ (\S+) \d+ typ/.exec(ice.candidate.candidate)[1]; 
    onNewIP(myIP); 
    pc.onicecandidate = noop; 
  }; 
}

这段代码使用Navigator对象和RTCPeerConnection对象来获取本地IP地址。它首先检查浏览器是否支持RTCPeerConnection对象,然后创建一个新的RTCPeerConnection对象,并通过createDataChannel()函数创建一个数据通道。接下来,通过createOffer()函数创建一个offer,然后通过setLocalDescription()函数将本地SDP描述设置为这个offer。最后,当获取到一个ICE candidate时,将使用正则表达式获取本地IP地址,并通过回调函数返回IP地址。