diff --git a/Scripts/github.py b/Scripts/github.py index c937b58..0f2d9b2 100644 --- a/Scripts/github.py +++ b/Scripts/github.py @@ -5,51 +5,66 @@ import random class Github: def __init__(self): self.utils = utils.Utils() - self.headers = { - "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' - } - self.fetcher = resource_fetcher.ResourceFetcher(self.headers) + self.fetcher = resource_fetcher.ResourceFetcher() def get_latest_release(self, owner, repo): url = "https://github.com/{}/{}/releases".format(owner, repo) response = self.fetcher.fetch_and_parse_content(url) - body = "" - tag_name = None - assets = [] - - for line in response.splitlines(): - if "", 1)[0], 1)[1].split("", 1)[0][1:] - break + if not response: + raise ValueError("Failed to fetch release information from GitHub.") + + tag_name = self._extract_tag_name(response) + body = self._extract_body_content(response) release_tag_url = "https://github.com/{}/{}/releases/expanded_assets/{}".format(owner, repo, tag_name) response = self.fetcher.fetch_and_parse_content(release_tag_url) + if not response: + raise ValueError("Failed to fetch expanded assets information from GitHub.") + + assets = self._extract_assets(response) + + return { + "body": body, + "assets": assets + } + + def _extract_tag_name(self, response): + for line in response.splitlines(): + if "", 1)[0], 1)[1].split("", 1)[0][1:] + return "" + + def _extract_assets(self, response): + assets = [] + for line in response.splitlines(): if "", 2)[1] - - try: - asset_id = "".join(char for char in asset_data.split("datetime=\"")[-1].split("\"")[0][::-1] if char.isdigit())[:9] - except: - asset_id = "".join(random.choices('0123456789', k=9)) - + asset_id = self._generate_asset_id(asset_data) assets.append({ "product_name": self.extract_asset_name(download_link.split("/")[-1]), "id": int(asset_id), "url": "https://github.com" + download_link }) - return { - "body": body, - "assets": assets - } + return assets + + def _generate_asset_id(self, asset_data): + try: + return "".join(char for char in asset_data.split("datetime=\"")[-1].split("\"")[0][::-1] if char.isdigit())[:9] + except: + return "".join(random.choices('0123456789', k=9)) def extract_asset_name(self, file_name): end_idx = len(file_name) diff --git a/Scripts/resource_fetcher.py b/Scripts/resource_fetcher.py index 5d0400e..7c900ea 100644 --- a/Scripts/resource_fetcher.py +++ b/Scripts/resource_fetcher.py @@ -1,3 +1,4 @@ +import ssl import os import json import plistlib @@ -11,9 +12,24 @@ else: from urllib2 import urlopen, Request class ResourceFetcher: - def __init__(self, headers={}): - self.request_headers = headers + def __init__(self, headers=None): + self.request_headers = headers or { + "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' + } self.buffer_size = 16 * 1024 + self.ssl_context = self.create_ssl_context() + + def create_ssl_context(self): + try: + cafile = ssl.get_default_verify_paths().openssl_cafile + if not os.path.exists(cafile): + import certifi + cafile = certifi.where() + ssl_context = ssl.create_default_context(cafile=cafile) + except Exception as e: + print("SSL Context Creation Error: {}".format(e)) + ssl_context = ssl._create_unverified_context() + return ssl_context def is_connected(self, timeout=5): socket.create_connection(("github.com", 443), timeout=timeout) @@ -22,7 +38,7 @@ class ResourceFetcher: self.is_connected() try: - return urlopen(Request(resource_url, headers=self.request_headers)) + return urlopen(Request(resource_url, headers=self.request_headers), context=self.ssl_context) except Exception as e: pass