<think>
由于安全限制,现代浏览器中直接获取MAC地址和设备识别码通常不可行,但可以通过其他方式获取部分设备信息。以下是几种合法获取设备信息的方法:
### 1. 获取操作系统类型
```javascript
// 通过用户代理字符串判断操作系统
function getOS() {
const userAgent = navigator.userAgent;
if (userAgent.includes('Win')) return 'Windows';
if (userAgent.includes('Mac')) return 'MacOS';
if (userAgent.includes('Linux')) return 'Linux';
if (userAgent.includes('Android')) return 'Android';
if (userAgent.includes('iOS')) return 'iOS';
return 'Unknown';
}
console.log('操作系统:', getOS());
```
### 2. 获取浏览器信息
```javascript
console.log('浏览器名称:', navigator.userAgentData.brand || navigator.appName);
console.log('浏览器版本:', navigator.userAgentData.version || navigator.appVersion);
```
### 3. 获取设备类型(移动/桌面)
```javascript
function getDeviceType() {
return /Mobi|Android/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
}
```
### 4. 获取屏幕信息
```javascript
const screenInfo = {
resolution: `${screen.width}x${screen.height}`,
colorDepth: `${screen.colorDepth}位`,
availableSize: `${screen.availWidth}x${screen.availHeight}`
};
```
### 5. 获取网络状态
```javascript
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
if (connection) {
console.log('网络类型:', connection.type);
console.log('网络速度:', connection.downlink + 'Mb/s');
}
```
### 6. 获取时区和语言
```javascript
console.log('时区:', Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log('语言:', navigator.language || navigator.userLanguage);
```
### 7. 设备识别码的替代方案(指纹生成)
```javascript
// 使用FingerprintJS库生成设备指纹
import FingerprintJS from '@fingerprintjs/fingerprintjs';
(async () => {
const fp = await FingerprintJS.load();
const result = await fp.get();
console.log('设备指纹:', result.visitorId);
})();
```
### 重要限制说明:
1. **MAC地址**:由于隐私和安全原因,浏览器禁止获取MAC地址
2. **设备序列号**:浏览器环境下无法获取
3. **精确硬件信息**(如CPU型号、内存大小):无法直接获取
### 替代方案:
- **企业环境**:使用ActiveX控件(仅IE)或Chrome扩展程序
- **原生应用**:通过Electron、React Native等框架调用原生API
- **后台配合**:通过Java/Python等后台语言获取后传给前端
### Electron示例(桌面应用)
```javascript
// 主进程
const { app, systemPreferences } = require('electron');
const os = require('os');
app.whenReady().then(() => {
const mac = os.networkInterfaces().en0.find(i => i.mac !== '00:00:00:00:00:00').mac;
const serial = systemPreferences.getMediaAccessStatus('serial');
// 发送到渲染进程
mainWindow.webContents.send('device-info', {
os: os.type(),
mac,
serial
});
});
```
§§相关问题§§
1. 如何在移动端浏览器中获取更多设备信息(如电池状态、传感器数据)?
2. 使用设备指纹技术生成唯一标识符时如何平衡用户隐私和识别准确性?
3. 在哪些场景下可以通过Web Bluetooth API获取设备硬件信息?
4. 如何通过WebAssembly提升设备指纹的生成效率和唯一性?
5. 企业级应用中如何安全地实现设备绑定(如MAC地址绑定)的前后端验证?
</think>### 获取本机设备信息的完整指南
#### 浏览器环境下获取设备信息(前端JavaScript)
```javascript
// 获取操作系统和浏览器信息
const deviceInfo = {
// 操作系统
os: {
name: (() => {
const ua = navigator.userAgent;
if (/Windows/.test(ua)) return "Windows";
if (/Macintosh|Mac OS X/.test(ua)) return "macOS";
if (/Linux/.test(ua)) return "Linux";
if (/Android/.test(ua)) return "Android";
if (/iPhone|iPad|iPod/.test(ua)) return "iOS";
return "Unknown OS";
})(),
version: navigator.platform,
architecture: navigator.cpuClass || "Unknown"
},
// 浏览器信息
browser: {
name: navigator.appName,
version: navigator.appVersion,
userAgent: navigator.userAgent
},
// 屏幕信息
screen: {
resolution: `${screen.width}x${screen.height}`,
colorDepth: `${screen.colorDepth}-bit`,
orientation: screen.orientation ? screen.orientation.type : "Unknown"
},
// 设备类型
deviceType: /Mobi|Android/i.test(navigator.userAgent) ? "Mobile" : "Desktop",
// 网络信息
network: navigator.connection ? {
type: navigator.connection.effectiveType,
downlink: navigator.connection.downlink + " Mbps",
rtt: navigator.connection.rtt + " ms"
} : null,
// 位置信息(需要用户授权)
async getLocation() {
if (!navigator.geolocation) return null;
return new Promise((resolve) => {
navigator.geolocation.getCurrentPosition(
position => resolve({
latitude: position.coords.latitude,
longitude: position.coords.longitude
}),
error => resolve(`位置获取失败: ${error.message}`)
);
});
},
// 设备指纹(近似唯一标识)
async getFingerprint() {
const components = {
canvas: (() => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillText('BrowserFingerprint', 2, 2);
return canvas.toDataURL();
})(),
plugins: Array.from(navigator.plugins).map(p => p.name).join(','),
fonts: (() => {
const fonts = new Set();
for (const font of document.fonts) fonts.add(font.family);
return Array.from(fonts).join(',');
})(),
hardwareConcurrency: navigator.hardwareConcurrency || "Unknown"
};
// 生成哈希指纹
const data = JSON.stringify(components);
const buffer = new TextEncoder().encode(data);
const hash = await crypto.subtle.digest('SHA-256', buffer);
return Array.from(new Uint8Array(hash))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}
};
// 使用示例
(async () => {
console.log("操作系统:", deviceInfo.os.name);
console.log("设备类型:", deviceInfo.deviceType);
console.log("设备指纹:", await deviceInfo.getFingerprint());
})();
```
#### 桌面应用获取完整设备信息(Node.js/Electron)
```javascript
const os = require('os');
const si = require('systeminformation'); // 需安装: npm install systeminformation
async function getFullDeviceInfo() {
return {
// 操作系统信息
os: {
platform: os.platform(),
release: os.release(),
arch: os.arch(),
hostname: os.hostname()
},
// CPU信息
cpu: await si.cpu(),
// 内存信息
memory: {
total: os.totalmem(),
free: os.freemem(),
usage: `${(1 - os.freemem()/os.totalmem()) * 100}%`
},
// 磁盘信息
disks: await si.diskLayout(),
// 网络信息
network: {
interfaces: os.networkInterfaces(),
mac: Object.values(os.networkInterfaces())
.flat()
.find(i => i.mac && i.mac !== '00:00:00:00:00:00')?.mac || "Unknown"
},
// 系统序列号(需要管理员权限)
systemSerial: await (async () => {
try {
const { system } = await si.get({system: 'serial'});
return system.serial;
} catch {
return "Permission Denied";
}
})(),
// 电池信息(笔记本)
battery: await si.battery().catch(() => null),
// 图形信息
graphics: await si.graphics()
};
}
// 使用示例
getFullDeviceInfo().then(console.log);
```
#### 移动端原生获取设备信息(React Native示例)
```javascript
import { Platform, NativeModules } from 'react-native';
// 获取设备唯一ID
import DeviceInfo from 'react-native-device-info'; // npm install react-native-device-info
async function getMobileDeviceInfo() {
return {
deviceId: DeviceInfo.getUniqueId(),
brand: DeviceInfo.getBrand(),
model: DeviceInfo.getModel(),
os: Platform.OS,
osVersion: Platform.Version,
isEmulator: await DeviceInfo.isEmulator(),
macAddress: await DeviceInfo.getMacAddress().catch(() => "Permission Denied"),
ipAddress: DeviceInfo.getIpAddress(),
deviceName: DeviceInfo.getDeviceName(),
batteryLevel: DeviceInfo.getBatteryLevelSync(),
isTablet: DeviceInfo.isTablet(),
memory: DeviceInfo.getTotalMemory() / 1024 / 1024 + " MB"
};
}
```
#### 重要注意事项
1. **隐私限制**:浏览器中无法直接获取MAC地址、序列号等敏感信息
2. **权限要求**:
- 位置信息需要用户授权
- 完整硬件信息需要应用获得系统权限
3. **跨平台差异**:
- Windows:使用`wmic csproduct get uuid`获取序列号
- macOS:`system_profiler SPHardwareDataType`
- Linux:`sudo dmidecode -s system-serial-number`
4. **设备指纹替代方案**:
- 组合Canvas指纹、WebGL指纹、字体列表等
- 使用`navigator.deviceMemory`获取内存大小
- `navigator.hardwareConcurrency`获取CPU核心数