hardware.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import hashlib
  2. import platform
  3. import uuid
  4. import wmi
  5. class Hardware:
  6. machine_code = None
  7. @classmethod
  8. def _get_system_info(cls):
  9. """获取系统名称"""
  10. system_info = platform.uname()
  11. return system_info.node
  12. @classmethod
  13. def _get_cpu_info(cls):
  14. """获取CPU信息(弃用,耗时过长)"""
  15. c = wmi.WMI()
  16. info = ''
  17. for cpu in c.Win32_Processor():
  18. res = str(cpu.SerialNumber)
  19. info += res
  20. return info
  21. @classmethod
  22. def _get_board_info(cls):
  23. """获取主板信息"""
  24. c = wmi.WMI()
  25. info = ""
  26. for board in c.Win32_BaseBoard():
  27. res = str(board.SerialNumber)
  28. info += res
  29. return info
  30. @classmethod
  31. def _get_bios_info(cls):
  32. """获取BIOS信息"""
  33. c = wmi.WMI()
  34. info = ""
  35. for bios in c.Win32_BIOS():
  36. res = str(bios.SerialNumber)
  37. info += res
  38. return info
  39. @classmethod
  40. def _get_disk_info(cls):
  41. """获取硬盘信息"""
  42. c = wmi.WMI()
  43. info = ""
  44. for disk in c.Win32_DiskDrive():
  45. res = str(disk.SerialNumber)
  46. info += res
  47. return info
  48. @classmethod
  49. def _pwd_to_sha256(cls, password, salt: str):
  50. """哈希加密"""
  51. sha = hashlib.sha256()
  52. sha.update(password.encode('utf-8'))
  53. sha.update(salt.encode('gbk'))
  54. return sha.hexdigest()
  55. @classmethod
  56. def generate_machine_code(cls):
  57. """生成机器码"""
  58. if cls.machine_code:
  59. return True, cls.machine_code
  60. try:
  61. info_list = [cls._get_system_info(),
  62. cls._get_board_info(),
  63. cls._get_bios_info(),
  64. cls._get_disk_info()
  65. ]
  66. except Exception as e:
  67. print(e)
  68. return False, None
  69. combined_info = "-".join(info_list)
  70. code_temp = cls._pwd_to_sha256(combined_info, 'qingmagooki')
  71. code = code_temp[::2]
  72. cls.machine_code = code
  73. return True, code
  74. @classmethod
  75. def get_machine_code(cls):
  76. ok, code = cls.generate_machine_code()
  77. if not ok:
  78. return uuid.getnode()
  79. return code