因某次项目缘由,要作一个简单的数据埋点,后端说可能会拿不到个人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
import {getUserIP} from '@/utils/getip'
let userIP = ''
if (!userIP) {
getUserIP(function(ip) {
userIp = ip
})
}
复制代码
这样就获取到了IP。chrome