196 lines
4.4 KiB
Markdown
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
|