Files
whatsapp-reminder/README.md
T
2026-05-28 11:19:11 +02:00

196 lines
4.4 KiB
Markdown

# 📲 WhatsApp Reminder
Ein selbst gehosteter, dockerisierter Bot der automatisch personalisierte WhatsApp-Erinnerungen nach einem monatlichen Plan versendet — jeden Monat eine andere Person aus einer frei konfigurierbaren Rotation.
Basiert auf [whatsapp-web.js](https://github.com/pedroslopez/whatsapp-web.js) und läuft vollständig auf deinem eigenen Server. Kein WhatsApp Business-Konto nötig, keine Cloud-Dienste, komplett kostenlos.
---
## Features
- Schickt jeden Monat eine personalisierte Nachricht an den Kontakt der laut Plan dran ist
- Überspringt Monate ohne zugewiesenen Kontakt (z.B. der eigene Monat)
- Cron-basierte Planung mit Zeitzonenunterstützung
- Session bleibt über Neustarts erhalten — QR-Code einmal scannen, fertig
- Einfaches Web-Interface zur Übersicht und zum manuellen Auslösen
- Docker Healthcheck inklusive
---
## Voraussetzungen
- Docker + Docker Compose
Das wars.
---
## Einrichtung
**1. Repo klonen**
```bash
git clone ssh://git@gitea.aontech.ch:222/neyer/whatsapp-reminder.git
cd whatsapp-reminder
```
**2. Kontakte konfigurieren**
`config/contacts.json` aus der Vorlage erstellen:
```bash
cp config/contacts.example.json config/contacts.json
```
Dann anpassen:
```json
[
{ "id": "alice", "name": "Alice Müller", "phone": "+41791234567" },
{ "id": "bob", "name": "Bob Schmidt", "phone": "+41797654321" },
{ "id": "carol", "name": "Carol Weber", "phone": "+41791112233" }
]
```
> Telefonnummern im internationalen Format, Leerzeichen und Bindestriche werden automatisch entfernt.
**3. Zeitplan und Nachricht konfigurieren**
`config/settings.json` aus der Vorlage erstellen:
```bash
cp config/settings.example.json config/settings.json
```
Dann anpassen:
```json
{
"amount": 25,
"currency": "CHF",
"cron": "0 7 1 * *",
"timezone": "Europe/Zurich",
"message": "Hallo {vorname}, diesen Monat bist du wieder dran mit {amount} {currency} ;)\nDanke.",
"schedule": [
"alice",
"bob",
null,
"carol",
"alice",
"bob",
null,
"carol",
"alice",
"bob",
null,
"carol"
]
}
```
- `schedule` — Array mit 12 Einträgen (Januar → Dezember). Kontakt-`id` oder `null` zum Überspringen.
- `cron` — Standard-Cron-Ausdruck. `"0 7 1 * *"` = jeden 1. des Monats um 07:00 Uhr.
- Der Zeitplan wiederholt sich jedes Jahr automatisch — kein jährliches Anpassen nötig.
**Verfügbare Platzhalter in `message`:**
| Platzhalter | Beschreibung |
|---|---|
| `{vorname}` | Vorname des Kontakts |
| `{name}` | Vollständiger Name |
| `{amount}` | Betrag aus den Einstellungen |
| `{currency}` | Währung aus den Einstellungen |
| `{month}` | Name des aktuellen Monats |
| `{year}` | Aktuelles Jahr |
**4. Container starten**
```bash
docker compose up --build -d
```
**5. QR-Code scannen**
Im Browser öffnen:
```
http://<server-ip>:3001/qr
```
In WhatsApp: **Verknüpfte Geräte → Gerät verknüpfen** → QR-Code scannen.
Fertig. Die Session wird in `data/` gespeichert und bleibt auch nach Neustarts erhalten.
---
## Web-Interface
| URL | Beschreibung |
|---|---|
| `http://<ip>:3001` | Übersicht mit Monatsplan |
| `http://<ip>:3001/qr` | QR-Code zur Erstanmeldung |
| `http://<ip>:3001/send-now` | Erinnerung für diesen Monat manuell senden |
| `http://<ip>:3001/status` | JSON-Status (wird vom Healthcheck genutzt) |
Einen bestimmten Monat manuell auslösen:
```
http://<ip>:3001/send-now?year=2026&month=5
```
---
## Konfigurationsreferenz
### `config/contacts.json`
```json
[
{
"id": "eindeutige-id",
"name": "Vollständiger Name",
"phone": "+41791234567"
}
]
```
### `config/settings.json`
```json
{
"amount": 25,
"currency": "CHF",
"cron": "0 7 1 * *",
"timezone": "Europe/Zurich",
"message": "Hallo {vorname}, ...",
"schedule": ["id-oder-null", ...]
}
```
Änderungen an beiden Dateien werden live übernommen — kein Neustart des Containers nötig.
---
## Port
Das Web-Interface läuft standardmässig auf Port `3001`. Änderbar in `docker-compose.yml`:
```yaml
ports:
- "3001:3000" # 3001 durch einen freien Port ersetzen
```
---
## Sicherheit
- Die WhatsApp-Session wird lokal in `data/` auf deinem eigenen Server gespeichert.
- Das Web-Interface hat keine Authentifizierung — Port 3001 nicht ins öffentliche Internet exponieren.
- Dieses Projekt nutzt WhatsApp Web intern. Es ist inoffiziell und steht in keiner Verbindung zu WhatsApp/Meta.
---
## Lizenz
MIT