JuliusJacobitz / vaccipy

Automatische Terminbuchung für den Corona Impfterminservice.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

vaccipy

build-windows build-linux-64

Automatisierte Impfterminbuchung auf www.impfterminservice.de.

Features

⚠️ Google Chrome muss auf dem PC installiert sein (Windows, Mac und Linux) ⚠️

Shoutout an:

  • DASDING: Danke für das Feature an Dani Rapp!

Ausgangssituation

Unsere Großeltern möchten sich gerne impfen lassen, aber telefonsich unter 116117 kommen sie nicht durch und das Internet ist auch noch immer irgendwie Neuland. Jetzt kommt es zum Konflikt: einerseits möchte man natürlich gerne bei der Terminbuchung helfen, andererseits hat man aber auch keine Lust, deshalb nun den ganzen Tag vor dem Computer zu hocken und die Seite zu aktualisieren...

Wie funktioniert vaccipy?

Zunächst trägst du deinen "Impf-Code" (Beispiel: A1B2-C3D4-E5F6), die PLZ deines Impfzentrums und deine Daten (Anschrift, Telefon, Mail) ein, die bei der Terminbuchung angegeben werden sollen. Du wirst zur Eingabe aufgefordert und deine Daten werden in der Datei ./kontaktdaten.json gespeichert.

Hinweis: Es kann sein, dass für mehrere Impfzentren unterschiedliche Codes benötigt werden (mehr Infos: Auflistung der gruppierten Impfzentren).

Anschließend passiert alles automatisch: vaccipy checkt für dich minütlich, ob ein Termin verfügbar ist und bucht den erstbeste einen zufälligen.

Workflow

workflow

vaccipy nutzt die selben Endpunkte zur Terminbuchung, wie dein Browser.

  1. Abruf aller Impfzentren und abgleich, ob für die eingetragene PLZ ein Impfzentrum existiert
  2. Abruf der Impfstoffe, die im gewählten Impfzentrum verfügbar sind

Zur Terminbuchung werden Cookies benötigt (bm_sz), die im Browser automatisch erzeugt werden. Damit wir diese auch im Script haben, wird zu Beginn eine Chrome-Instanz (im Prinzip ein separates Chrome-Fenster) geöffnet und eine Unterseite des Impfterminservices aufgerufen. Anschließend werden die Cookies extrahiert und im Script aufgenommen.

  1. Cookies abrufen
  2. Mit dem Code "einloggen", im Browser ist das der Schritt: Impfzentrum auswählen und Impf-Code eintragen

Die nachkommenden Schritte erfolgen im Loop. Es werden minütlich verfügbare Termine abgerufen und, sollten Termine verfügbar sein, der erstbeste ein zufälliger ausgewählt.

Dieser Prozess kann eine längere Zeit. Sobald die Cookies abgelaufen sind, wird wieder ein Chrome-Fenster geöffnet und neue Cookies erstellt.

  1. Termine abrufen: Wenn Termine verfügbar sind, springe zu Schritt 8

  2. (Option 1) Eine Minute warten

oder

  1. (Option 2) bei Ablauf Cookies erneuern

Wenn ein Termin verfügbar ist, wird dieser mit den eingetragenen Daten gebucht.

Achtung! Im nächsten Schritt wird ein verbindlicher Impftermin gebucht!

  1. Buchen des Impftermins

Termin gebucht, was nun?

Nachdem dein Termin erfolgreich gebucht wurde, erhälst du eine Mail, in der du zunächst deine Mail-Adresse bestätigen musst. Nachdem du die Mail bestätigt hast, erhälst du zu jedem Termin eine Buchungsbestätigung. That's it!

Du kannst alternativ deine Buchung auch im Browser einsehen. Dazu musst du dich auf www.impfterminservice.de begeben, dein Impfzentrum auswählen und anschließend rechts-oben auf "Buchung verwalten" klicken.

Programmdurchlauf

Beispiel Programmdurchlauf

Requirements

  • Python 3 (getestet mit Python 3.8 und 3.9)
  • pip (zur Installation der Python-Module, getestet mit pip3)
  • Google Chrome oder Chromium

Die notwendigen Python-Module können mittels pip installiert werden.

pip3 install -r requirements.txt

Verwendung

vaccipy kannst du über die Kommandozeile oder in einer beliebigen python-Entwicklungsumgebung ausgeführen. Nach dem Programmstart kannst du interaktiv auswählen, ob du einen Impf-Code generieren möchtest, oder einen Termin suchen möchtest.

python3 main.py

Alternativ kannst du Subkommandos verwenden, um deine Auswahl zu treffen:

# Kontaktdaten (für Impf-Code) eingeben und in kontaktdaten.json speichern:
python3 main.py code --configure-only

# Kontaktdaten (für Impf-Code) eingeben und in beliebiger Datei speichern:
python3 main.py code --configure-only -f max-mustermann.json

# Impf-Code generieren:
python3 main.py code

