JS獲取用戶訪問網(wǎng)頁的瀏覽器數(shù)據(jù)和IP地址信息
要做一個網(wǎng)站統(tǒng)計功能,需要獲取用戶訪問的瀏覽器類型、版本、用戶訪問的IP地址、用戶的所在城市、訪問時間、訪問路徑。
因為我們這個只需要統(tǒng)計訪問的那個頁面就可以,不需要記錄具體點擊了那些功能,所以就只需要想辦法獲取用戶訪問的瀏覽器類型、版本、用戶訪問的IP地址、用戶的所在城市、訪問時間、訪問路徑。這幾個數(shù)據(jù)就可以啦!
PS:不讓我們使用百度統(tǒng)計這種三方網(wǎng)站,如果可以使用百度統(tǒng)計的話,賊拉拉簡單。
獲取瀏覽器數(shù)據(jù)
獲取訪問設(shè)備信息就很簡單,直接下面這個方法,在項目里封裝一下直接調(diào)用就可以啦:
// 獲取用戶訪問瀏覽器設(shè)備信息
function userAgent() {
let browserReg = {
Chrome: /Chrome/,
IE: /MSIE/,
Firefox: /Firefox/,
Opera: /Presto/,
Safari: /Version\/([\d.]+).*Safari/,
'360': /360SE/,
QQBrowswe: /QQ/,
Edge: /Edg/
};
let deviceReg = {
iPhone: /iPhone/,
iPad: /iPad/,
Android: /Android/,
Windows: /Windows/,
Mac: /Macintosh/,
};
let userAgentStr = navigator.userAgent
const userAgentObj = {
browserName: '', // 瀏覽器名稱
browserVersion: '', // 瀏覽器版本
osName: '', // 操作系統(tǒng)名稱
osVersion: '', // 操作系統(tǒng)版本
deviceName: '', // 設(shè)備名稱
}
for (let key in browserReg) {
if (browserReg[key].test(userAgentStr)) {
userAgentObj.browserName = key
if (key === 'Chrome') {
userAgentObj.browserVersion = userAgentStr.split('Chrome/')[1].split(' ')[0]
} else if (key === 'IE') {
userAgentObj.browserVersion = userAgentStr.split('MSIE ')[1].split(' ')[1]
} else if (key === 'Firefox') {
userAgentObj.browserVersion = userAgentStr.split('Firefox/')[1]
} else if (key === 'Opera') {
userAgentObj.browserVersion = userAgentStr.split('Version/')[1]
} else if (key === 'Safari') {
userAgentObj.browserVersion = userAgentStr.split('Version/')[1].split(' ')[0]
} else if (key === '360') {
userAgentObj.browserVersion = ''
} else if (key === 'QQBrowswe') {
userAgentObj.browserVersion = userAgentStr.split('Version/')[1].split(' ')[0]
} else if (key === 'Edge') {
userAgentObj.browserVersion = userAgentStr.split('Edg/')[1].split(' ')[0]
}
}
}
for (let key in deviceReg) {
if (deviceReg[key].test(userAgentStr)) {
userAgentObj.osName = key
if (key === 'Windows') {
userAgentObj.osVersion = userAgentStr.split('Windows NT ')[1].split(';')[0]
} else if (key === 'Mac') {
userAgentObj.osVersion = userAgentStr.split('Mac OS X ')[1].split(')')[0]
} else if (key === 'iPhone') {
userAgentObj.osVersion = userAgentStr.split('iPhone OS ')[1].split(' ')[0]
} else if (key === 'iPad') {
userAgentObj.osVersion = userAgentStr.split('iPad; CPU OS ')[1].split(' ')[0]
} else if (key === 'Android') {
userAgentObj.osVersion = userAgentStr.split('Android ')[1].split(';')[0]
userAgentObj.deviceName = userAgentStr.split('(Linux; Android ')[1].split('; ')[1].split(' Build')[0]
}
}
}
return userAgentObj
}
看一下執(zhí)行后的效果:

獲取用戶訪問的IP地址
這個也很簡單:
// 獲取用戶訪問IP地址
function getIPs(callback) {
var ip_dups = {};
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
var mediaConstraints = {
optional: [{ RtpDataChannels: true }]
};
// 這里就是需要的ICEServer了
var servers = {
iceServers: [
{ urls: "stun:stun.services.mozilla.com" },
{ 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 hasIp = ip_regex.exec(candidate)
if (hasIp) {
var ip_addr = ip_regex.exec(candidate)[1];
if (ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
}
}
// 網(wǎng)絡(luò)協(xié)商的過程
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('\n');
lines.forEach(function (line) {
if (line.indexOf('a=candidate:') === 0)
handleCandidate(line);
});
}, 1000);
}
調(diào)用的話也很簡單:
getIPs((ip) => {
console.log('ip ----> ', ip);
})
看一下效果:

能夠打印出外網(wǎng)的IP地址。
獲取用戶的位置數(shù)據(jù)
這個比較麻煩,也不麻煩其實,有第三方的API可以使用,但是我寫博文的這段時間測試了一些,網(wǎng)上說的很多方式都不能用了,有的可以用,但是需要登錄獲取token,而且還有訪問次數(shù)限制。
我找了一個比較簡單的,不需要登錄也不需要token:
// 獲取用戶訪問位置
function getLocation() {
fetch('https://ipapi.co/json/')
.then(res => {
return res.json();
}).then(userLocation => {
console.log("用戶位置---> ", userLocation);
}).catch(err => {
console.log(err);
})
}
然后調(diào)用一下看一下效果:

基本上是沒有什么問題的。
注意:
沒有必要每次切換的時候都獲取一遍,我們可以在最開始獲取一次,然后存入 sessionStorage 里面,下次使用的時候直接從 sessionStorage 里面獲取就行,這樣也能比較好的減少請求次數(shù),萬一這個網(wǎng)站也有訪問次數(shù)限制。
到此這篇關(guān)于JS獲取用戶訪問網(wǎng)頁的瀏覽器數(shù)據(jù)和IP地址信息的文章就介紹到這了,更多相關(guān)JS獲取網(wǎng)頁信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript使用gcoord進(jìn)行坐標(biāo)轉(zhuǎn)換的操作指南
gcoord是一個輕量級的地理坐標(biāo)系轉(zhuǎn)換JavaScript庫,專門解決百度地圖、高德地圖等互聯(lián)網(wǎng)地圖坐標(biāo)系不統(tǒng)一的問題,本文給大家介紹了JavaScript使用gcoord進(jìn)行坐標(biāo)轉(zhuǎn)換的操作指南,需要的朋友可以參考下2025-12-12
layui table設(shè)置前臺過濾轉(zhuǎn)義等方法
今天小編就為大家分享一篇layui table設(shè)置前臺過濾轉(zhuǎn)義等方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
js 顯示base64編碼的二進(jìn)制流網(wǎng)頁圖片
base64簡單地說,它把一些 8-bit 數(shù)據(jù)翻譯成標(biāo)準(zhǔn) ASCII 字符,我們把圖像文件的內(nèi)容直接寫在了HTML 文件中,這樣做的好處是,節(jié)省了一個HTTP 請求2014-04-04
原生JS 實現(xiàn)的input輸入時表格過濾操作示例
這篇文章主要介紹了原生JS 實現(xiàn)的input輸入時表格過濾操作,結(jié)合實例形式分析了JavaScript基于頁面元素遍歷、運算、判斷實現(xiàn)的表格過濾相關(guān)操作技巧,需要的朋友可以參考下2019-08-08

