每当客户单击按钮时,我都试图获取客户计算机的 MAC 地址。 (此仅供办公用途)。
我已经阅读了多个 SO 答案,他们提到我们无法使用 JavaScript 来做到这一点,但仍然对答案不满意。
但是我仍然设法使用下面的代码获取客户端 IP 地址,但由于 IP 是动态的,因此我必须检查 MAC 地址。
获取客户端IP地址的代码.
ngOnInit(){
this.getUserIP(function(ip){
console.log(ip)
});
}
getUserIP(onNewIP) { // onNewIp - your listener function for new IPs
//compatibility for firefox and chrome
// console.log("onNewIP" , onNewIP);
// (<any>window).mozRTCPeerConnection
var myPeerConnection = (<any>window).RTCPeerConnection || (<any>window).mozRTCPeerConnection || (<any>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,
key;
function iterateIP(ip) {
if (!localIPs[ip]) onNewIP(ip);
localIPs[ip] = true;
}
//create a bogus data channel
pc.createDataChannel("");
// create offer and set local description
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);
}, noop);
//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);
};
}
为什么我想获取MAC地址
当用户在我的软件中注册时,稍后我希望该用户仅从该机器发出请求。因此我需要 MAC 地址。这不可能吗?
如果客户端和服务器在同一个路由器,就可以获取MAC地址。或者如果客户端和服务器之间只有一台路由器。
我已经在我的 Angular 应用程序中完成了此操作。
使用以下代码获取第一个客户端的 IP。
public async login(req: any, res: any) {
getclientip(){
const clientIp = req.ip;
return clientIp ....
其次,我使用 arp 命令获取 ARP(地址解析协议)表,( 地址解析协议 (ARP) 用于将 IP 地址映射到本地网络内的 MAC 地址。当一个设备想要与另一个设备通信时同一本地网络上的设备知道 IP 地址但不知道 MAC 地址,它使用 ARP 来发现 MAC 地址。)。
getMacAddresses() {
const cmd = "arp -a";
const result = execSync(cmd, { encoding: "utf-8" });
const devices = {};
const lines = result.trim().split("\n").slice(3);
for (const line of lines) {
const [ip, mac] = line.split(/\s+/).filter(Boolean);
devices[ip] = mac;
}
return devices;
}
最后使用ip和arp表,我们可以过滤客户端mac地址。
以上代码仅在 Nodejs 中有效,并且仅在调用 API 且服务器和用户应位于同一路由器上时有效。