Ejemplo n.º 1
0
def run_search(kontaktdaten, check_delay):
    """
    Nicht-interaktive Terminsuche

    :param kontaktdaten: Dictionary mit Kontaktdaten
    """

    try:
        code = kontaktdaten["code"]

        # Hinweis, wenn noch alte Version der Kontaktdaten.json verwendet wird
        if kontaktdaten.get("plz"):
            print(
                "ACHTUNG: 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.\n"
            )
            plz_impfzentren = [kontaktdaten.get("plz")]
        else:
            plz_impfzentren = kontaktdaten["plz_impfzentren"]

        kontakt = kontaktdaten["kontakt"]
        print(
            f"Kontaktdaten wurden geladen für: {kontakt['vorname']} {kontakt['nachname']}\n"
        )
    except KeyError as exc:
        raise ValueError(
            "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") from exc

    ImpfterminService.terminsuche(code=code,
                                  plz_impfzentren=plz_impfzentren,
                                  kontakt=kontakt,
                                  check_delay=check_delay,
                                  PATH=PATH)
Ejemplo n.º 2
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"]
        if not telefonnummer.startswith("+49"):
            telefonnummer = f"+49{remove_prefix(telefonnummer, '0')}"
    except KeyError as exc:
        raise ValueError(
            "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") from exc

    its = ImpfterminService([], {}, PATH)

    # Einmal Chrome starten, um früh einen Fehler zu erzeugen, falls die
    # erforderliche Software nicht installiert ist.
    its.log.info("Prüfen von Chromium und Chromedriver")
    its.get_chromedriver(headless=True).quit()

    print(
        "\nBitte trage nachfolgend dein Geburtsdatum im Format DD.MM.YYYY ein.\n"
        "Beispiel: 02.03.1982\n")
    while True:
        try:
            geburtsdatum = input("> Geburtsdatum: ")
            validate_datum(geburtsdatum)
            break
        except ValidationError as exc:
            print(
                "Das Datum entspricht nicht dem richtigen Format (DD.MM.YYYY). "
                "Bitte erneut versuchen.")

    # code anfordern via selenium
    try:
        if its.selenium_code_anfordern(mail, telefonnummer, plz_impfzentrum,
                                       geburtsdatum):
            return True
    except RuntimeError as exc:
        print(
            f"\nDie Code-Generierung war leider nicht erfolgreich:\n{str(exc)}"
        )
        return False

    print("Die Code-Generierung war leider nicht erfolgreich.")
    return False
Ejemplo n.º 3
0
    def suchen(self):
        """
        Startet die Terminsuche. Dies nur mit einem Thread starten, da die GUI sonst hängt
        """

        kontakt = self.kontaktdaten["kontakt"]
        codes = self.kontaktdaten["codes"]
        plz_impfzentren = self.kontaktdaten["plz_impfzentren"]

        try:
            ImpfterminService.terminsuche(codes=codes, plz_impfzentren=plz_impfzentren, kontakt=kontakt,
                                          notifications=self.notifications, PATH=self.ROOT_PATH,
                                          check_delay=self.check_delay, zeitrahmen=self.zeitrahmen)

            self.fertig.emit()

        except Exception as error:
            self.fehlschlag.emit(error)
Ejemplo n.º 4
0
    def code_gen(self):
        """
        Startet den Prozess der Codegenerierung
        Codegenerierung ohne interaktive Eingabe der Kontaktdaten
        :param kontaktdaten: Dictionary mit Kontaktdaten
        """
        try:
            self.plz_impfzentrum = self.kontaktdaten["plz_impfzentren"][0]
            self.mail = self.kontaktdaten["kontakt"]["notificationReceiver"]
            self.telefonnummer = self.kontaktdaten["kontakt"]["phone"]
        except KeyError as error:
            self.signalShowDlg.emit("MISSING_KONTAKT","")
            self.stop()
           
        if self.stopped is True:
            return False
            
        its = ImpfterminService([], {}, self.ROOT_PATH)
        
        # send signal for GUI
        self.sendSignalAndWait("signalShowInput","GEBURTSDATUM")

        #stop requested in the meanwhile?
        if self.stopped is True:
            return False
            
        # code anfordern via selenium
        try:
            if its.selenium_code_anfordern(self.mail, self.telefonnummer,  self.plz_impfzentrum, self.geburtsdatum):
                self.sendSignalAndWait("signalShowInput","SMSCODE_OK")
                return True
        except RuntimeError as exc:
            print(
                f"\nDie Code-Generierung war leider nicht erfolgreich:\n{str(exc)}")
            self.signalShowDlg.emit("CRITICAL_CLOSE",f"\nDie Code-Generierung war leider nicht erfolgreich:\n{str(exc)}")
            while True and self.stopped is False:
                QtCore.QThread.msleep(100)
            return False

        print("Die Code-Generierung war leider nicht erfolgreich.")

        self.signalShowDlg.emit("CRITICAL_CLOSE",f"SMS-Code ungültig.\n\nDie Code-Generierung war leider nicht erfolgreich")
        return False
Ejemplo n.º 5
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
Ejemplo n.º 6
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"]
        if not telefonnummer.startswith("+49"):
            telefonnummer = f"+49{remove_prefix(telefonnummer, '0')}"
    except KeyError as exc:
        raise ValueError(
            "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") from exc

    # Erstelle Zufallscode nach Format XXXX-YYYY-ZZZZ
    # für die Cookie-Generierung
    code_chars = string.ascii_uppercase + string.digits
    one = 'VACC'
    two = 'IPY' + random.choice(code_chars)
    three = ''.join(random.choices(code_chars, k=4))
    random_code = f"{one}-{two}-{three}"
    print(
        f"Für die Cookies-Generierung wird ein zufälliger Code verwendet ({random_code}).\n"
    )

    its = ImpfterminService(random_code, [plz_impfzentrum], {}, PATH)

    print(
        "Bitte trage nachfolgend dein Geburtsdatum im Format DD.MM.YYYY ein.\n"
        "Beispiel: 02.03.1982\n")
    while True:
        try:
            geburtsdatum = input("> Geburtsdatum: ")
            validate_datum(geburtsdatum)
            break
        except ValidationError as exc:
            print(
                "Das Datum entspricht nicht dem richtigen Format (DD.MM.YYYY). "
                "Bitte erneut versuchen.")

    print()
    # cookies erneuern und code anfordern
    its.renew_cookies_code()
    token = its.code_anfordern(mail, telefonnummer, plz_impfzentrum,
                               geburtsdatum)

    if token is not None:
        # code bestätigen
        print(
            "\nDu erhältst 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