# Impf-Code generieren und dafür die Kontaktdaten aus beliebiger Datei verwenden:
python3 main.py code -f max-mustermann.json

# Kontaktdaten (für Terminsuche) eingeben und in kontaktdaten.json speichern:
python3 main.py search --configure-only

# Kontaktdaten (für Terminsuche) eingeben und in beliebiger Datei speichern:
python3 main.py search --configure-only -f max-mustermann.json

# Termin suchen:
python3 main.py search

# Termin suchen und dafür die Kontaktdaten aus beliebiger Datei verwenden:
python3 main.py search -f max-mustermann.json

Optionale Umgebungsvariablen

  • VACCIPY_CHROMEDRIVER: Name oder relativer Pfad der chromedriver Programmdatei, die du verwenden möchtest. Dies kann verwendet werden, falls du deine eigene chromedriver-Installation verwenden möchtest und wird z. B. auf NixOS benötigt. Beispiel: chromedriver

Distributionen

Für eine bessere Nutzererfahrung erstellen wir verschiedene Distributionen, die ohne installation von Python direkt ausgeführt werden können. Die Unterfolder von dist/ sind jeweils Distributionen die geteilt werden können und eigenständig funktionieren.

Zum Ausführen des Programms, einfach die passende Distribution (basierend auf dem eigenen Betriebssysstem) auswählen und die folgende Datei ausführen.

Hinweis: Es wird jeweils immer der gesamte Ordner benötigt!

Download

Verfügbare Distributionen:

Ausführung Windows:

  • .zip Ordner entpacken
  • Im windows-terminservice\-Ordner die windows-terminservice.exe ausführen.

Für mehr Info zum Verteilen und Erstellen der Distributionen: Shipping

Shipping

Workflows

Um den Buildprozess zu vereinfachen gibt es verschiedene Buildpipelines, welche bei push Events in den Masterbranch ausgeführt werden.
Die pipelines sind im .github/workflows Ordner zu finden.

Aktuelle Pipelines:

Generell

Zum Erstellen der Distributionen wird pyinstaller verwendet.
Schritte zum Erstellen einer Distribution:

  • Erstelle eine .spec Datei für die main.py (einmalig)
    ⚠️ACHTUNG⚠️: Beim erstellen der .spec den python code für cloudscraper nicht löschen!

  • Erstelle die Distribution basierend auf der erstellten .spec Datei:

    pyinstaller --clean specs/SPECNAME.spec

    Nachdem mit pyinstaller die Distribution erstellt wurde, ist diese in im dist/ folder zu finden.

Windows

.spec Datei erstellen und anschließend Distribution erstellen:
⚠️ACHTUNG⚠️: Beim erstellen der .spec den python code für cloudscraper nicht löschen!

pyi-makespec main.py --specpath "specs//" --add-binary "..\tools\chromedriver\chromedriver-windows.exe;tools\chromedriver\" --name windows-terminservice --hidden-import plyer.platforms.win.notification --hidden-import cloudscraper

pyinstaller --clean specs/windows-terminservice.spec

Linux

pyi-makespec main.py --specpath "specs//" --add-binary "../tools/chromedriver/chromedriver-linux-64:tools/chromedriver/" --name linux-64-terminservice --hidden-import cloudscraper

pyinstaller --clean specs/linux-64-terminservice.spec

Resources

Das könnte noch kommen

Es gibt noch ein paar Features, die cool wären. Die Ideen werden hier mal gesammelt und werden (von uns oder euch - feel free!) irgendwann hinzukommen:

  • Datum eingrenzen bei der Terminwahl
  • Github Pages
  • Macosx Build / Pipeline (Mac currently blocks the app: Branch)
  • Code Zertifikate für Windows (gegen Virusmeldung)
  • Artifacts, Packages und Releases

Das kann vaccipy NICHT - und wird es auch nie können

vaccipy dient lediglich als Unterstützung bei der Impftermin-Buchung EINER EINZELNEN PERSON, weshalb folgende Automatisierungen und Erweiterungen NICHT kommen werden:

  • Möglichkeit zum Eintragen mehrerer Impf-Codes und Kontaktdaten
  • Headless Selenium Support

Bedanken?

.. musst du dich nicht. Es freut uns sehr, wenn wir dir die Terminsuche etwas erleichtern konnten.

Für den Fall, dass du dein Dank gerne in Geld ausdrücken möchtest, haben wir hier eine Spendenaktion eingerichtet. ÄRZTE OHNE GRENZEN leistet weltweit medizinische Nothilfe in Krisen- und Kriegsgebieten und nach Naturkatastrophen.

Es wäre mega cool, wenn du dich daran beteiligst - ist aber vollkommen freiwillig, also no pressure 😉

Seid vernünftig und missbraucht das Tool nicht.

save da world. my final message. goodbye.

About

Automatische Terminbuchung für den Corona Impfterminservice.

License:MIT License


Languages

Language:Python 99.0%Language:Nix 1.0%