diff --git a/windowskey b/windowskey new file mode 100755 index 0000000..c6a02af --- /dev/null +++ b/windowskey @@ -0,0 +1,85 @@ +#!/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}")