Questo bot è un progetto sviluppato e mantenuto da una singola persona, senza un team dedicato e con un tempo limitato per la manutenzione. Il suo scopo è fornire notifiche automatiche sulla raccolta differenziata in specifici comuni, permettendo agli utenti di registrarsi e ricevere aggiornamenti giornalieri. La logica del bot si basa su due database MySQL distinti:
- Database Utenti (dinamico): registra le preferenze degli utenti, aggiornandosi ogni volta che qualcuno aggiunge o rimuove un'utenza.
- Database Raccolte (statico): contiene i dati delle raccolte differenziate dei vari comuni. Poiché questi dati non cambiano frequentemente, sono stati importati una volta e vengono aggiornati solo in caso di variazioni ufficiali nei calendari.
Questo approccio permette di mantenere l'operatività del bot separata dalla gestione dei dati fissi, ottimizzando le performance e riducendo il carico sul database.
Prima di avviare il bot, assicurati di avere:
- Python 3.8+
- Flask per gestire il webhook
- Telepot per interagire con l'API di Telegram
- MySQL come database
- Un server accessibile via HTTPS per ricevere gli aggiornamenti da Telegram
- Un file
credentials.envper le credenziali
Per ottenere le credenziali necessarie, segui questi passaggi:
- Apri Telegram e cerca
@BotFather. - Invia il comando
/newbote segui le istruzioni per creare un nuovo bot. - Dopo la creazione, riceverai un token API che dovrai aggiungere nel file
.envcomeTELEGRAM_BOT_TOKEN.
Il core del chatbot è contenuto nel file flask_app.py, che gestisce l'interazione con l'utente, riceve i messaggi tramite webhook e aggiorna il database utenti in base ai comandi ricevuti.
Il core del chatbot è principalmente responsabile della gestione degli utenti e della popolazione del database dinamico. Il bot gestisce le interazioni con gli utenti, raccogliendo i comuni di interesse e memorizzandoli nel database utenti. Tuttavia, la vera azione di notifica avviene tramite uno script separato (notify.py), che esegue controlli giornalieri e invia promemoria agli utenti.
Il webhook è il meccanismo attraverso cui Telegram invia gli aggiornamenti al bot. Flask gestisce queste richieste e le elabora. Per sicurezza, il webhook è protetto da un WEBHOOK_SECRET, che assicura che solo richieste autorizzate possano raggiungere il bot. Nel codice, viene impostato così:
webhook_url = f"{base_url}/{secret}"
bot.setWebhook(webhook_url, max_connections=1)È importante che il server sia accessibile via HTTPS affinché Telegram possa inviare correttamente le richieste.
Una tabella che contiene le informazioni sugli utenti, inclusi i comuni (fino a 6 per utente) per cui desiderano ricevere notifiche. Questo database è dinamico, poiché gli utenti possono iscriversi o disiscriversi in qualsiasi momento. Il database contiene un'unica tabella dove a ogni riga corrisponde un utente del bot. Le colonne disponibili sono il boolean delle notifiche e le 6 colonne disponibili per registrare le proprie zone.
Un database statico che memorizza i giorni di raccolta differenziata per tutti i 63 comuni. Dal momento che i dati sono fissi vanno aggiornati solo in caso di variazioni nel calendario comunale.
Il database delle zone è basato sui dati estratti dagli ecocalendari di Seta S.p.a., recuperabili qui: Seta S.p.a.. All'interno della repository esiste uno script estrattore.py per estrarre automaticamente tutti i dati e inserirli in un foglio Excel. Il database deve essere strutturato con una tabella per ogni comune o zona per comune, alla quale corrisponde un codice univoco (consultare l'allegato codici_comuni.txt per sapere la corrispondenza). Ogni tabella ha una riga per giorno dell'anno in cui è associato un boolean in caso di ritiro di quel rifiuto:
i= Indifferenziatoo= Organicoc= Carta e cartonev= Vetrop= Plasticas= Sfalci
Ogni giorno viene eseguito uno script (impostabile tramite cron job) che:
- Recupera i dati dal database statico per identificare quali rifiuti vengono raccolti in quel determinato giorno.
- Confronta queste informazioni con le zone di interesse degli utenti presenti nel database degli utenti.
- Determina chi deve essere notificato e invia il messaggio di promemoria alle 18:30, ricordando agli utenti di mettere i bidoni sulla strada il giorno precedente.
Lo script estrattore.py deve essere utilizzato rinominando i file PDF degli ecocalendari con il codice indicato nel file codici_comuni.txt presente nella repository. Una volta rinominati correttamente i file, lo script può essere eseguito per estrarre automaticamente i dati e inserirli in un foglio Excel.
Lo script estrattore.py analizza i file PDF dell'Ecocalendario di Seta S.p.a. ed estrae le informazioni sui ritiri della raccolta differenziata, trasformandole in un file Excel. Il processo prevede:
- L'analisi dei PDF per identificare i bollini colorati associati ai tipi di rifiuti.
- La conversione dei colori in valori booleani per ciascun giorno dell'anno.
- La generazione di un foglio Excel con le informazioni strutturate per ogni comune o zona.
L'inserimento in un foglio di calcolo serve a controllare manualmente la correttezza dei dati estratti. Successivamente, un altro script viene utilizzato per trasferire questi dati nel database MySQL. Questo passaggio non è incluso nella repository, poiché il metodo di importazione può variare a seconda delle esigenze e delle preferenze dell'utente.
Il bot è disponibile su Telegram e può essere provato qui: EcoBot.
Questo bot è un progetto personale e non è affiliato ufficialmente con nessun ente locale o azienda responsabile della raccolta differenziata. I dati forniti possono variare rispetto alle informazioni ufficiali, quindi si consiglia di verificarli con il proprio comune di residenza. L'autore non si assume alcuna responsabilità per errori o informazioni non aggiornate.