偷来的前端JS获取IP地址方法

因某次项目缘由,要作一个简单的数据埋点,后端说可能会拿不到个人IP,但愿前端能获取到,因而乎我就各类百度谷歌查资料,终于在群友的帮助下找到了一篇获取IP的文章,由于是英文的,过了好久我都不记得了连接了,怕之后忘记,就记录下来前端

获取IP

// 获取用户ip
export function getUserIP(onNewIP) { //  onNewIp - your listener function for new IPs
  //compatibility for firefox and chrome
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
  var pc = new myPeerConnection({
    iceServers: []
  }),
  noop = function() {},
  localIPs = {},
  ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g

  function iterateIP(ip) {
    if (!localIPs[ip]) onNewIP(ip)
    localIPs[ip] = true
  }
  //create a bogus data channel
  pc.createDataChannel("")
  // create offer and set local description
  try{
    pc.createOffer(function(sdp) {
      sdp.sdp.split('\n').forEach(function(line) {
        if (line.indexOf('candidate') < 0) return
        line.match(ipRegex).forEach(iterateIP)
      })
      
      pc.setLocalDescription(sdp, noop, noop)
    },function(sdp){
      console.log('fail')
    })
  } catch (err) {
    console.log(err)
  }
  //listen for candidate events
  pc.onicecandidate = function(ice) {
    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return
    ice.candidate.candidate.match(ipRegex).forEach(iterateIP)
  };
}
复制代码

原理彷佛是模拟请求获取请求端IP。本身也是个菜鸟,只知其一;不知其二。web

调用方法获取ip

import {getUserIP} from '@/utils/getip'
let userIP = ''
if (!userIP) {
    getUserIP(function(ip) {
        userIp = ip
    })
}
复制代码

这样就获取到了IP。chrome

相关文章
相关标签/搜索