87 lines
3.4 KiB
Python
87 lines
3.4 KiB
Python
from modules.imports import *
|
|
|
|
|
|
# create a webdriver
|
|
def firefox_driver(mobile=False, headless=False):
|
|
PC_USER_AGENT = (
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
|
|
"AppleWebKit/537.36 (KHTML, like Gecko)"
|
|
"Chrome/112.0.0.0 Safari/537.36 Edg/110.0.1587.56")
|
|
MOBILE_USER_AGENT = (
|
|
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X)"
|
|
"AppleWebKit/605.1.15 (KHTML, like Gecko)"
|
|
"CriOS/107.0.5060.63 Mobile/15E148 Safari/604.1"
|
|
)
|
|
options = Options()
|
|
options.set_preference('intl.accept_languages', 'fr-FR, fr')
|
|
if proxy_enabled :
|
|
setup_proxy(proxy_address,proxy_port, options)
|
|
options.set_preference("browser.link.open_newwindow", 3)
|
|
if FAST :
|
|
options.set_preference("permissions.default.image", 2) #disable image loading. You shouldn't use it except if really nessecary
|
|
if headless:
|
|
options.add_argument("-headless")
|
|
if mobile :
|
|
options.set_preference("general.useragent.override", MOBILE_USER_AGENT)
|
|
driver = webdriver.Firefox(options=options)
|
|
driver.set_window_size(1070 + hash(_mail)%20 , 1900 + hash(_password + "salt")%10) # mobile resolution are crazy high now, right ?
|
|
else :
|
|
options.set_preference("general.useragent.override", PC_USER_AGENT)
|
|
driver = webdriver.Firefox(options=options)
|
|
driver.set_window_size(1900 + hash(_mail)%20 , 1070 + hash(_password + "salt")%10)
|
|
return(driver)
|
|
|
|
def setup_proxy(ip, port, options, socks=False) :
|
|
PROXY = f"{ip}:{port}"
|
|
if socks :
|
|
options.set_preference('network.proxy.type', 1)
|
|
options.set_preference('network.proxy.socks', ip)
|
|
options.set_preference('network.proxy.socks_port', int(port))
|
|
options.set_preference("browser.link.open_newwindow", 3)
|
|
else :
|
|
webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
|
|
"httpProxy": PROXY,
|
|
"sslProxy": PROXY,
|
|
"proxyType": "MANUAL",
|
|
}
|
|
|
|
#Deal with rgpd popup as well as some random popup like 'are you satisfied' one
|
|
def rgpd_popup(driver) -> None:
|
|
for i in ["bnp_btn_accept", "bnp_hfly_cta2", "bnp_hfly_close"] :
|
|
try:
|
|
driver.find_element(By.ID, i).click()
|
|
except:
|
|
pass
|
|
|
|
# save webdriver cookies
|
|
def save_cookies():
|
|
pickle.dump(driver.get_cookies(), open(f"{'/'.join(__file__.split('/')[:-1])}/user_data/cookies/{_mail}.pkl", "wb"))
|
|
|
|
# load cookies previously saved to the driver
|
|
def load_cookies(driver):
|
|
cookies = pickle.load(open(f"{'/'.join(__file__.split('/')[:-1])}/user_data/cookies/{_mail}.pkl", "rb"))
|
|
for cookie in cookies:
|
|
driver.add_cookie(cookie)
|
|
|
|
"""
|
|
send_keys_wait([selenium element:element, str:keys]) send the different keys to the field element, with a random time between each press to simulate human action.
|
|
keys can be an string, but also selenium keys
|
|
"""
|
|
def send_keys_wait(element, keys):
|
|
for i in keys:
|
|
element.send_keys(i)
|
|
if FAST :
|
|
pass
|
|
else :
|
|
sleep(uniform(0.1, 0.3))
|
|
|
|
|
|
|
|
# Wait for the presence of the element identifier or [timeout]s
|
|
def wait_until_visible(search_by: str, identifier: str, timeout = 20, browser = driver) -> None:
|
|
try :
|
|
WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((search_by,identifier)), "element not found")
|
|
except TimeoutException as e:
|
|
print(f"element not found after {timeout}s")
|
|
|