-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclasses.py
101 lines (88 loc) · 3.13 KB
/
classes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from time import sleep
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from multiprocessing import Manager, Process
import utils
class Storage:
def __init__(self):
try:
self.state= self.read()
except:
self.state = self.clear()
def __call__(self, key:str=None) -> dict:
if key:
return self.load(key)
return self.refresh
def refresh(self):
self.state = self.read()
return self.state
def read(self):
with open(utils.path) as storage:
return dict(json.loads(storage.read()))
def clear(self):
with open(utils.path,'w') as storage:
storage.write('{}')
return self.refresh()
def load(self, key:str, local:str=None):
if key in self.state:
if key == 'geb' and local == 'de':
geb=self.state['geb']
if '-' in geb:
return str(geb[-2:]+'.'+geb[5:7]+'.'+geb[:4])
return self.state[key]
return None
def save(self,key:str,value):
s=self.read()
data={key:value}
s.update(data)
with open(utils.path,'w') as storage:
storage.write(json.dumps(s))
self.refresh()
return s
class ImpfBot:
def __init__(self,system, url) -> None:
self.driver = webdriver.Chrome(utils.driver_path[system])
self.url = url
self.vars = {}
def teardown(self):
self.driver.quit()
def check(self):
try:
self.driver.find_element(By.XPATH, "/html/body/my-app/div/div[3]/mat-sidenav-container/mat-sidenav-content/appointment-public-view/div/form/div[1]/div/div[1]/div[5][contains(.,\'Keine Termine verfügbar\')]")
return False
except:
return True
def refresh(self):
self.driver.find_element(By.XPATH, "//span[contains(.,\'Suchen\')]").click()
def anmeldung(self,geb:str,plz:str,t:int=0.3):
s = lambda: sleep(t)
self.driver.get(self.url)
self.driver.find_element(By.CSS_SELECTOR, ".mat-checkbox-inner-container-no-side-margin").click()
s()
element = self.driver.find_element(By.XPATH, "//button[contains(.,\'Weiter\')]")
actions = ActionChains(self.driver)
actions.move_to_element(element).perform()
s()
self.driver.find_element(By.XPATH, "//button[contains(.,\'Weiter\')]").click()
s()
element = self.driver.find_element(By.CSS_SELECTOR, ".cdk-focused > .mat-button-wrapper")
actions = ActionChains(self.driver)
actions.move_to_element(element).perform()
s()
self.driver.find_element(By.CSS_SELECTOR, ".cdk-focused > .mat-button-wrapper").click()
s()
self.driver.find_element(By.ID, "mat-input-2").click()
s()
self.driver.find_element(By.ID, "mat-input-2").send_keys(geb)
s()
self.driver.find_element(By.XPATH, "//span[contains(.,\'Weiter\')]").click()
s()
self.driver.find_element(By.ID, "mat-input-0").click()
s()
self.driver.find_element(By.ID, "mat-input-0").send_keys(plz)