C-Impf-DEHH/C-Impf.py

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()