different approach for har

main
mmalter 2025-02-13 08:50:39 +01:00
parent d7bfe4ed40
commit 3512843e10
1 changed files with 80 additions and 47 deletions

View File

@ -1,12 +1,43 @@
from selenium.webdriver import firefox
from fake_useragent import UserAgent from fake_useragent import UserAgent
from pathlib import Path from pathlib import Path
from selenium.webdriver import firefox
import importlib import importlib
import os import os
import tempfile
import types import types
import uuid
def tor_profile(): def unique_name(prefix):
return prefix + "-" + str(uuid.uuid4())
class Grattoir(object):
def __init__(self, name, with_har=False):
self.name = name
self.with_har = with_har
if self.with_har:
self.har_filename = unique_name(self.name)
self.har_export_path = tempfile.TemporaryDirectory()
self.export_path = (
self.har_export_path.name + "/" + self.har_filename
)
def tor_browser_binary_path(self):
for pe in os.environ["PATH"].split(os.pathsep):
checkname = os.path.join(pe, "tor-browser")
if os.access(checkname, os.X_OK) and not os.path.isdir(checkname):
return checkname
return None
def install_har_export_trigger(self):
with importlib.resources.path(
__package__ + ".assets",
"har_export_trigger-0.6.2resigned1.xpi",
) as p:
self.driver.install_addon(p.as_uri()[7:])
def tor_profile_path(self):
tor_firefox_path = str(Path("~/.tor project/firefox").expanduser()) tor_firefox_path = str(Path("~/.tor project/firefox").expanduser())
ini_path = tor_firefox_path + "/profiles.ini" ini_path = tor_firefox_path + "/profiles.ini"
with open(ini_path) as ini: with open(ini_path) as ini:
@ -14,47 +45,49 @@ def tor_profile():
if "Path=" in line: if "Path=" in line:
return tor_firefox_path + '/' + line.split('=')[1][:-1] return tor_firefox_path + '/' + line.split('=')[1][:-1]
def har_enabled_profile(self, profile):
prefs = {
"extensions.netmonitor.har.enableAutomation": True,
"extensions.netmonitor.har.contentAPIToken": "test",
"extensions.netmonitor.har.autoConnect": True,
"devtools.netmonitor.har.compress": False,
"devtools.netmonitor.har.defaultFileName": self.har_filename,
"devtools.netmonitor.har.defaultLogDir": self.har_export_path.name,
"devtools.netmonitor.har.enableAutoExportToFile": True,
"devtools.netmonitor.har.forceExport": True,
"devtools.netmonitor.har.includeResponseBodies": True,
"devtools.netmonitor.har.jsonp": True,
"devtools.netmonitor.har.jsonpCallback": True,
"devtools.netmonitor.har.pageLoadedTimeout": "2500",
"devtools.toolbox.selectedTool": "netmonitor",
"devtools.netmonitor.persistlog": True,
}
for k, v in prefs.items():
profile.set_preference(k, v)
return profile
def tor_browser_binary_path(): def firefox_profile(self):
for pe in os.environ["PATH"].split(os.pathsep): profile = firefox.firefox_profile.FirefoxProfile(profile_directory=self.tor_profile_path())
checkname = os.path.join(pe, "tor-browser") if self.with_har:
if os.access(checkname, os.X_OK) and not os.path.isdir(checkname): profile = self.har_enabled_profile(profile)
return checkname return profile
return None
def init_driver(self):
def install_har_export_trigger(driver): self.driver = None
with importlib.resources.path( b_path = self.tor_browser_binary_path()
__package__ + ".assets",
"har_export_trigger-0.6.2resigned1.xpi",
) as p:
driver.install_addon(p.as_uri()[7:])
return driver
def har_data(self):
return self.execute_async_script(
"HAR.triggerExport().then(arguments[0]);"
)
class Grattoir(object):
def __enter__(self):
self._driver = None
p_path = tor_profile()
profile = firefox.firefox_profile.FirefoxProfile(profile_directory=p_path)
profile.set_preference("devtools.toolbox.selectedTool", "netmonitor")
profile.set_preference("devtools.netmonitor.persistlog", True)
b_path = tor_browser_binary_path()
binary = firefox.firefox_binary.FirefoxBinary(firefox_path=b_path) binary = firefox.firefox_binary.FirefoxBinary(firefox_path=b_path)
o = firefox.options.Options() profile = self.firefox_profile()
o.profile = profile options = firefox.options.Options()
o.binary = binary options.profile = profile
self._driver = firefox.webdriver.WebDriver(options=o) options.binary = binary
self._driver = install_har_export_trigger(self._driver) self.driver = firefox.webdriver.WebDriver(options=options)
self._driver.har_data = types.MethodType(har_data, self._driver) self.install_har_export_trigger()
return self._driver
def __enter__(self):
self.init_driver()
return self
def __exit__(self, exc_type, exc_value, exc_tb): def __exit__(self, exc_type, exc_value, exc_tb):
self._driver.quit() self.driver.quit()
#if self.with_har:
#self.har_export_path.cleanup()