| .gitignore | ||
| main.py | ||
| README.md | ||
| run.sh | ||
hellofresh-usefull
Pausiert automatisch alle kommenden HelloFresh-Lieferwochen, damit jede Box eine bewusste Entscheidung ist: Was das Script einmal pausiert hat, fasst es nie wieder an — wer eine Woche im HelloFresh-Konto manuell reaktiviert, bekommt seine Box. Zusätzlich kommt am Vortag und am Tag der Bearbeitungs-Deadline eine Gotify-Benachrichtigung mit dem aktuellen Status.
Was das Script pro Lauf macht
- Loggt sich headless (Playwright/Chromium) bei hellofresh.de ein
- Liest alle Kalenderwochen aus der Lieferübersicht (Lieferdatum, Status, Bearbeitungs-Deadline)
- Pausiert jede aktive Woche — außer sie stand schon einmal als
pausiert in der
data.json(dann gilt: manuell reaktiviert, Finger weg) - Verifiziert jedes Pausieren durch Neuladen der Seite
- Sendet Gotify-Erinnerungen am Vortag und am Tag der Deadline (aktive Woche = Priorität 8 „Box kommt!", pausierte = Priorität 4)
- Speichert den Stand in
data.json
Installation auf dem Raspberry Pi (4/5, 64-bit OS)
Benötigt wird ein 64-bit Raspberry Pi OS (Playwright liefert keine 32-bit-ARM-Browser) und Python ≥ 3.10.
# 1. Projekt auf den Pi kopieren (z.B. per git clone oder scp)
cd ~
git clone <repo-url> hellofresh-usefull # oder: scp -r ...
cd hellofresh-usefull
# 2. Virtualenv anlegen und Playwright installieren
python3 -m venv .venv
.venv/bin/pip install playwright==1.56.0
# 3. Chromium + Systemabhängigkeiten installieren (einmalig, braucht sudo)
sudo .venv/bin/playwright install-deps chromium
.venv/bin/playwright install chromium
Wichtig: Das Script startet Chromium mit
channel="chromium"(volles Chromium statt Headless-Shell) — nur so kommt es an der Cloudflare-Bot-Erkennung von HelloFresh vorbei.playwright install chromiuminstalliert genau diesen Build.
config.json anlegen
cat > config.json <<'EOF'
{
"email": "deine@mail.de",
"password": "dein-hellofresh-passwort",
"gotify": {
"url": "https://gotify.example.com",
"token": "dein-gotify-app-token"
}
}
EOF
chmod 600 config.json
Den Gotify-Token bekommst du in der Gotify-Weboberfläche unter Apps → Create Application.
Testlauf
./run.sh
Der Lauf dauert ein bis zwei Minuten und gibt am Ende die Wochenliste als
JSON aus. Bei Erfolg liegt danach eine data.json im Projektordner sowie
output.html/output.png (Screenshot der Übersichtsseite, hilfreich beim
Debuggen).
Cron einrichten (2× täglich)
mkdir -p ~/hellofresh-usefull/logs
crontab -e
Eintrag (Läufe um 08:00 und 18:00; flock verhindert überlappende Läufe):
0 8,18 * * * flock -n /tmp/hellofresh-pause.lock /home/pi/hellofresh-usefull/run.sh >> /home/pi/hellofresh-usefull/logs/run.log 2>&1
Pfad ggf. anpassen, falls dein Benutzer nicht pi heißt. Das Log wächst
langsam; bei Bedarf mit logrotate oder gelegentlichem Löschen kürzen.
Dateien
| Datei | Zweck |
|---|---|
main.py |
Das komplette Script |
run.sh |
Wrapper: setzt Umgebung (NixOS-Erkennung) und startet main.py |
config.json |
Zugangsdaten + Gotify — niemals committen (steht in .gitignore) |
data.json |
Gedächtnis des Scripts: Wochenstatus, einmal_pausiert-Merker, gesendete Erinnerungen |
output.html / output.png |
Letzter Stand der Übersichtsseite (Debug) |
data.json verstehen
{
"kw": "2026-W30",
"lieferdatum": "2026-07-20",
"status": "pausiert",
"bearbeitbar_bis": "2026-07-15",
"einmal_pausiert": true,
"pausiert_verifiziert": true,
"erinnerungen": ["2026-07-14"]
}
einmal_pausiert— diese KW wurde schon einmal pausiert und wird vom Script nie wieder pausiert.data.jsonnicht löschen, sonst geht dieses Gedächtnis verloren und manuell reaktivierte Wochen würden beim nächsten Lauf erneut pausiert.pausiert_verifiziert— das Pausieren wurde per Neuladen bestätigterinnerungen— an diesen Tagen wurde bereits eine Deadline-Erinnerung gesendet (verhindert Duplikate bei 2 Läufen pro Tag)hinweis— z.B. „Deadline vorbei" oder „Manuell reaktiviert"
Ich will eine Box bekommen
Einfach im HelloFresh-Konto (App oder Web) die gewünschte Woche wieder
aktivieren — vor deren Bearbeitungs-Deadline (Mittwoch der Vorwoche).
Das Script erkennt am einmal_pausiert-Merker, dass es diese Woche nicht
erneut pausieren darf. Die Deadline-Erinnerung meldet dann „Aktuell AKTIV —
diese Box wird geliefert!".
Troubleshooting
- Login schlägt fehl / 403: Cloudflare-Bot-Erkennung. Prüfen, dass
wirklich das volle Chromium installiert ist (
.venv/bin/playwright install chromium) — die Headless-Shell wird blockiert. Executable doesn't exist: Browser fehlen →.venv/bin/playwright install chromiumerneut ausführen. Auf NixOS setztrun.shden Browser-Pfad automatisch aus dem Nix-Store.- Timeout beim Klicken: HelloFresh blendet gelegentlich neue Overlays
ein (Umfragen, Bewertungs-Dialoge).
output.pngansehen — dort sieht man, was der Browser zuletzt vor sich hatte. - Keine Gotify-Nachricht: Das Script bricht bei Gotify-Fehlern bewusst
nicht ab, loggt sie aber (
logs/run.log). URL/Token inconfig.jsonprüfen; Test:.venv/bin/python -c "import main; print(main.send_gotify('Test','Hallo'))"