178 lines
5.3 KiB
Python
178 lines
5.3 KiB
Python
"""
|
|
TBD
|
|
"""
|
|
|
|
__author__ = "Lukas Mahler"
|
|
__version__ = "0.0.3"
|
|
__date__ = "05.06.2021"
|
|
__email__ = "m@hler.eu"
|
|
__status__ = "Development"
|
|
|
|
# Standard
|
|
import os
|
|
import json
|
|
|
|
# Custom
|
|
from colorama import init, Fore, Style
|
|
from selenium import webdriver
|
|
from selenium.webdriver.chrome.options import Options
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.common.keys import Keys
|
|
from selenium.common.exceptions import TimeoutException
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as ec
|
|
|
|
|
|
def find_driver():
|
|
""" Check for chromedriver """
|
|
chrome_driver = None
|
|
|
|
try:
|
|
chrome_driver = os.getcwd() + "\\chromedriver.exe"
|
|
chrome_driver = chrome_driver.resolve()
|
|
os.path.isfile(chrome_driver)
|
|
except Exception as e:
|
|
# print("[DEBUG] Chromedriver wasn't found in current working directory")
|
|
pass
|
|
try:
|
|
chrome_driver = os.environ["PROGRAMFILES(x86)"] + r"\Google\Chrome\driver\chromedriver.exe"
|
|
os.path.isfile(chrome_driver)
|
|
except Exception as e:
|
|
# print(r"[DEBUG] Chromedriver wasn't found under %PROGRAMFILES(x86)%\Google\Chrome\driver")
|
|
pass
|
|
|
|
if not os.path.isfile(chrome_driver):
|
|
print("[ERROR] Couldn't find a Chromedriver, exiting...")
|
|
exit()
|
|
|
|
return chrome_driver
|
|
|
|
|
|
def driveroptions():
|
|
# Headless Chrome
|
|
chrome_options = Options()
|
|
# chrome_options.add_argument("--headless")
|
|
chrome_options.add_argument("--window-size=1920x1080")
|
|
chrome_options.add_argument("--log-level=3") # Fatal
|
|
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
|
|
chrome_options.add_argument("--User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36")
|
|
|
|
return chrome_options
|
|
|
|
|
|
def set_local_storage(driver, key, value):
|
|
driver.execute_script("window.localStorage.setItem('{}',{})".format(key, json.dumps(value)))
|
|
|
|
|
|
def main():
|
|
|
|
init()
|
|
url = 'https://353-iz.impfterminservice.de/impftermine/service?plz=20357'
|
|
# test
|
|
url = 'https://226-iz.impfterminservice.de/impftermine/service?plz=22457'
|
|
|
|
chrome_driver = find_driver()
|
|
chrome_options = driveroptions()
|
|
|
|
driver = webdriver.Chrome(options=chrome_options, executable_path=chrome_driver)
|
|
driver.get(url)
|
|
|
|
print("Fix the fucking cookie banner")
|
|
set_local_storage(driver, "ets-plz", "20357")
|
|
set_local_storage(driver, "nfa-cookie-settings", {"essential": "true", "statistics": "false"})
|
|
set_local_storage(driver, "nfa-show-cinfo-20201110-VP1246", "false")
|
|
print("Reloading page...")
|
|
|
|
driver.get(url)
|
|
# print("[DEBUG] NOW AT:", driver.current_url)
|
|
|
|
element_anspruchpruefen = WebDriverWait(driver, 10).until(
|
|
ec.presence_of_element_located(
|
|
(By.CSS_SELECTOR, ".ets-radio-control+ .ets-radio-control span")
|
|
)
|
|
)
|
|
element_anspruchpruefen.click()
|
|
|
|
txt = ""
|
|
waiting = WebDriverWait(driver, 10).until_not(
|
|
ec.text_to_be_present_in_element(
|
|
(By.CSS_SELECTOR, ".in"), "Bitte warten"
|
|
)
|
|
)
|
|
|
|
if not waiting:
|
|
element = driver.find_element_by_css_selector(".in")
|
|
txt = element.text
|
|
|
|
if "keine freien Termine" in txt or txt == "":
|
|
print(Fore.RED + "=> keine Termine" + Style.RESET_ALL)
|
|
exit()
|
|
else:
|
|
print(Fore.GREEN + "=> Sieht gar nicht schlecht aus" + Style.RESET_ALL)
|
|
|
|
element_impfberechtigt = WebDriverWait(driver, 10).until(
|
|
ec.presence_of_element_located(
|
|
(By.CSS_SELECTOR, ".align-items-start .ets-radio-control:nth-child(1) span")
|
|
)
|
|
)
|
|
element_impfberechtigt.click()
|
|
|
|
element_alter = WebDriverWait(driver, 10).until(
|
|
ec.presence_of_element_located(
|
|
(By.NAME, "age")
|
|
)
|
|
)
|
|
|
|
element_alter.send_keys('26')
|
|
element_alter.send_keys(Keys.ENTER)
|
|
|
|
try:
|
|
WebDriverWait(driver, 3).until(ec.url_changes(url))
|
|
except TimeoutException:
|
|
print(Fore.RED + "=> Doch keine Termine" + Style.RESET_ALL)
|
|
exit()
|
|
|
|
element_email = WebDriverWait(driver, 10).until(
|
|
ec.presence_of_element_located(
|
|
(By.CSS_SELECTOR, "input[formControlName=email]")
|
|
)
|
|
)
|
|
element_email.send_keys('test@test.de')
|
|
|
|
element_tel = driver.find_element_by_css_selector("input[formControlName=phone]")
|
|
element_tel.send_keys('000000000000')
|
|
|
|
url = driver.current_url
|
|
element_tel.send_keys(Keys.ENTER)
|
|
|
|
try:
|
|
WebDriverWait(driver, 3).until(ec.url_changes(url))
|
|
except TimeoutException:
|
|
print(Fore.RED + "=> Anforderung fehlgeschlagen" + Style.RESET_ALL)
|
|
exit()
|
|
|
|
print(Fore.GREEN + "=> Buchung möglich, bitte Pin übergeben" + Style.RESET_ALL)
|
|
|
|
# TODO
|
|
# Benachrichtigung das eine Buchung durchgeführt werden kann
|
|
# Irgendwie muss die PIN nun innerhalb von 10 Minuten vom Handy zur Website
|
|
pin = input("Bitte Pin eingeben: ")
|
|
|
|
element_pin = WebDriverWait(driver, 10).until(
|
|
ec.presence_of_element_located(
|
|
(By.CSS_SELECTOR, "input[formControlName=pin]")
|
|
)
|
|
)
|
|
element_pin.send_keys(pin)
|
|
|
|
# Wait Hack, delete on production
|
|
input()
|
|
|
|
# Cleanup
|
|
driver.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|