import { FingerParamsObjType, FingerObjType } from '../types'; import FingerprintJS from '@fingerprintjs/fingerprintjs'; export const BrowserInfoFun = async () => { const { pluginCount, pluginList } = await getInstalledPlugins(); return { //客户端系统 os: getUserOsInfo(), //浏览器版本信息 version: getBrowserVersion(), //浏览器代码名称 appCodeName: getAppCodeName(), //浏览器厂家信息 vendor: getBrowserVendor(), //显示器高度 screenHeight: getScreenHeight(), //显示器宽度 screenWidth: getScreenWidth(), //屏幕设置色彩位数 colorDepth: getScreenColorDepth(), //浏览器产品名称 product: getBrowserProduct(), //浏览器默认语言 language: navigator.language, //浏览器是否连接到网络 onLine: getBrowserOnline(), //浏览器MIME支持类型列表 mimeTypes: getBrowserMimeTypes(), //浏览器的MIME类型数量 mimeTypesLength: getBrowserMimeTypesLength(), //浏览器产品其他信息 productSub: getBrowserProductSub(), //浏览器是否开启cookie cookie: getBrowserCookieEnabled(), //浏览器安装插件数量 pluginsLength: pluginCount, //浏览器安装插件信息列表 plugins: pluginList, //浏览器 userAgent userAgent: navigator.userAgent, //设备类型 type: 'Browser', }; }; /** * 浏览器MIME支持类型列表 * @returns */ export function getBrowserMimeTypes() { const mimeTypes = navigator.mimeTypes; const supportedTypes = []; for (let i = 0; i < mimeTypes.length; i++) { const mimeType = mimeTypes[i]; supportedTypes.push({ type: mimeType.type, description: mimeType.description, suffixes: mimeType.suffixes }); } return JSON.stringify(supportedTypes); } /** * 浏览器的MIME类型数量 * @returns */ export function getBrowserMimeTypesLength() { if (navigator.mimeTypes.length) { return navigator.mimeTypes.length; } return 0; } /** * 浏览器是否开启cookie * @returns */ export function getBrowserCookieEnabled() { if (navigator.cookieEnabled) { return navigator.cookieEnabled; } document.cookie = '__testAuthingCookie=1'; const cookieEnabled = document.cookie.indexOf('__testAuthingCookie=') !== -1; document.cookie = '__testAuthingCookie=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; return cookieEnabled; } /** * 浏览器是否连接到网络 * @returns */ export function getBrowserOnline() { if (navigator.onLine) { return navigator.onLine; } return true; } /** * 浏览器产品其他信息 * @returns */ export function getBrowserVendor() { const userAgent = navigator.userAgent; let browserVendor = 'Unknown'; if (userAgent.includes('Chrome')) { browserVendor = 'Google'; } else if (userAgent.includes('Firefox')) { browserVendor = 'Mozilla'; } else if (userAgent.includes('Trident') || userAgent.includes('MSIE')) { browserVendor = 'Microsoft'; } else if (userAgent.includes('Edge')) { browserVendor = 'Microsoft (EdgeHTML)'; } else if (userAgent.includes('Edg')) { browserVendor = 'Microsoft (Chromium)'; } else if (userAgent.includes('Safari')) { browserVendor = 'Apple'; } return browserVendor; } export type pluginsObjType = () => Promise<{ pluginList: string; pluginCount: number; }>; /** * 浏览器产品其他信息 * @returns */ export const getInstalledPlugins: pluginsObjType = () => { return new Promise(async resolve => { // 初始化 FingerprintJS const fp = await FingerprintJS.load(); // 生成浏览器设备 ID const result = await fp.get(); const pluginCount = result.components.plugins.value.length; const pluginList = result.components.plugins.value resolve({ pluginCount, pluginList: JSON.stringify(pluginList) }); }); }; /** * 浏览器产品名称 * @returns */ export function getBrowserProduct() { const userAgent = navigator.userAgent; let browserProduct = 'Unknown'; if (userAgent.indexOf('Trident') !== -1) { browserProduct = 'Trident'; } else if ( userAgent.indexOf('Gecko') !== -1 && userAgent.indexOf('KHTML') === -1 ) { browserProduct = 'Gecko'; } else if (userAgent.indexOf('WebKit') !== -1) { browserProduct = 'WebKit'; } else if (userAgent.indexOf('Blink') !== -1) { browserProduct = 'Blink'; } return browserProduct; } /** * 浏览器产品其他信息 * @returns */ export function getBrowserProductSub() { const userAgent = navigator.userAgent; if (userAgent.includes('Firefox')) { return "20030107"; } else if (userAgent.includes('Chrome')) { return "20030107"; } else if (userAgent.includes('Trident') || userAgent.includes('MSIE')) { return "20000101"; } else { return "0"; } } // 根据不同浏览器类型返回MIME类型数量 export function getBrowserMimeTypeCount() { const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) { return 0; } else if (userAgent.indexOf('firefox') !== -1) { const mimeTypeCount = getMimeTypeCount(); return mimeTypeCount; } else if ( userAgent.indexOf('chrome') !== -1 || userAgent.indexOf('crios') !== -1 ) { const mimeTypeCount = getMimeTypeCount(); return mimeTypeCount; } else if (userAgent.indexOf('safari') !== -1) { const mimeTypeCount = getMimeTypeCount(); return mimeTypeCount; } else { return 0; } } // 获取浏览器的MIME类型数量 export function getMimeTypeCount() { if (typeof navigator.mimeTypes === 'undefined') { return 0; } navigator.mimeTypes.length; return navigator.mimeTypes.length; } /** * 显示器宽度 * @returns */ export function getScreenColorDepth() { const colorDepth = window.screen.colorDepth || window.screen.pixelDepth; if (navigator.userAgent.indexOf('Chrome') !== -1) { return colorDepth * window.devicePixelRatio; } else if (navigator.userAgent.indexOf('Firefox') !== -1) { return colorDepth; } else if (navigator.userAgent.indexOf('Trident') !== -1) { // @ts-ignore return screen.deviceXDPI; } else { return colorDepth; } } /** * 显示器宽度 * @returns */ export function getScreenWidth() { let screenWidth = 0; if (typeof window.innerWidth === 'number') { screenWidth = window.innerWidth; } else if (document.documentElement && document.documentElement.clientWidth) { screenWidth = document.documentElement.clientWidth; } else if (document.body && document.body.clientWidth) { screenWidth = document.body.clientWidth; } return screenWidth; } /** * 显示器高度 * @returns */ export function getScreenHeight() { if (navigator.userAgent.indexOf('Chrome') !== -1) { return window.screen.height; } else if (navigator.userAgent.indexOf('Firefox') !== -1) { return window.screen.height; } else if ( navigator.userAgent.indexOf('Trident') !== -1 || navigator.userAgent.indexOf('MSIE') !== -1 ) { return screen.height; } else { return window.innerHeight; } } /** * 客户端系统 * @returns */ export function getUserOsInfo() { const userAgent = navigator.userAgent; if (userAgent.indexOf('Windows NT 10.0') !== -1) return 'Windows 10'; if (userAgent.indexOf('Windows NT 6.2') !== -1) return 'Windows 8'; if (userAgent.indexOf('Windows NT 6.1') !== -1) return 'Windows 7'; if (userAgent.indexOf('Windows NT 6.0') !== -1) return 'Windows Vista'; if (userAgent.indexOf('Windows NT 5.1') !== -1) return 'Windows XP'; if (userAgent.indexOf('Windows NT 5.0') !== -1) return 'Windows 2000'; if (userAgent.indexOf('Mac') !== -1) return 'Mac OS'; if (userAgent.indexOf('X11') !== -1) return 'UNIX'; if (userAgent.indexOf('Linux') !== -1) return 'Linux'; return 'Other'; } /** * 设备系统版本 * @returns */ export function getBrowserVersion() { const userAgent = navigator.userAgent; let version = 'Unknown'; if (/Chrome\/([\d.]+)/.test(userAgent)) { version = userAgent.match(/Chrome\/([\d.]+)/)[1]; } else if (/Firefox\/([\d.]+)/.test(userAgent)) { version = userAgent.match(/Firefox\/([\d.]+)/)[1]; } else if (/MSIE ([\d.]+)/.test(userAgent)) { version = userAgent.match(/MSIE ([\d.]+)/)[1]; } else if (/Trident\/[\d](?:[\d.]+)?; rv:([0-9.]+)/.test(userAgent)) { version = userAgent.match(/Trident\/[\d](?:[\d.]+)?; rv:([0-9.]+)/)[1]; } return version; } /** * 浏览器代码名称 * @returns */ export function getAppCodeName() { const userAgent = navigator.userAgent; let browserCodeName = 'Unknown'; if (userAgent.indexOf('Chrome') !== -1) { browserCodeName = 'Chrome'; } else if (userAgent.indexOf('Firefox') !== -1) { browserCodeName = 'Firefox'; } else if (userAgent.indexOf('Safari') !== -1) { browserCodeName = 'Safari'; } else if (userAgent.indexOf('Edge') !== -1) { browserCodeName = 'Edge'; } else if (userAgent.indexOf('Trident') !== -1) { browserCodeName = 'Internet Explorer'; } return browserCodeName; } export const handleFingerprint = ( localDeviceFingersObj: FingerParamsObjType ) => { const fingerObj: FingerObjType = { userAgentFingerprint: localDeviceFingersObj.userAgent, audioFingerprint: localDeviceFingersObj.audio, canvasFingerprint: localDeviceFingersObj.canvas, screenResolutionFingerprint: localDeviceFingersObj.screenResolution, webglFingerprint: localDeviceFingersObj.webgl, fontsFingerprint: localDeviceFingersObj.fonts, pluginsFingerprint: localDeviceFingersObj.plugins }; return fingerObj; }; export const getBrowserInfo = () => { let agent: any = navigator.userAgent.toLowerCase(); // 获取浏览器信息 let regStr_ie = /msie [\d.]+;/gi; // 处理IE浏览器 msie IE浏览器简称MSIE let regStr_ff = /firefox\/[\d.]+/gi; // 处理火狐浏览器 let regStr_chrome = /chrome\/[\d.]+/gi; // 处理谷歌浏览器 let regStr_Edg = /edg\/[\d.]+/gi; // 处理Edg浏览器 let regStr_saf = /safari\/[\d.]+/gi; // 处理safari浏览器 let regStr_safVersion = /version\/[\d.]+/gi; // 处理safari浏览器 //IE浏览器 if (agent.indexOf('msie') > 0) { return agent.match(regStr_ie); } //firefox浏览器 if (agent.indexOf('firefox') > 0) { return agent.match(regStr_ff); } //Edg浏览器 if (agent.indexOf('edg') > 0) { return agent.match(regStr_Edg); } //Chrome浏览器 if (agent.indexOf('chrome') > 0) { return agent.match(regStr_chrome); } //Safari浏览器 if (agent.indexOf('safari') > 0 && agent.indexOf('chrome') < 0) { let bro = agent.match(regStr_saf)[0].split('/')[0]; let ver = agent.match(regStr_safVersion)[0].split('/')[1]; let user = bro + '/' + ver; return [user]; } }; export const getWebGLValues = () => { const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); if (!gl) { return ''; } const webGLValues = { // @ts-ignore renderer: gl.getParameter(gl.RENDERER), // @ts-ignore vendor: gl.getParameter(gl.VENDOR), // @ts-ignore version: gl.getParameter(gl.VERSION), // @ts-ignore shadingLanguageVersion: gl.getParameter(gl.SHADING_LANGUAGE_VERSION), // @ts-ignore maxVertexAttributes: gl.getParameter(gl.MAX_VERTEX_ATTRIBS), // @ts-ignore maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE), // 可根据需要添加其他属性 }; return webGLValues; }