tempora/driver/chrome_proxy.py

98 lines
2.5 KiB
Python

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']
);
"""