86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| 
 | |
| import html.parser
 | |
| import os
 | |
| import sys
 | |
| import urllib.request
 | |
| 
 | |
| 
 | |
| """
 | |
| Download Windows product keys from MicroSoft
 | |
| """
 | |
| 
 | |
| key_page_url = "https://docs.microsoft.com/en-us/windows-server/get-started/kms-client-activation-keys"
 | |
| 
 | |
| 
 | |
| def usage():
 | |
|     script = os.path.basename(sys.argv[0])
 | |
|     message = f"""Usage: {script} [windows-version]
 | |
| 
 | |
| To specify the version of Windows you'd like, pass a string that matches the
 | |
| name of the operating system you'd like to download. Case doesn't matter, so
 | |
| you can use "windows 10" or "Windows 10".
 | |
| 
 | |
| e.g.
 | |
| 
 | |
|     {script} "Windows 10"
 | |
|     {script} "enterprise"
 | |
| 
 | |
| """
 | |
|     print(message, file=sys.stderr)
 | |
|     sys.exit(0)
 | |
| 
 | |
| 
 | |
| def download_page(url):
 | |
|     response = urllib.request.urlopen(url)
 | |
|     return response.read().decode("utf-8")
 | |
| 
 | |
| 
 | |
| class WindowsKeyPageParser(html.parser.HTMLParser):
 | |
|     def __init__(self, *, convert_charrefs=True):
 | |
|         super().__init__(convert_charrefs=True)
 | |
|         self.product_keys = {}
 | |
|         self.parsing_os = False
 | |
| 
 | |
|     def handle_starttag(self, tag, attrs):
 | |
|         self.parsing_os = tag == "td"
 | |
| 
 | |
|     def handle_endtag(self, tag):
 | |
|         self.parsing_os = False
 | |
| 
 | |
|     def handle_data(self, data):
 | |
|         if self.parsing_os:
 | |
|             self.stash_table_cell(data)
 | |
| 
 | |
|     def stash_table_cell(self, data):
 | |
|         if "Windows" in data:
 | |
|             self.current_os = data
 | |
|         else:
 | |
|             product_key = data
 | |
|             self.product_keys[self.current_os] = product_key
 | |
| 
 | |
| 
 | |
| def find_keys_for_all_versions(markup):
 | |
|     parser = WindowsKeyPageParser()
 | |
|     parser.feed(markup)
 | |
|     return parser.product_keys
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     try:
 | |
|         arg = sys.argv[1]
 | |
|     except IndexError:
 | |
|         windows_version = ""
 | |
|     else:
 | |
|         if arg in ["-h", "--help"]:
 | |
|             usage()
 | |
|         windows_version = arg
 | |
| 
 | |
|     markup = download_page(key_page_url)
 | |
|     product_keys = find_keys_for_all_versions(markup)
 | |
| 
 | |
|     for os_name, product_key in product_keys.items():
 | |
|         if windows_version.lower() in os_name.lower():
 | |
|             print(f"{os_name}: {product_key}")
 |