import os import tempfile class ChromeProxy: def __init__(self, host: str, port: int, username: str = "", password: str = ""): self.host = host self.port = port self.username = username self.password = password def create_extension(self, name: str = "Chrome Proxy", version="1.0.0") -> str: proxy_folder = tempfile.mkdtemp(prefix="chrome_proxy_") self._create_manifest( name=name, version=version, proxy_folder=proxy_folder ) self._create_background_js(proxy_folder) return proxy_folder def _create_manifest(self, name, version, proxy_folder): manifest = ChromeProxy.manifest_json manifest = manifest.replace("", name) manifest = manifest.replace("", version) with open(f"{proxy_folder}/manifest.json", "w") as f: f.write(manifest) def _create_background_js(self, proxy_folder): js = ChromeProxy.background_js js = js.replace("", self.host) js = js.replace("", str(self.port)) js = js.replace("", self.username) js = js.replace("", self.password) with open(f"{proxy_folder}/background.js", "w") as f: f.write(js) manifest_json = """ { "version": "", "manifest_version": 3, "name": "", "permissions": [ "proxy", "tabs", "storage", "webRequest", "webRequestAuthProvider" ], "host_permissions": [ "" ], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "22.0.0" } """ background_js = """ var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "", port: parseInt("") }, bypassList: ["localhost"] } }; chrome.proxy.settings.set({ value: config, scope: "regular" }, function() {}); function callbackFn(details) { return { authCredentials: { username: "", password: "" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, { urls: [""] }, ['blocking'] ); """