在 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(无第三方服务)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

前端小白想问,js如何实现,服务器一断开,页面就提示505

使用JS获取当前地理位置方法汇总(如用谷歌接口,会出再以上报错,必须申请密钥并设置接受服务器IP!!!)

使用 Vue.js 获取用户的 IP 地址 [重复]

php怎样获取客户端电脑物理地址

Vue请求第三方接口跨域最终解决办法!2020最终版!

js 怎么获取本地ip\