Michael Kaufmann bc98a19fc6 feat: server-based version with menu flagging, distributed polling, and SSE
Complete implementation including:
- Express server with Bessa API proxy
- Puppeteer scraper for menu data
- Flag storage (file-based persistence)
- SSE manager for real-time updates
- Polling orchestrator for distributed polling
- Frontend with weekly view, ordering, and flagging UI
- Yellow/green glow indicators for flagged items
2026-02-12 08:36:05 +01:00

Bessa Knapp-Kantine Menu Scraper

Automatischer Menü-Scraper für die Knapp-Kantine basierend auf https://web.bessa.app/knapp-kantine.

Setup

  1. Dependencies installieren:

    npm install
    
  2. Credentials konfigurieren:

    cp .env.example .env
    # Dann .env bearbeiten und echte Zugangsdaten eintragen
    
  3. TypeScript kompilieren:

    npm run build
    

Usage

Menüs scrapen

# Development mode (mit TypeScript direkt)
npm run dev

# Production mode (kompiliertes JavaScript)
npm run build
npm run scrape

Scraper-Ablauf

  1. Öffnet Browser (Puppeteer)
  2. Akzeptiert Cookies
  3. Klickt "Pre-order menu"
  4. Loggt sich ein (mit Credentials aus .env)
  5. Navigiert durch Kalenderwochenansicht
  6. Extrahiert Menüdaten für jeden Tag
  7. Speichert alles in data/menus.json

Output

Die gescrapten Daten werden in data/menus.json gespeichert:

{
  "lastUpdated": "2026-02-02T10:00:00.000Z",
  "weeks": [
    {
      "year": 2026,
      "weekNumber": 6,
      "days": [
        {
          "date": "2026-02-03",
          "weekday": "Monday",
          "items": [
            {
              "id": "2026-02-03_M1_Herzhaftes",
              "name": "M1 Herzhaftes",
              "description": "Rindsuppe mit Backerbsen / Puten Tikka Masala...",
              "price": 5.5,
              "available": true
            }
          ]
        }
      ]
    }
  ]
}

Development

  • npm run dev - Run scraper in development mode with tsx
  • npm run build - Compile TypeScript to JavaScript
  • npm run type-check - Check TypeScript types without building

Debugging

Setze PUPPETEER_HEADLESS=false in .env um den Browser sichtbar zu machen.

Sicherheit

⚠️ WICHTIG: Die .env-Datei enthält Zugangsdaten und darf niemals ins Git committed werden!

Description
No description provided
Readme 2.6 MiB
Languages
JavaScript 61.7%
CSS 24.8%
Shell 13.5%