- HTML 57.1%
- Python 42.9%
|
|
||
|---|---|---|
| .gitignore | ||
| Caddyfile.example | ||
| fetch.py | ||
| index.html | ||
| README.md | ||
| waitlist.py | ||
QRP Labs Waitlist Tracker
Verfolgt die Position einer Bestellung auf der QRP Labs Assembled-Kits Warteliste und schätzt den Versandmonat. Besteht aus einem Fetcher für Cron und einem statischen Dashboard.
Nur Python-Stdlib, keine Abhängigkeiten. Charts im Dashboard kommen aus einem eingebetteten Chart.js.
Dateien
| Datei | Zweck |
|---|---|
fetch.py |
Holt die Seite, parst Warteliste + Monatsstatistik, hängt einen Snapshot an data.json an. Für Cron gedacht. |
waitlist.py |
Einmalige Analyse direkt im Terminal, schreibt nichts. python3 waitlist.py <order_id> |
index.html |
Statisches Dashboard, lädt data.json per fetch() — braucht also einen Webserver, file:// funktioniert nicht. |
config.json |
Wird von fetch.py angelegt, enthält die Order-ID. Nicht im Repo. |
data.json |
Snapshot-Historie + Monatsstatistik, vom Fetcher geschrieben. Nicht im Repo. |
Caddyfile.example |
Beispiel-vHost für das Dashboard. |
Einrichtung
git clone https://git.syslinx.org/ituri/qrplabs-waitlist.git /var/www/waitlist
cd /var/www/waitlist
# einmalig: Order-ID setzen (wird in config.json gespeichert)
python3 fetch.py 119318
# danach ohne Argument
python3 fetch.py
Jeder Lauf hängt einen Snapshot an data.json an; die Historie ist die Datengrundlage der Verlaufsgrafiken im Dashboard.
Cron
Die Seite wird von QRP Labs typischerweise einmal am Tag aktualisiert — alle 6 Stunden reicht dicke:
0 */6 * * * cd /var/www/waitlist && python3 fetch.py >> /var/log/qrplabs.log 2>&1
Dashboard ausliefern
index.html und data.json müssen unter derselben URL liegen. Mit Caddy:
waitlist.example.com {
root * /var/www/waitlist
file_server
}
Zum schnellen Ausprobieren reicht auch:
python3 -m http.server 8000 # → http://localhost:8000
Wie geschätzt wird
- Geräte davor: Alle Einträge oberhalb der eigenen Position, wobei Bestellungen mit mehreren (kommaseparierten) Seriennummern entsprechend mehrfach zählen.
- Durchsatz: Aus der Monatsstatistik der Seite; als „realistisch" dient der Schnitt der letzten 3 Monate (Untergrenze 50/Monat). Dazu je ein pessimistisches (160/Monat) und optimistisches (300/Monat) Szenario.
- Status: Taucht die Order-ID nicht mehr auf und liegt sie unter der kleinsten gelisteten ID,
gilt sie als
shipped. Liegt sie darüber,not_found(z. B. Bestellung nach dem letzten Seiten-Update).
Wartung
Beide Skripte parsen rohes HTML mit html.parser. Ändert QRP Labs den Tabellenaufbau, bricht
das Parsing still ein: fetch.py meldet dann „Keine Einträge gefunden" und beendet sich mit
Exit-Code 1, ohne data.json anzufassen. Anlaufstellen dafür sind parse_waitlist()
(erwartet ≥5 Spalten: Position, Order-ID, Serial, Modell, Datum DD-Mon-YY) und
parse_shipped_history() (Spalte 1 Month YYYY, Spalte 3 Stückzahl).