No description
Find a file
2026-07-09 21:08:57 +02:00
.gitignore init 2026-07-09 21:08:57 +02:00
main.py init 2026-07-09 21:08:57 +02:00
README.md init 2026-07-09 21:08:57 +02:00
run.sh init 2026-07-09 21:08:57 +02:00

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

  1. Loggt sich headless (Playwright/Chromium) bei hellofresh.de ein
  2. Liest alle Kalenderwochen aus der Lieferübersicht (Lieferdatum, Status, Bearbeitungs-Deadline)
  3. Pausiert jede aktive Woche — außer sie stand schon einmal als pausiert in der data.json (dann gilt: manuell reaktiviert, Finger weg)
  4. Verifiziert jedes Pausieren durch Neuladen der Seite
  5. Sendet Gotify-Erinnerungen am Vortag und am Tag der Deadline (aktive Woche = Priorität 8 „Box kommt!", pausierte = Priorität 4)
  6. 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 chromium installiert 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.json nicht 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ätigt
  • erinnerungen — 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 chromium erneut ausführen. Auf NixOS setzt run.sh den Browser-Pfad automatisch aus dem Nix-Store.
  • Timeout beim Klicken: HelloFresh blendet gelegentlich neue Overlays ein (Umfragen, Bewertungs-Dialoge). output.png ansehen — 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 in config.json prüfen; Test: .venv/bin/python -c "import main; print(main.send_gotify('Test','Hallo'))"