JavaScript 获取用户公网 IP 地址 - 代码解析与应用

本文将详细解析一段 JavaScript 代码,并阐述其在获取用户公网 IP 地址方面的应用。

代码解析

function getIPs(callback) {
    var ip_dups = {};
    var ips = []; // 定义一个数组,存放获取到的IP地址

    var RTCPeerConnection = window.RTCPeerConnection
        || window.mozRTCPeerConnection
        || window.webkitRTCPeerConnection;
    var useWebKit = !!window.webkitRTCPeerConnection;

    if (!RTCPeerConnection) {
        var win = iframe.contentWindow;
        RTCPeerConnection = win.RTCPeerConnection
            || win.mozRTCPeerConnection
            || win.webkitRTCPeerConnection;
        useWebKit = !!win.webkitRTCPeerConnection;
    }

    var mediaConstraints = {
        optional: [{RtpDataChannels: true}]
    };

    var servers = {iceServers: [{urls: 'stun:stun.l.google.com:19302'}]};

    var pc = new RTCPeerConnection(servers, mediaConstraints);

    function handleCandidate(candidate) {
        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) && ip_regex.exec(candidate)[1];

        if (!ip_addr) return;
        if (ip_dups[ip_addr] === undefined) {
            ips.push(ip_addr); // 将获取到的IP地址存入数组中
            callback(ip_addr);
        }

        ip_dups[ip_addr] = true;
    }

    pc.onicecandidate = function (ice) {
        if (ice.candidate)
            handleCandidate(ice.candidate.candidate);
    };

    pc.createDataChannel('');

    pc.createOffer(function (result) {
        pc.setLocalDescription(result, function () {}, function () {});
    }, function () {});

    setTimeout(function () {
        var lines = pc.localDescription.sdp.split('
');

        lines.forEach(function (line) {
            if (line.indexOf('a=candidate:') === 0)
                handleCandidate(line);
        });
    }, 1000);
}

getIPs(function (ip) {
    ip && console.log(ip);
});

console.log(ips); // 在这里进行处理

这段代码主要利用了 WebRTC 的 RTCPeerConnection 对象来实现获取用户公网 IP 地址。代码逻辑如下:

  1. 创建 RTCPeerConnection 对象: 通过 RTCPeerConnection 对象建立一个连接,并指定服务器地址和媒体约束。
  2. 监听候选 IP 地址: 监听 onicecandidate 事件,当有新的候选 IP 地址出现时,将其提取并放入 ips 数组中。
  3. 处理候选 IP 地址: 对提取到的 IP 地址进行判断,去除重复地址,并通过回调函数 callback 将其返回。

应用场景

获取用户公网 IP 地址在以下场景中可以发挥作用:

  • 地理定位: 根据 IP 地址可以大致定位用户所在地。
  • 用户行为分析: 可以记录用户访问的 IP 地址,用于分析用户行为,例如访问频率、访问时间等。
  • 反作弊: 结合其他信息,可以用于识别恶意用户,防止作弊行为。

代码示例

function getIPs(callback) {
    // ... (代码内容与上面相同)
}

// 获取用户公网 IP 地址并输出到控制台
getIPs(function (ip) {
    ip && console.log('您的公网 IP 地址为:' + ip);
});

注意事项

  • 由于网络环境的影响,获取到的 IP 地址可能不准确。
  • 在使用此代码时,需要确保用户浏览器支持 WebRTC 技术。

总结

本文介绍了使用 JavaScript 代码获取用户公网 IP 地址的方法,并提供代码示例和应用场景说明。希望对您理解和应用此技术有所帮助。

JavaScript 获取用户公网 IP 地址 - 代码解析与应用

原文地址: https://www.cveoy.top/t/topic/m48B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录