In questa lezione, realizziamo un TelegramBot in linguaggio Python. Come illustrato nelle lezioni
precedenti, i passaggi da seguire saranno questi:
- richiederemo al BotFather l'inizializzazione di un nuovo Bot. Questo ci chiederà il nome che dovrà
avere e l'identificativo, terminante con il suffisso bot, da associargli; - se tutti i dati al punto precedente saranno corretti il BotFather ci assegnerà un token che
costituirà la chiave di autenticazione del nostro programma presso la piattaforma Telegram; - passando al codice, sceglieremo la libreria per interagire con le API di Telgram che vorremo
utilizzare ed imposteremo l'impianto di comunicazione di base.
Quanto sopra per avviare il Bot ed integrarlo nell'ecosistema Telegram ma non dimentichiamo che la
parte principale sarà il software le cui funzionalità dovremo esporre attraverso il Bot. Infatti,
il Bot va visto come una sorta di API per un nostro servizio, un mezzo estremamente comodo e conosciuto
per poter offrire agli utenti interazione con esso da remoto.
Nel nostro caso, il TelegramBot esporrà le funzionalità relative ad un convertitore di valuta euro/dollaro e sarà
contenuto nel file bot_main.py. Al suo interno, vi sarà la variabile TOKEN che conterrà il codice
token che il BotFather ci ha assegnato. Nel testo che vedremo essa conterrà dei dati fasulli che dovranno essere sostituiti
con quelli validi prima dell'utilizzo del programma.
Fissato il token, il nostro bot inizierà a funzionare avviandolo come un normale script Python da
riga di comando:
$ python bot_main.py
L'aspetto più interessante è che grazie al token il nostro programma sarà rintracciato ovunque si trovi e non sarà
affatto necessario avere un server a disposizione: il nostro PC collegato in Rete sarà perfettamente idoneo per sperimentare il tutto.
La libreria che abbiamo scelto è una delle più famose per TelegramBot in Python sebbene non l'unica,
python-telegram-bot installabile
molto semplicemente tramite pip
da riga di comando:
$ pip install python-telegram-bot --upgrade
Il codice
Per svolgere le operazioni di conversione, abbiamo preparato due semplici funzioni fissando un cambio in maniera statica. Abbiamo messo
il tutto in un file chiamato exchange.py:
EXCHANGE=1.125
def from_usd_to_eur(usd):
return usd/EXCHANGE
def from_eur_to_usd(eur):
return EXCHANGE*eur
Abbiamo due funzioni che si occupano di convertire, rispettivamente, un valore in dollari americani in euro (from_usd_to_eur)
ed un valore in euro nel suo controvalore in dollari (from_eur_to_usd). Qui abbiamo fissato il tasso di cambio in una variabile
ma nella realtà un servizio simile dovrebbe collegarsi a qualche fonte remota e scaricare in tempo reale il rapporto
aggiornato. Per gli scopi del nostro esempio va bene così e lo si potrà fare come ulteriore esercitazione.
Il nostro bot si occuperà di dialogare con la piattaforma invocando al momento necessario le funzioni che
abbiamo visto prima. Questo il codice del bot contenuto nel file bot_main.py:
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import exchange
# IMPORTANTE: inserire il token fornito dal BotFather nella seguente stringa
TOKEN="ABCDEFGH12345678"
def extract_number(text):
return text.split()[1].strip()
def convert_usd(update, context):
usd=float(extract_number(update.message.text))
eur=exchange.from_usd_to_eur(usd)
print(f'Eseguita conversione da {usd} USD a {eur} EUR')
update.message.reply_text(f'{eur} EUR')
def convert_eur(update, context):
eur=float(extract_number(update.message.text))
usd=exchange.from_eur_to_usd(eur)
print(f'Eseguita conversione da {eur} EUR a {usd} USD')
update.message.reply_text(f'{usd} USD')
def main():
upd= Updater(TOKEN, use_context=True)
disp=upd.dispatcher
disp.add_handler(CommandHandler("usd", convert_usd))
disp.add_handler(CommandHandler("eur", convert_eur))
upd.start_polling()
upd.idle()
if __name__=='__main__':
main()
Il funzionamento si basa su ciò che succede nella funzione main. Il bot resta in attesa di aggiornamenti che
gli vengono forniti ed il suo scopo è di reagire a questi. Gli aggiornamenti verranno innescati dai messaggi che riceve
via Telegram. Gli utenti intenzionati a cercare il bot potranno individuarlo nel loro client mediante nome o id e gli potranno
inviare dei messaggi.
I messaggi contengono i comandi che nel nostro caso saranno /eur o /usd seguiti dalla cifra che
vorremo convertire. Se inviamo /eur 100 vorremo sapere il corrispondente di 100 euro in dollari mentre
inviando /usd 100 saremo interessati a sapere a quanti euro equivalgono 100 dollari.
Con le righe:
disp.add_handler(CommandHandler("usd", convert_usd))
disp.add_handler(CommandHandler("eur", convert_eur))
diciamo quale funzione deve essere invocata in base al comando assegnato. Se inviamo il messaggio
/eur 100 verrà riconosciuto il comando eur e, di conseguenza, invocata la funzione convert_eur.
Comportamento analogo si avrà usando il comando /usd.
Nelle funzioni convert_usd e convert_eur dovremo per prima cosa recuperare il testo del messaggio. L'aggiornamento
ricevuto sarà contenuto nell'oggetto update e tra i suoi vari dati troveremo update.message.text che conterrà l'intero comando.
Da qui dovremo estrarre il valore economico da convertire. Sarebbe opportuno eseguire controlli sul formato del comando ma
in questo caso non lo facciamo per leggibilità tuttavia si ricordi che è sempre buona prassi farlo.
Importante considerare che se invochiamo print in queste funzioni, il suo output sarà stampato
sulla console di esecuzione del bot mentre utilizzando la funzione reply_text invieremo dell'output sotto forma di messaggio Telegram
all'utente che ha contattato il bot.
In questo modo, avremo un prototipo di Bot funzionante, attivo finchè manterremo in esecuzione lo script bot_main.py.
Espanderlo non sarà affatto complicato: per iniziare, sarà sufficiente prevedere ulteriori comandi nel dispatcher e definire le
funzioni di reazione.
Il codice usato in questa lezione è disponibile a questo link.