如何使用 Angular 获取客户端计算机的 MAC 地址

问题描述 投票:0回答:1

每当客户单击按钮时,我都试图获取客户计算机的 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 地址。这不可能吗?

angular typescript mac-address
1个回答
0
投票

如果客户端和服务器在同一个路由器,就可以获取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 且服务器和用户应位于同一路由器上时有效。

© www.soinside.com 2019 - 2024. All rights reserved.