def gen_code(kontaktdaten): """ Codegenerierung ohne interaktive Eingabe der Kontaktdaten :param kontaktdaten: Dictionary mit Kontaktdaten """ try: plz_impfzentrum = kontaktdaten["plz_impfzentren"][0] mail = kontaktdaten["kontakt"]["notificationReceiver"] telefonnummer = kontaktdaten["kontakt"]["phone"] telefonnummer = telefonnummer.strip() telefonnummer = remove_prefix(telefonnummer, "+49") telefonnummer = remove_prefix(telefonnummer, "0") except KeyError as exc: print( "Kontaktdaten konnten nicht aus 'kontaktdaten.json' geladen werden.\n" "Bitte überprüfe, ob sie im korrekten JSON-Format sind oder gebe " "deine Daten beim Programmstart erneut ein.\n") raise exc its = ImpfterminService("PLAT-ZHAL-TER1", [plz_impfzentrum], {}, PATH) print( "Wähle nachfolgend deine Altersgruppe aus (L920, L921, L922 oder L923).\n" "Es ist wichtig, dass du die Gruppe entsprechend deines Alters wählst, " "ansonsten wird dir der Termin vor Ort abesagt.\n" "In den eckigen Klammern siehst du, welche Impfstoffe den Gruppe jeweils zugeordnet sind.\n" "Beispiel: L921\n") while True: leistungsmerkmal = input("> Leistungsmerkmal: ").upper() if leistungsmerkmal in ["L920", "L921", "L922", "L923"]: break print("Falscheingabe! Bitte erneut versuchen:") # cookies erneuern und code anfordern its.renew_cookies() token = its.code_anfordern(mail, telefonnummer, plz_impfzentrum, leistungsmerkmal) if token is not None: # code bestätigen print( "\nDu erhälst gleich eine SMS mit einem Code zur Bestätigung deiner Telefonnummer.\n" "Trage diesen hier ein. Solltest du dich vertippen, hast du noch 2 weitere Versuche.\n" "Beispiel: 123-456\n") # 3 Versuche für die SMS-Code-Eingabe for _ in range(3): sms_pin = input("> SMS-Code: ").replace("-", "") if its.code_bestaetigen(token, sms_pin): print("\nDu kannst jetzt mit der Terminsuche fortfahren.\n") return True print("\nDie Code-Generierung war leider nicht erfolgreich.\n") return False
def main(): print("vaccipy 1.0\n") # Check, ob die Datei "kontaktdaten.json" existiert kontaktdaten_path = os.path.join(PATH, "kontaktdaten.json") kontaktdaten_erstellen = True if os.path.isfile(kontaktdaten_path): daten_laden = input( "Sollen die vorhandene Daten aus 'kontaktdaten.json' geladen werden (y/n)?: " ).lower() if daten_laden != "n": kontaktdaten_erstellen = False if kontaktdaten_erstellen: print( "Bitte trage zunächst deinen Impfcode und deine Kontaktdaten ein.\n" "Die Daten werden anschließend lokal in der Datei 'kontaktdaten.json' abgelegt.\n" "Du musst sie zukünftig nicht mehr eintragen.\n") code = input("Code: ") plz = input("PLZ des Impfzentrums: ") anrede = input("Anrede (Frau/Herr/...): ") vorname = input("Vorname: ") nachname = input("Nachname: ") strasse = input("Strasse: ") hausnummer = input("Hausnummer: ") wohnort_plz = input("PLZ des Wohnorts: ") wohnort = input("Wohnort: ") telefonnummer = input("Telefonnummer: +49") mail = input("Mail: ") # Anführende Zahlen und Leerzeichen entfernen telefonnummer = telefonnummer.strip() telefonnummer = remove_prefix(telefonnummer, "+49") telefonnummer = remove_prefix(telefonnummer, "0") kontakt = { "anrede": anrede, "vorname": vorname, "nachname": nachname, "strasse": strasse, "hausnummer": hausnummer, "plz": wohnort_plz, "ort": wohnort, "phone": f"+49{telefonnummer}", "notificationChannel": "email", "notificationReceiver": mail, } kontaktdaten = {"code": code, "plz": plz, "kontakt": kontakt} with open(kontaktdaten_path, 'w', encoding='utf-8') as f: json.dump(kontaktdaten, f, ensure_ascii=False, indent=4) else: with open(kontaktdaten_path) as f: kontaktdaten = json.load(f) try: code = kontaktdaten["code"] plz = kontaktdaten["plz"] kontakt = kontaktdaten["kontakt"] print( f"Kontaktdaten wurden geladen für: {kontakt['vorname']} {kontakt['nachname']}\n" ) except KeyError as exc: print( "Kontaktdaten konnten nicht aus 'kontaktdaten.json' geladen werden.\n" "Bitte überprüfe, ob sie im korrekten JSON-Format sind oder gebe " "deine Daten beim Programmstart erneut ein.") raise exc ImpfterminService.run(code=code, plz=plz, kontakt=kontakt, check_delay=30)
def update_kontaktdaten_interactive(known_kontaktdaten, command, filepath=None): """ Interaktive Eingabe und anschließendes Abspeichern der Kontaktdaten. :param known_kontaktdaten: Bereits bekannte Kontaktdaten, die nicht mehr abgefragt werden sollen. :param command: Entweder "code" oder "search". Bestimmt, welche Kontaktdaten überhaupt benötigt werden. :param filepath: Pfad zur JSON-Datei zum Abspeichern der Kontaktdaten. Default: data/kontaktdaten.json im aktuellen Ordner :return: Dictionary mit Kontaktdaten """ assert (command in ["code", "search"]) if filepath is None: filepath = os.path.join(PATH, "data/kontaktdaten.json") kontaktdaten = copy.deepcopy(known_kontaktdaten) with open(filepath, 'w', encoding='utf-8') as file: if "plz_impfzentren" not in kontaktdaten: print( "Mit einem Code kann in mehreren Impfzentren gleichzeitig nach einem Termin gesucht werden.\n" "Eine Übersicht über die Gruppierung der Impfzentren findest du hier:\n" "https://github.com/iamnotturner/vaccipy/wiki/Ein-Code-fuer-mehrere-Impfzentren\n\n" "Trage nun die PLZ deines Impfzentrums ein. Für mehrere Impfzentren die PLZ's kommagetrennt nacheinander.\n" "Beispiel: 68163, 69124, 69469\n") plz_impfzentren = input("> PLZ's der Impfzentren: ") kontaktdaten["plz_impfzentren"] = list( set([plz.strip() for plz in plz_impfzentren.split(",")])) if "code" not in kontaktdaten and command == "search": kontaktdaten["code"] = input("> Code: ") if "kontakt" not in kontaktdaten: kontaktdaten["kontakt"] = {} if "anrede" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["anrede"] = input( "> Anrede (Frau/Herr/...): ") if "vorname" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["vorname"] = input("> Vorname: ") if "nachname" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["nachname"] = input("> Nachname: ") if "strasse" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["strasse"] = input("> Strasse: ") if "hausnummer" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["hausnummer"] = input("> Hausnummer: ") if "plz" not in kontaktdaten["kontakt"] and command == "search": # Sicherstellen, dass die PLZ ein valides Format hat. _wohnort_plz_valid = False while not _wohnort_plz_valid: wohnort_plz = input("> PLZ des Wohnorts: ") wohnort_plz = wohnort_plz.strip() if len(wohnort_plz) == 5 and wohnort_plz.isdigit(): _wohnort_plz_valid = True else: print( f"Die eingegebene PLZ {wohnort_plz} scheint ungültig. Genau 5 Stellen und nur Ziffern sind erlaubt." ) kontaktdaten["kontakt"]["plz"] = wohnort_plz if "ort" not in kontaktdaten["kontakt"] and command == "search": kontaktdaten["kontakt"]["ort"] = input("> Wohnort: ") if "phone" not in kontaktdaten["kontakt"]: telefonnummer = input("> Telefonnummer: +49") # Anführende Zahlen und Leerzeichen entfernen telefonnummer = telefonnummer.strip() telefonnummer = remove_prefix(telefonnummer, "+49") telefonnummer = remove_prefix(telefonnummer, "0") kontaktdaten["kontakt"]["phone"] = f"+49{telefonnummer}" if "notificationChannel" not in kontaktdaten["kontakt"]: kontaktdaten["kontakt"]["notificationChannel"] = "email" if "notificationReceiver" not in kontaktdaten["kontakt"]: kontaktdaten["kontakt"]["notificationReceiver"] = input("> Mail: ") json.dump(kontaktdaten, file, ensure_ascii=False, indent=4) return kontaktdaten
def main(): print("vaccipy - Automatische Terminbuchung für den Corona Impfterminservice") # Check, ob die Datei "kontaktdaten.json" existiert kontaktdaten_path = os.path.join(PATH, "kontaktdaten.json") kontaktdaten_erstellen = True if os.path.isfile(kontaktdaten_path): daten_laden = input("\n> Sollen die vorhandene Daten aus 'kontaktdaten.json' " "geladen werden (y/n)?: ").lower() if daten_laden.lower() != "n": kontaktdaten_erstellen = False if kontaktdaten_erstellen: print("\nBitte trage zunächst deinen Impfcode und deine Kontaktdaten ein.\n" "Die Daten werden anschließend lokal in der Datei 'kontaktdaten.json' abgelegt.\n" "Du musst sie zukünftig nicht mehr eintragen.\n") code = input("> Code: ") print( "\nMit einem Code kann in mehreren Impfzentren gleichzeitig nach einem Termin gesucht werden.\n" "Eine Übersicht über die Gruppierung der Impfzentren findest du hier:\n" "https://github.com/iamnotturner/vaccipy/wiki/Ein-Code-fuer-mehrere-Impfzentren\n\n" "Trage nun die PLZ deines Impfzentrums ein. Für mehrere Impfzentren die PLZ's kommagetrennt nacheinander.\n" "Beispiel: 68163, 69124, 69469\n") plz_impfzentren = input("> PLZ's der Impfzentren: ") plz_impfzentren = list(set([plz.strip() for plz in plz_impfzentren.split(",")])) anrede = input("\n> Anrede (Frau/Herr/...): ") vorname = input("> Vorname: ") nachname = input("> Nachname: ") strasse = input("> Strasse: ") hausnummer = input("> Hausnummer: ") wohnort_plz = input("> PLZ des Wohnorts: ") wohnort = input("> Wohnort: ") telefonnummer = input("> Telefonnummer: +49") mail = input("> Mail: ") # Anführende Zahlen und Leerzeichen entfernen telefonnummer = telefonnummer.strip() telefonnummer = remove_prefix(telefonnummer, "+49") telefonnummer = remove_prefix(telefonnummer, "0") kontakt = { "anrede": anrede, "vorname": vorname, "nachname": nachname, "strasse": strasse, "hausnummer": hausnummer, "plz": wohnort_plz, "ort": wohnort, "phone": f"+49{telefonnummer}", "notificationChannel": "email", "notificationReceiver": mail, } kontaktdaten = { "code": code, "plz_impfzentren": plz_impfzentren, "kontakt": kontakt } with open(kontaktdaten_path, 'w', encoding='utf-8') as f: json.dump(kontaktdaten, f, ensure_ascii=False, indent=4) else: with open(kontaktdaten_path) as f: kontaktdaten = json.load(f) try: code = kontaktdaten["code"] # Hinweis, wenn noch alte Version der Kontaktdaten.json verwendet wird if kontaktdaten.get("plz"): print("\nACHTUNG: Du verwendest noch die alte Version der 'Kontaktdaten.json'!\n" "Lösche vor dem nächsten Ausführen die Datei und fülle die Kontaktdaten bitte erneut aus.") plz_impfzentren = [kontaktdaten.get("plz")] else: plz_impfzentren = kontaktdaten["plz_impfzentren"] kontakt = kontaktdaten["kontakt"] print(f"\nKontaktdaten wurden geladen für: {kontakt['vorname']} {kontakt['nachname']}\n") except KeyError as exc: print("Kontaktdaten konnten nicht aus 'kontaktdaten.json' geladen werden.\n" "Bitte überprüfe, ob sie im korrekten JSON-Format sind oder gebe " "deine Daten beim Programmstart erneut ein.") raise exc ImpfterminService.run(code=code, plz_impfzentren=plz_impfzentren, kontakt=kontakt, check_delay=30)