3.5 KiB
Dienst Bot
Dit project is gemaakt door middel van vibecoding met OpenCode 1.14.40 en Z.AI/GLM-5.1.
De feature ratelimiting is gemaakt door middel van vibecoding met OpenCode 1.14.40 en Deepseek v4 Pro
WhatsApp bot die dienstschema's (PNG) verstuurt op basis van een dienstnummer in een WhatsApp groep, en dagelijks een samenvatting stuurt.
Hoe het werkt
- Iemand tagt @EdGpt in de toegestane groep met een 4-cijferig dienstnummer (bijv.
@EdGpt 4002) - De bot zoekt het dienstschema op in
dienst-tijden.json - De bijbehorende PNG-bestanden worden privé naar de afzender gestuurd
Vereisten
- Node.js 18+
- wwebjs-api Docker container (poort 3000)
- WhatsApp sessie "EdGpt" actief in wwebjs-api
- PM2 (optioneel, voor procesbeheer)
Installatie
git clone <repo-url>
cd dienst_echo_whatsappgroep
npm install
Configuratie
Kopieer .env.example naar .env en vul de waarden in:
# WhatsApp API
WHATSAPP_API_ENDPOINT=http://localhost:3000
WHATSAPP_SESSION=EdGpt
# Webhook
WEBHOOK_PORT=3002
ALLOWED_GROUP=120363407356808413@g.us
BOT_NAME=EdGpt
# Bestanden
DIENSTEN_JSON=./diensten/dienst-tijden.json
DIENSTEN_PNG=./diensten/png
# Admin
ADMIN_NUMBER=31620248011@c.us
wwebjs-api webhook config
In de .env van wwebjs-api:
BASE_WEBHOOK_URL=http://host.docker.internal:3002/webhook
ENABLE_LOCAL_CALLBACK_EXAMPLE=FALSE
ENABLE_WEBHOOK=TRUE
Belangrijk: gebruik docker compose up -d (niet docker restart) om .env wijzigingen door te voeren.
Data
De map diensten/ bevat:
dienst-tijden.json— array met dienstmetadata:[ { "dienstnummer": "4002", "startTime": "09:30", "endTime": "10:30", "paginas": [ { "bestandsnaam": "4002-001.png" }, { "bestandsnaam": "4002-002.png" } ] } ]png/— PNG bestanden met dienstschema's (bijv.4002-001.png)
Beide zijn uitgesloten van git via .gitignore.
Gebruik
Starten
npm start
Of met PM2:
npx pm2 start src/index.js --name dienst-bot
npx pm2 save
Stoppen
npx pm2 stop dienst-bot
Logs bekijken
npx pm2 logs dienst-bot
Projectstructuur
src/
index.js # Express webhook server + cron job
messageHandler.js # Berichtverwerking en filtering
rateLimiter.js # Spam protectie (max 5 per dag)
dailyStats.js # Dagelijkse aanvraag-teller
dienstService.js # JSON lookup en PNG bestandspaden
whatsappApi.js # WhatsApp API client (bericht + afbeelding)
Foutafhandeling
- Ongeldig dienstnummer: de bot stuurt een melding terug naar de afzender
- Fout bij verzenden PNG: de admin krijgt een WhatsApp melding
- Webhook fout: wordt gelogd in PM2 logs
Spam protectie
Elke gebruiker kan maximaal MAX_REQUESTS_PER_DAY (standaard 5) diensten per dag opvragen. Bij overschrijding krijgt de gebruiker een melding. De teller wordt dagelijks automatisch gereset (bij de eerste request na middernacht).
Dagelijkse samenvatting
Elke dag om 10:00 stuurt de bot een WhatsApp-bericht naar ADMIN_NUMBER met het totaal aantal dienstaanvragen van de vorige dag (00:00 t/m 23:59).
Aantal dienstaanvragen gisteren: N
De teller wordt bijgehouden in memory door dailyStats.js en gereset na verzending van de samenvatting. De scheduling gebruikt node-cron (0 10 * * *).
Licentie
Public Domain