Skip to content

Commit

Permalink
refactor(search): Rotiere durch PLZs, anstatt Zufallswahl (#444)
Browse files Browse the repository at this point in the history
  • Loading branch information
haslersn committed Jun 13, 2021
1 parent 481e136 commit 5bb928e
Showing 1 changed file with 40 additions and 54 deletions.
94 changes: 40 additions & 54 deletions tools/its.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from base64 import b64encode
from datetime import datetime, date, timedelta
from datetime import time as dtime
from itertools import cycle
from json import JSONDecodeError
from random import choice, choices, randint

Expand Down Expand Up @@ -809,58 +810,45 @@ def login(self, plz_impfzentrum, code, cookies):
"Login mit Code fehlgeschlagen: "
f"JSONDecodeError: {str(exc)}") from exc

def reservierung_finden(self, plz_impfzentren: list, zeitrahmen: dict):
for url in self.impfzentren:
ausgewaehlte_impfzentren = [
iz for iz in self.impfzentren[url]
if iz["PLZ"] in plz_impfzentren
]
if not ausgewaehlte_impfzentren:
continue

plz = choice(ausgewaehlte_impfzentren)["PLZ"]
codepoints = self.codepoints[url]
if not codepoints:
self.log.warn(f"Kein gültiger Vermittlungscode vorhanden für PLZ {plz}")
continue

now = datetime.now()
usable_codepoints = [
cp for cp in codepoints if cp["next_use"] <= now
]
if not usable_codepoints:
continue
def reservierung_finden(self, zeitrahmen: dict, plz: str):
url = self.impfzentrum_in_plz(plz)["URL"]
codepoints = self.codepoints[url]
if not codepoints:
self.log.warn(f"Kein gültiger Vermittlungscode vorhanden für PLZ {plz}")
return None

codepoint = usable_codepoints[0]
code = codepoint["code"]
now = datetime.now()
usable_codepoints = [
cp for cp in codepoints if cp["next_use"] <= now
]
if not usable_codepoints:
return None

try:
reservierung = self.reservierung_hier_finden(
zeitrahmen, plz, code)
if reservierung is not None:
return reservierung
except UnmatchingCodeError:
codepoints.remove(codepoint)
plz_ausgeschlossen = [
iz["PLZ"] for iz in ausgewaehlte_impfzentren
]
self.log.info(
f"Überspringe Code {code[:4]}* "
f"für {', '.join(plz_ausgeschlossen)}")
except TimeframeMissed:
# Es wurden Termine gefunden und alle gefundenen Termine
# abgelehnt.
# Der verwendete Code soll frühestens in 10 Minuten erneut
# verwendet werden, da sonst immer wieder die gleichen Termine
# gefunden und abgelehnt werden.
self.log.info(f"Pausiere Code {code[:4]}* für 10 Minuten")
codepoint["next_use"] = now + timedelta(minutes=10)
except RuntimeError as exc:
self.log.error(str(exc))
codepoint = usable_codepoints[0]
code = codepoint["code"]

try:
reservierung = self.reservierung_finden_mit_code(
zeitrahmen, plz, code)
if reservierung is not None:
return reservierung
except UnmatchingCodeError:
codepoints.remove(codepoint)
self.log.info(f"Überspringe Code {code[:4]}* für {plz}")
except TimeframeMissed:
# Es wurden Termine gefunden und alle gefundenen Termine
# abgelehnt.
# Der verwendete Code soll frühestens in 10 Minuten erneut
# verwendet werden, da sonst immer wieder die gleichen Termine
# gefunden und abgelehnt werden.
self.log.info(f"Pausiere Code {code[:4]}* für 10 Minuten")
codepoint["next_use"] = now + timedelta(minutes=10)
except RuntimeError as exc:
self.log.error(str(exc))

return None

def reservierung_hier_finden(
def reservierung_finden_mit_code(
self, zeitrahmen: dict, plz: str, code: str):
"""
Es wird überprüft, ob im Impfzentrum in der gegebenen PLZ ein oder
Expand All @@ -876,7 +864,7 @@ def reservierung_hier_finden(
'von_datum': '29.03.2021'
}
self.reservierung_hier_finden(
self.reservierung_finden_mit_code(
zeitrahmen, '68163', 'XXXX-XXXX-XXXX')
{
'code': 'XXXX-XXXX-XXXX',
Expand Down Expand Up @@ -1242,14 +1230,14 @@ def terminsuche(codes: list, plz_impfzentren: list, kontakt: dict,
its.log.info("Teste Chromedriver")
its.get_chromedriver(headless=True).quit()

while True:
for plz_impfzentrum in cycle(plz_impfzentren):
its.log.set_prefix(" ".join([
plz for plz in plz_impfzentren
if its.codepoints[izs_by_plz[plz]["URL"]]
]))
reservierung = its.reservierung_finden(plz_impfzentren, zeitrahmen)
url = its.impfzentrum_in_plz(plz_impfzentrum)["URL"]
reservierung = its.reservierung_finden(zeitrahmen, plz_impfzentrum)
if reservierung is not None:
url = reservierung["impfzentrum"]["URL"]
try:
its.termin_buchen(reservierung)
msg = "Termin erfolgreich gebucht!"
Expand Down Expand Up @@ -1278,13 +1266,11 @@ def terminsuche(codes: list, plz_impfzentren: list, kontakt: dict,

# Rotiere Codes, um in nächster Iteration andere Codes zu
# verwenden.
for url in its.impfzentren:
its.rotiere_codepoints(url)
its.rotiere_codepoints(url)

time.sleep(check_delay)



def terminpaar_im_zeitrahmen(terminpaar, zeitrahmen):
"""
Checken ob Terminpaar im angegebenen Zeitrahmen liegt
Expand Down

0 comments on commit 5bb928e

Please sign in to comment.