Il bug che non doveva capitare [SDSC]

di | 15 Settembre 2023

Abbiamo parlato dell’inoltro Twitter di Lombardia Incoeu, ma vi è un altro servizio, ossia l’inoltro sui gruppi. Un servizio che è da mesi in attività continua e genericamente privo di bug, tranne quando non lo è.

Infatti, il 10 agosto, alla notizia della morte di Michela Murgia, essa è stata inoltrata in questo modo ai gruppi:

La foto è quella che è stata correttamente inoltrata per il trofeo Silvio Berlusconi, è evidente dunque che sia rimasta nel sistema non venendo sostituita dall’immagine usata per la mesta notizia. Essendo il primo caso del genere di problema sul codice, ed essendo capitato proprio in una notizia del genere, voglio pubblicare qui i risultati della mia piccola indagine.

I log

Il bot raccoglie alcuni log, per ragioni di privacy quelli che possono avere dati degli utenti vengono cancellati dopo poco, e infatti tempo che vado a indagare non trovo più nulla di utile. I log amministrativi riguardano solo chi ha inoltrato una notizia e quando, dunque paiono fondamentalmente inutili allo scopo ma, un’attenta lettura, ci svelerà che così non è.

Il codice

Ma andiamo a leggere il codice. Quando l’utente autorizzato invia un’immagine nel programma accade ciò (con alcune eliminazioni di codice non correlato:

if (str(message.from_user.id) in auth) and message.chat.type == "private":
    coda.append(message.html_caption)
    fotoid = message.photo[-1].file_id #questo è necessario per come Telegram gestisce i suoi JSON
    codaimg.append(fotoid)
    filetype.append("F")

 

In sostanza, ci sono tre “code”: una che accoglie il testo (coda), una che accoglie l’ID del media (codaimg) e una, detta filetype, che accoglie invece il tipo di file: ciò serve perché Telegram ha funzioni diverse per inviare foto e video.

Poi, all’utente autorizzato, viene proposto di inviare il comando di inoltro: ve ne sono di diversi in base ai casi, ma guardiamo quello in questione, ossia quello riservato alle notizie dell’ultima ora. Quando viene azionato, vengono fatte delle verifiche (usando filetype) e se si accerta che l’inoltro è fotografico, né testuale né video, così si procede:

messaggio = coda[0]
idfoto = codaimg[0]
#vi è poi un ciclo che, su ogni gruppo del database, esegue queste azioni
    bot.send_photo(gruppo,idfoto,messaggio,parse_mode="HTML")
#finito il ciclo
coda.remove(messaggio)
codaimg.remove(codaimg[0])
filetype.remove(filetype[0])

In buona sostanza, nel momento in cui l’ID della foto è corretto, non c’è ragione per cui debba essere pubblicata una foto errata! Anzi, il bot avrebbe dovuto cancellare quella di Berlusconi, in virtù dei tre comandi finali (che sono presenti anche nella funzione equivalente che si occupa dell’inoltro di notizie sportive) e un diff non rivela alcuna differenza di rilievo tra le due funzioni tali da giustificare tutto ciò.

La possibilità che mi viene in mente, considerando tutto, è che per qualche ragione sia fallito il codice che doveva eliminare l’ID della foto di Berlusconi, in tal modo la lista codaimg avrebbe avuto all’elemento 0 l’ID della foto di Berlusconi e all’elemento 1 quello della foto della Murgia.

E, in effetti, un’attenta lettura dei log citati mostra una cosa interessante…

Messaggio della Murgia:

Inoltro (con immagine) Morta la scritora Michela Murgia: l’era malada de temp (Rep)

🗞 @lombardiaincoeu

Messaggio del trofeo Berlusconi:

Inoltro Prim trofee Silvio Berlusconi, a l’U-Power Stadium se va ai penalti 1-1: el vinc el Milan

🗞 @lombardiaincoeu

Avete notato? Manca il “(con immagine)”!

Il messaggio è stato inoltrato direttamente dal canale ma, per qualche ragione, il bot ha deciso di non considerarlo come immagine in fase di inoltro, pur salvandone i dati come l’ID immagine.

Ciò, leggendo il codice, è possibile solo in un caso: quando l’ID immagine in codaimg[0] è uguale a “”, condizione che viene imposta solo dagli inoltri testuali. Evidentemente, per qualche strana ragione, non era stato rimosso un “”, rendendo l’inoltro di Berlusconi testuale e lasciando la sua immagine per la notizia sulla Murgia.

Controllando i miei comandi al bot noto che avevo cancellato un inoltro, che avevo sbagliato a scrivere… E com’è il codice della cancellazione?

        coda.remove(coda[-1])
        if codaimg[-1] != "":
            codaimg.remove(codaimg[-1])
        filetype.remove(filetype[-1])

Ecco, questo codice funzionava bene quando il sistema non supportava l’inoltro di video, infatti “codaimg” era praticamente usata solo dalle immagini, con l’introduzione dei video essa è diventata scriminante per decidere che codice eseguire in base al caso.

La condizione, tuttavia, non è stata sistemata, dunque il comando eliminava l’ultimo messaggio inserito, anche il suo filetype ma non il suo “id” se era testuale, e il messaggio cancellato prima del trofeo Berlusconi era testuale. In buona sostanza, la tabella col messaggio e col tipo di file erano corrette, ma non lo era quella con l’ID. Dunque, all’inoltro della notizia del trofeo Berlusconi, è stata inoltrata l’immagine della notizia precedente (che era “”, quindi un inoltro testuale), ed è stato cancellato il suo ID vuoto, mettendo al suo posto l’ID della foto del Cavaliere. Quando è stata pubblicata quella della Murgia, è stato usato il primo ID della lista, ossia… Quello della foto di Berlusconi. Se avessi pubblicato un’altra notizia dopo, sarebbe stata pubblicata con la foto della compianta giornalista.

Ora, dopo questa analisi, il codice è stato sistemato e non dovrebbe avere problemi del genere in futuro. Mi scuso per l’errore, che si è rivelato particolarmente imbarazzante per via della foto pubblicata in luogo di quella corretta. Errare è umano e molto diffuso, specie tra gli informatici…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.