Anny Platzbuchung.
Bucht für mich einen Lernplatz in der KIT-Bibliothek über anny.eu — wartet darauf, dass Plätze frei werden, und reserviert einen, bevor sich die Schlange bildet.
Versuch selbst, die Freigabe zu schlagen
Das ist der echte Raum — Lehrbuchsammlung, Erd- und erstes Obergeschoss, KIT-Bibliothek. Starte die Uhr und versuch, schneller zu klicken als alle anderen, die denselben Platz wollen.
001. OG
Mit Teppich — Schritte und ein zurückgeschobener Stuhl landen leiser als im Erdgeschoss.
01Hinter einem Regal
Außerhalb der Sichtlinie von Vorbeigehenden, das hilft beim Konzentrieren.
02Ecke
Am toten Ende der Reihe — kaum jemand hat einen Grund, an dir vorbeizulaufen.
- Bester — eine Ecke, hinter einem Regal und im 1. OG, alles gleichzeitig
- Sehr gut — hat zwei von den dreien
- Okay — hat nur eins davon
- Einfach — hat keins davon
Freigabe
19:59:54
bis Plätze frei werden
0 Plätze übrig
Drei Stunden Beobachtung, eine Stunde gezeigt
Die Plätze werden gegen 20:00 freigegeben. Gegen — die genaue Minute schwankt, und sie zu verpassen heißt: kein Platz. Also beginnt der Bot um 17:00 und fragt anny alle 30 Sekunden, ob die Slots offen sind. Fünf Minuten vor und nach jeder halben Stunde, wo die Freigabe tatsächlich landet, geht er auf alle 5 Sekunden runter.
- Anfragen in dieser Stunde
- 321
- Innerhalb der Freigabefenster
- 241
- Größte blinde Lücke
- 5s
Das ist ein Tausch, kein Geschenk. Konstantes Abfragen ist tatsächlich sparsamer — 121 Anfragen gegen 321 in dieser Stunde — und verteilt sie gleichmäßig über fünfzig Minuten, in denen nichts passiert. Was es nicht kann: die Lücke schließen. Dreißig Sekunden blind genau dann, wenn die Plätze erscheinen, gegen fünf. Am Semesterende sind dreißig Sekunden die ganze Schlange.
Zwei Plätze, gleichzeitig gebucht
00Randbedingung
Eine einzelne Buchung darf fünf Stunden nicht überschreiten, ein Arbeitstag ist länger. Ein ganzer Tag sind also zwei getrennte Reservierungen: 09:00–14:00 und 14:00–18:00.
01Die naive Variante
Erst den Vormittag buchen, dann den Nachmittag. Das klappt in jedem Test und versagt genau dann, wenn es zählt: während die erste Reservierung durchläuft, nehmen alle anderen den Nachmittag, und am Ende hält man einen halben Schreibtisch.
02Was er tut
Beide Reservierungen gehen zusammen raus statt nacheinander, die zweite wartet also nicht auf die erste. Entweder man bekommt den Tag, oder man erfährt sofort, dass man ihn nicht bekommt.
Die Plätze werden außerdem nach einer Prioritätenliste gewählt, nicht einfach der Reihe nach — der erste freie Platz, an dem ich wirklich sitzen möchte, nicht der erste freie Platz.
Wofür der Browser noch da ist
Die erste Version war durchgehend ein Scraper: einloggen, navigieren, das Element finden, klicken, warten, wieder klicken — ein Bot, der einen Menschen spielt. Das geht gut, bis zu den letzten Semesterwochen, wenn alle einen Platz wollen und die Seite zu überlastet ist, um zuverlässig zu rendern. Ein gespielter Mensch kann keine Seite anklicken, die nie fertig lädt.
Also wurde der Browser auf das eine reduziert, worin er wirklich gut ist: durch die Tür kommen. Der Login läuft zweistufig — anny, und dahinter das Konto-System der Universität — und diesen Handshake von Hand nachzubauen hieße, einen Haufen Cookies und Weiterleitungen zu pflegen, worauf ich keine Lust habe. Ein echter Browser macht das einmal pro Stunde und reicht die Session weiter.
Alles danach läuft direkt über die API: fragen, ob eine Zeit frei ist, die Plätze lesen, nach Prioritätenliste wählen, reservieren, absenden. Kein Layout, das brechen kann, nichts, worauf man warten muss — und es funktioniert, während die Seite selbst kaum noch steht.
Wenn er ausfällt, und das tut er
Er läuft als Docker-Container auf einem Server, rund um die Uhr, und meldet sich, wenn etwas fatal schiefgeht: ein Telegram-Bot feuert in dem Moment, in dem das Programm stirbt. Das ist kein Monitoring zum Selbstzweck — es ist der Unterschied zwischen 20:01 Bescheid wissen und es am nächsten Morgen ohne Platz zu merken. Kommt die Nachricht, buche ich von Hand und debugge danach.
Er stürzt weiterhin manchmal ab. Das meiste davon kann ich nicht beheben: der Dienst ist überlastet, seine Antworten sind uneinheitlich, und was ausfällt, liegt jenseits einer API, die mir nicht gehört. Der Bot ist darauf gebaut, sich berechenbar zu verhalten gegenüber Dingen, die es nicht sind.
Ehrlich gesagt: das zu schreiben hat eine ganze Menge Zeit gekostet, und es lief nicht auf Anhieb — die frühen Versionen scheiterten genau so, wie oben beschrieben. Inzwischen läuft er aber hervorragend: keine Bugs, keine Aussetzer, stabil genug, dass ich mir darüber gar keine Gedanken mehr mache. Und er spart mehr Zeit, als man denken würde, denn in der Bibliothek zu lernen ist tatsächlich leichter — bessere Konzentration, weniger Ablenkung als zu Hause, wo die Verbindung schlechter ist und ein großer Monitor für YouTube oder Gaming genauso gut geeignet ist wie fürs Programmieren. Kein Platz in der Bibliothek, nur weil ich gegen 20:00 Uhr beschäftigt war, sollte mich den ganzen Tag kosten können.
Das Repository ist privat. Auf Anfrage gehe ich den Code gerne durch.