Add yesterday download mode and example config files

This commit is contained in:
Stefan Heyn 2026-03-05 17:08:46 +01:00
parent 36938a7f59
commit c2370bcb5a
6 changed files with 82 additions and 13 deletions

View file

@ -54,6 +54,12 @@ Die Session wird lokal gespeichert in:
python main.py download --from 2025-01-01 --to 2025-12-31
```
Nur Rechnungen von gestern (Cron-geeignet):
```powershell
python main.py download --yesterday
```
## Docker Compose
Container-Image bauen:
@ -109,6 +115,7 @@ Alternative per Hilfsskript:
```bash
chmod +x ./startDownload.sh
./startDownload.sh 2025-01-01 2025-12-31
./startDownload.sh yesterday
```
Persistente Ordner:
@ -131,6 +138,7 @@ Optionen:
- `--headless true|false`: Browser sichtbar oder unsichtbar
- `--debug`: zeigt, wie viele Detailseiten und Rechnungslinks gefunden werden
- `--debug-json [pfad]`: schreibt Laufdetails als JSON (ohne Pfad: Standarddatei)
- `--yesterday`: laedt nur Rechnungen vom Vortag
- `configure --locale de-DE --timezone Europe/Berlin --amazon-language de_DE`: erzwingt deutsche Sprache (inkl. `language=de_DE`) und Berliner Zeitzone
- `configure --notify-email ... --smtp-host ...`: aktiviert E-Mail-Benachrichtigung bei Session-Ablauf
@ -138,6 +146,14 @@ SMTP kann alternativ auch ueber Umgebungsvariablen gesetzt werden:
- `NOTIFY_EMAIL`, `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASSWORD`, `SMTP_FROM`, `SMTP_STARTTLS`, `SMTP_SSL`
## Beispieldateien
Im Ordner `examples/` liegen Musterdateien:
- `examples/config.json.example` (Beispiel fuer `~/.amazon_invoice_downloader/config.json`)
- `examples/.env.example` (SMTP/Notification ENV fuer Docker Compose)
- `examples/crontab.example` (taeglicher Vortag-Download per Cron)
## Hinweise
- Das Skript setzt pro Jahr den Amazon-Filter `timeFilter=year-YYYY` auf `your-orders/orders`, damit Zeitraeume wie Januar 2025 korrekt durchlaufen werden.

9
examples/.env.example Normal file
View file

@ -0,0 +1,9 @@
# Optional SMTP/notification settings for docker compose
NOTIFY_EMAIL=stefan.heyn@googlemail.com
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=YOUR_SMTP_USER
SMTP_PASSWORD=YOUR_SMTP_APP_PASSWORD
SMTP_FROM=stefan.heyn@googlemail.com
SMTP_STARTTLS=true
SMTP_SSL=false

View file

@ -0,0 +1,19 @@
{
"marketplace": "de",
"download_dir": "/downloads",
"headless": true,
"locale": "de-DE",
"timezone": "Europe/Berlin",
"currency": "EUR",
"amazon_language": "de_DE",
"notify_email": "stefan.heyn@googlemail.com",
"smtp": {
"host": "smtp.gmail.com",
"port": 587,
"user": "YOUR_SMTP_USER",
"password": "YOUR_SMTP_APP_PASSWORD",
"from_addr": "stefan.heyn@googlemail.com",
"starttls": true,
"ssl": false
}
}

5
examples/crontab.example Normal file
View file

@ -0,0 +1,5 @@
# Beispiel-Cron (taeglich um 03:15 Uhr) fuer Vortag-Download
# Vorher sicherstellen: Session existiert in ./state/storage_state.json
# Optional: ENV-Datei laden, z. B. per source /home/heynst/amazon_invoice_downloader/.env
15 3 * * * cd /home/heynst/amazon_invoice_downloader && ./startDownload.sh yesterday >> /home/heynst/amazon_invoice_downloader/download-cron.log 2>&1

18
main.py
View file

@ -5,7 +5,7 @@ import re
import smtplib
import time
from dataclasses import dataclass
from datetime import date, datetime
from datetime import date, datetime, timedelta
from email.message import EmailMessage
from pathlib import Path
from typing import Optional
@ -400,8 +400,15 @@ def download(args) -> None:
if not STORAGE_STATE_PATH.exists():
raise SystemExit("Session fehlt. Bitte zuerst 'configure' ausfuehren.")
start_date = parse_iso_date(args.date_from)
end_date = parse_iso_date(args.date_to)
if args.yesterday:
yesterday = date.today() - timedelta(days=1)
start_date = yesterday
end_date = yesterday
else:
if not args.date_from or not args.date_to:
raise SystemExit("Bitte entweder --yesterday oder --from und --to angeben.")
start_date = parse_iso_date(args.date_from)
end_date = parse_iso_date(args.date_to)
if start_date > end_date:
raise SystemExit("'from' muss kleiner/gleich 'to' sein.")
@ -632,8 +639,9 @@ def build_parser() -> argparse.ArgumentParser:
p_config.set_defaults(func=configure)
p_dl = sub.add_parser("download", help="Rechnungen nach Zeitraum herunterladen")
p_dl.add_argument("--from", dest="date_from", required=True, help="Startdatum YYYY-MM-DD")
p_dl.add_argument("--to", dest="date_to", required=True, help="Enddatum YYYY-MM-DD")
p_dl.add_argument("--from", dest="date_from", help="Startdatum YYYY-MM-DD")
p_dl.add_argument("--to", dest="date_to", help="Enddatum YYYY-MM-DD")
p_dl.add_argument("--yesterday", action="store_true", help="Laedt nur Rechnungen von gestern")
p_dl.add_argument("--output", help="Optionales Zielverzeichnis")
p_dl.add_argument("--max-pages", type=int, default=25, help="Maximal zu scannende Bestellseiten")
p_dl.add_argument("--headless", type=lambda s: s.lower() in {"1", "true", "yes"}, nargs="?", const=True, default=None)

View file

@ -4,22 +4,34 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
if [[ $# -lt 2 ]]; then
echo "Usage: $0 <FROM_YYYY-MM-DD> <TO_YYYY-MM-DD> [additional args]"
echo "Beispiel: $0 2025-01-01 2025-12-31 --debug --debug-json /downloads/debug-run.json"
if [[ $# -lt 1 ]]; then
echo "Usage: $0 yesterday [additional args]"
echo " oder: $0 <FROM_YYYY-MM-DD> <TO_YYYY-MM-DD> [additional args]"
echo "Beispiel: $0 yesterday --debug --debug-json /downloads/debug-run.json"
echo "Beispiel: $0 2025-01-01 2025-12-31"
exit 1
fi
DATE_FROM="$1"
DATE_TO="$2"
shift 2
DATE_MODE="$1"
if [[ "$DATE_MODE" == "yesterday" ]]; then
shift 1
DATE_ARGS=(--yesterday)
else
if [[ $# -lt 2 ]]; then
echo "Fehlende Datumsparameter. Nutze entweder 'yesterday' oder FROM + TO."
exit 1
fi
DATE_FROM="$1"
DATE_TO="$2"
shift 2
DATE_ARGS=(--from "$DATE_FROM" --to "$DATE_TO")
fi
mkdir -p state downloads
docker compose run --rm amazon-invoice-downloader \
download \
--from "$DATE_FROM" \
--to "$DATE_TO" \
"${DATE_ARGS[@]}" \
--output /downloads \
--headless true \
"$@"