90 lines
1.8 KiB
Markdown
Executable File
90 lines
1.8 KiB
Markdown
Executable File
# 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**:
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
2. **Credentials konfigurieren**:
|
|
```bash
|
|
cp .env.example .env
|
|
# Dann .env bearbeiten und echte Zugangsdaten eintragen
|
|
```
|
|
|
|
3. **TypeScript kompilieren**:
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Menüs scrapen
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```json
|
|
{
|
|
"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!
|