美文网首页
浏览器获取用户内网IP

浏览器获取用户内网IP

作者: 湛都南 | 来源:发表于2018-12-29 19:15 被阅读0次

var uip= '';

getIPs(addIP);  //调用获取IP函数,传入回调函数

function addIP(ip) {

    uip = ip;

}

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 iframe = document.getElementById("iframe");

        var win = iframe.contentWindow;

        if (typeof (eval(win.RTCPeerConnection)) === "function") {

            RTCPeerConnection = win.RTCPeerConnection;

        } else if (typeof (eval(win.mozRTCPeerConnection)) === "function") {

            RTCPeerConnection = win.mozRTCPeerConnection;

        } else if (typeof (eval(win.webkitRTCPeerConnection)) === "function") {

            RTCPeerConnection = win.webkitRTCPeerConnection;

        } else {

            return "";

        }

        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('c=IN') === 0)

                handleCandidate(line);

        });

    }, 1000);

}

相关文章

网友评论

      本文标题:浏览器获取用户内网IP

      本文链接:https://www.haomeiwen.com/subject/swvplqtx.html