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("<ext_name>", name) manifest = manifest.replace("<ext_ver>", 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("<proxy_host>", self.host) js = js.replace("<proxy_port>", str(self.port)) js = js.replace("<proxy_username>", self.username) js = js.replace("<proxy_password>", self.password) with open(f"{proxy_folder}/background.js", "w") as f: f.write(js) manifest_json = """ { "version": "<ext_ver>", "manifest_version": 3, "name": "<ext_name>", "permissions": [ "proxy", "tabs", "storage", "webRequest", "webRequestAuthProvider" ], "host_permissions": [ "<all_urls>" ], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "22.0.0" } """ background_js = """ var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "<proxy_host>", port: parseInt("<proxy_port>") }, bypassList: ["localhost"] } }; chrome.proxy.settings.set({ value: config, scope: "regular" }, function() {}); function callbackFn(details) { return { authCredentials: { username: "<proxy_username>", password: "<proxy_password>" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, { urls: ["<all_urls>"] }, ['blocking'] ); """