Un bot Telegram per consultare i menù, gli orari e le tariffe delle mense universitarie di Pisa (DSU Toscana).
Il bot supporta la ricerca inline, la navigazione giornaliera dei menù, il calcolo delle tariffe su base ISEE e la consultazione degli orari in tempo reale.
(indice)
├── README.md
├── requirements.txt
├── assets/
│ ├── icons/
│ ├── img/
│ ├── logo/
│ └── posts/ <- immagini generate per i post di Instagram
├── cloudflare-worker/ <- microservizio per lo scheduler preciso (gestisce fuso orario IT)
├── data/
│ ├── canteens.json <- dati delle mense (orari, servizi, coordinate)
│ ├── combinations.json <- combinazioni di piatti (es. menu fisso)
│ ├── cookies.txt <- sessione per lo scraping
│ ├── menu.json <- menù da oggi in poi (snapshot corrente)
│ ├── menu_today.json <- snapshot del solo menù di oggi
│ ├── menu_history.json <- storico menù passati (append-only)
│ └── rates.json <- tariffe per fascia ISEE
├── bot.py <- entrypoint del bot Telegram
├── scripts/
│ ├── extract_menu.py <- scraper menù da canteen.dsutoscana.cloud
│ ├── fetch_rates.py <- scraper tariffe DSU
│ ├── generate_menu_images.py <- genera i post immagine in HTML/ststili (Playwright)
│ ├── publish_instagram.py <- pubblica Carousel su Instagram tramite Graph API
│ └── smart_update.py <- aggiornamento intelligente dei dati testuali
└── .github/
└── workflows/
├── update_menu.yml <- aggiornamento giornaliero menù testuale
├── generate_images.yml <- crea e salva le immagini dei post
├── publish_instagram.yml <- invia le immagini create su IG
└── update_rates.yml <- aggiornamento tariffe(indice)
graph LR
A["canteen.dsutoscana.cloud"] --> U["scripts/smart_update.py"]
C["DSU Toscana - Tariffe"] --> R["scripts/fetch_rates.py + fetch_combinations.py"]
G["Cloudflare Worker<br>(Scheduler ora IT)"] -->|workflow_dispatch| H{"GitHub Actions"}
H -->|update_menu.yml| U
U --> B["data/menu.json<br>(solo da oggi in poi)"]
U --> BH["data/menu_history.json<br>(append giorni passati)"]
U --> BT["data/menu_today.json<br>(snapshot di oggi)"]
H -->|update_rates.yml| R
R --> D["data/rates.json"]
R --> K["data/combinations.json"]
R --> T["assets/img/table.png"]
H -->|generate_images.yml| I["assets/posts/*.png"]
B -->|input menu| I
H -->|publish_instagram.yml| J["Instagram @cibounipibot"]
I --> J
B -->|caption/testi| J
E["data/canteens.json"] -->|Dati statici mense| F["bot.py"]
B --> F
D --> F
K --> F
F -->|"Menù / Orari / Tariffe"| L["Utente Telegram"]
L -->|"@cibounipibot"| F
(indice)
È possibile cercare un piatto specifico (es. p:Arista) direttamente in qualsiasi chat Telegram senza aprire il bot. I risultati mostrano in quali mense e in quali giorni verrà servito il piatto cercato, con navigazione tra le date.
La ricerca inline si avvia digitando @cibounipibot seguito da uno spazio e dalla query. Senza prefisso viene mostrata direttamente la lista delle mense per vedere il menù di oggi.
Una volta aperto il menù di una mensa, è possibile:
- Scorrere i giorni con i pulsanti ◀︎ e ▶︎
- Tornare ad oggi con il pulsante ○
- Alternare tra Pranzo e Cena
- Filtrare per mensa specifica oppure visualizzare TUTTE le mense insieme
Per le mense TUTTE, ogni piatto disponibile solo in alcune mense viene annotato con (Solo NomeMensa).
Digitando @cibounipibot i: è possibile consultare lo stato attuale di ogni mensa (aperta/chiusa), gli orari di pranzo e cena e i servizi disponibili (pizzeria, prendi e vai, menù vegetariano, gluten-free, ecc.).
Il pulsante APERTE ORA nella tastiera persistente mostra subito le mense attualmente operative.
Digitando @cibounipibot t: viene mostrata la tabella completa delle tariffe per fascia ISEE.
Digitando @cibounipibot t:<valore> (es. t:20000) il bot calcola automaticamente la fascia di appartenenza e mostra la tariffa personalizzata per pranzo, cena e colazione.
Oltre al bot Telegram, il progetto include un sistema automatizzato per la pubblicazione giornaliera dei menù su Instagram. L'infrastruttura è basata su GitHub Actions suddivise in tre fasi:
update_menu.yml: Aggiorna i testi dei menù da oggi in poi salvandoli inmenu.json, generamenu_today.jsone sposta i giorni passati inmenu_history.json(append).generate_images.yml: Tramite uno script Python nativo (generate_menu_images.py), il sistema genera le grafiche ("slide") a partire da template, scrivendo testo personalizzato e uno sfondo procedurale con geometrie dinamiche e vibranti. Il design cambia dinamicamente e il sistema alterna vari colori e pattern su base settimanale e giornaliera.publish_instagram.yml: Utilizzando le Graph API di Meta, le immagini generate vengono raggruppate e pubblicate come "Carousel" sul profilo Instagram dedicato ai menù.
| Dot Grid | Diagonal Stripes | Crosshatch | Diamond Grid |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Zigzag | Concentric Circles | Plus Grid | Waves |
![]() |
![]() |
![]() |
![]() |
| Triangles | X Shapes | Vertical Stripes | Horizontal Stripes |
![]() |
![]() |
![]() |
![]() |
Per far sì che l'esecuzione di questi workflow sia precisa e rispetti l'orario italiano (gestendo in automatico il cambio tra ora legale e solare), i comandi vengono avviati da uno scheduler configurato tramite Cloudflare Workers. Questo risolve i noti problemi di ritardo e imprecisione dei classici cron integrati nativamente in GitHub Actions.
(indice)
| Funzione | Comando |
|---|---|
| Menu di Oggi Seleziona una mensa e vedi il menù del giorno |
@cibounipibot (+ spazio) |
| Cerca Piatto Cerca un piatto per nome in tutte le mense e tutti i giorni |
@cibounipibot p:nome piatto |
| Info & Orari Stato e orari di una mensa specifica |
@cibounipibot i: |
| Tariffe ISEE Tabella completa delle tariffe |
@cibounipibot t: |
| Tariffa Personalizzata Calcola la tariffa per il tuo ISEE |
@cibounipibot t:<valore>es. t:20000 |
| Aperte Ora Lista mense aperte in questo momento (tastiera persistente) |
Pulsante APERTE ORA |
| Seleziona Mensa | /menu |
| Link Utili DSU | /links |
| Guida all'uso | /help |
| Benvenuto | /start |
(indice)
| Tipologia Dati | Fonte Principale | Dettagli / Link |
|---|---|---|
| Menù Mense | DSU Toscana — canteen.dsutoscana.cloud | canteen.dsutoscana.cloud/menu — aggiornato quotidianamente via GitHub Actions |
| Tariffe ISEE | DSU Toscana — sito istituzionale | dsu.toscana.it |
| Dati Mense | Raccolta manuale + sito DSU | Orari, servizi e coordinate in canteens.json |
Hostato su:
- Orari mense: Gli orari sono salvati staticamente in
canteens.jsone potrebbero non riflettere variazioni stagionali o straordinarie.











