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ù aggiornato quotidianamente
│ └── 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"] --> B["menu.json"]
C["DSU Toscana - Tariffe"] --> D["rates.json"]
E["canteens.json"] -->|Dati statici mense| F["bot.py"]
G["Cloudflare Worker<br>(Scheduler ITEsatto)"] -->|Trigger workflow| H{"GitHub Actions"}
H -->|update_menu| B
H -->|update_rates| D
B -->|generate_images| I["Immagini Post (.png)"]
H -->|publish_instagram| J["Instagram @mense.unipi"]
I --> J
B --> F
D --> F
K["combinations.json"] --> 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: Scarica i testi aggiornati dei menù salvandoli inmenu.json.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 | Hexagons |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| Zigzag | Concentric Circles | Plus Grid | Waves | Triangles |
![]() |
![]() |
![]() |
![]() |
![]() |
| Squares | Hollow Dots | 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.














