Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
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)