Si è iniziato a parlare di intelligenza artificiale molto tempo fa, in libri e film di fantascienza, ma se prima si trattava del frutto dell’immaginazione di qualche autore negli ultimi anni sta prendendo vita sotto forma di bot, assistenti vocali nei sistemi operativi dei più importanti smartphone oppure nelle app di messaggistica come Facebook Messenger o Telegram. Ogni Bot si specializza in qualcosa rendendola più semplice per l’utente, aggiornamenti in tempo reale sulle ultime notizie oppure gli orari dei treni per sapere se sono in ritardo. In questo articolo realizzeremo un bot per Telegram passo per passo, in modo che anche chi è alle prime armi possa riuscire nel nostro obbiettivo: creare un bot che funzioni in completa autonomia.
IDE
Come linguaggio di programmazione utilizzeremo Python 2.7, un linguaggio caratterizzato dalla semplicità e senza troppe regole di sintassi. Per cui per andare avanti sarà necessario scaricare Python 2.7. Di cos’altro abbiamo bisogno? In realtà potremmo anche non scaricare più nulla dato che necessitiamo solo di una finestra di comandi Windows e un text editor, tuttavia invece che utilizzare il Blocco Note già presente in Windows useremo Atom, che ci semplificherà alcuni passaggi rendendo il codice più leggibile. Infine per poter realizzare Bot per Telegram dobbiamo installare un package fornitoci dagli sviluppatori dell’app, i package sono i corrispettivi delle librerie per Arduino. Il package di nome Telepot si installa tramite una finestra di comando, apriamo la cartella scripts all’interno della directory dove abbiamo installato Python, Maiusc+Tasto destro del mouse e dovrebbe aprirsi il menù come in figura 1, ora possiamo aprire la nostra finestra di comando.
Il codice da digitare nella finestra di comando per poter installare Telepot è:
pip install telepot
Il programma dovrebbe installare telepot senza problemi, ora il nostro computer è pronto per realizzare bot per Telegram.
NASCITA DEL BOT
Per prima cosa è necessario creare il bot su Telegram, per farlo utilizzeremo BotFather, un bot di Telegram che ci permette di generare un bot, fornendoci un token per poterlo programmare, ora dovremmo trovarci un menù come quello in figura 2 selezioniamo quindi dal menu /newbot.
Ora dovremo scegliere il nome del bot ovvero come si presenterà agli utenti e l’username tramite il quale sarà possibile trovarlo all’interno di Telegram, una volta decisi questi due parametri BotFather ci fornirà la key (o Token) da utilizzare all’interno del nostro codice, dovremmo trovarci di fronte ad una schermata come in figura 3, ora siamo pronti per scrivere il codice di Einsteinbbot.
LA STRUTTURA DEL BOT SU PYTHON
La struttura del nostro bot, ovvero il codice che determinerà le sue azioni a seconda di ciò che scrive l’utente verrà definita da un file che creeremo sul nostro editor di testo, apriamo quindi Atom e scriviamo il seguente codice.
import telepot from pprint import pprint #creazione del bot bot = telepot.Bot('INSERIAMO QUA IL TOKEN') response = bot.getUpdates() pprint(response)
Come si può notare all’inizio del codice abbiamo importato il package telepot, installato in precedenza e un secondo package che ci permetterà di stampare a video in modo ordinato le informazioni raccolte dal bot.
Per creare un oggetto di tipo bot è necessario il token fornitoci da BotFather, la funzione getUpdates() invece ci fornisce tutte le informazioni relative all'ultimo messaggio ricevuto. Pprint invece ci permetterà di stampare le informazioni a video, salviamo il file in formato .py per esempio bot.py, ora proviamo a eseguirlo.
Apriamo quindi una finestra di comando nella directory dove abbiamo salvato il nostro codice e digitiamo python bot.py, se apriamo una finestra di chat con il nostro bot e scriviamo qualcosa, nella finestra di comando otterremo una schermata come in figura 4, il bot ci mostra il messaggio ricevuto.
Il bot ci fornisce i dati relativi all’ultimo messaggio ricevuto, nome e cognome del mittente, contenuto e id dell’utente. Se però vogliamo automatizzare il tutto dobbiamo utilizzare una funzione diversa da getUpdates() dato che questa fornisce solo l’ultimo messaggio non letto.
Il messaggio viene ricevuto dal nostro bot sotto forma di dizionario, questi oggetti sono caratteristici di Python e sono molto simili ai vettori, tuttavia per accendere ad un elemento possiamo usare come indice non solo numeri ma pure stringhe. Per dichiarare un dizionario su python devo usare il codice:
Dizionario={‘nome’=’raul’,1=’prova’}
Per stampare la prima stringa all’interno del dizionario ho bisogno del seguente codice
Print Dizionario[‘nome’]
Se invece volessi stampare la seconda stringa utilizzerò il seguente codice
print Dizionario[1]
La differenza principale tra dizionario e vettore è la mancanza di ordine, così come nei vettori posso avere dizionari di dizionari, queste nozioni ci saranno indispensabili per poter manipolare le informazioni ricevute dai messaggi.
Un Bot Pappagallo
Modifichiamo la struttura del bot affinché sia più autonomo, apriamo l’editor e scriviamo il seguente codice:
import time import telepot #dichiarazione funzione handle def handle(msg): content_type, chat_type, chat_id = telepot.glance(msg) if content_type == 'text': bot.sendMessage(chat_id,’ciao sono un Bot autonomo’) #token TOKEN = ‘Il nostro token qui’ #creazione dell’oggetto di tipo bot bot = telepot.Bot(TOKEN) #per ogni messaggio ricevuto viene aperta un’istanza della funzione handle bot.message_loop(handle) print ('Listening ...') # diamo 10 secondi di pausa while 1: time.sleep(10)
Questa volta le cose sono cambiate, abbiamo innanzitutto importato il package time che ci permetterà di aggiungere dei tempi di attesa tra un’interazione del bot e l’altra, inoltre il package pprint non è più necessario dato che non verrà utilizzato. La funzione handle invece come prima cosa crea tre variabili, content_type per sapere se il messaggio è di tipo testo oppure un file, chat_type per sapere se è una chat privata oppure un gruppo e chat_id ovvero il numero univoco associato ad ogni utente.
Se il messaggio ricevuto è di tipo testo il bot invia un messaggio di risposta all’utente contenente “Ciao sono un Bot autonomo”. Salviamo il tutto in formato .py e lanciamolo dalla finestra di comando scrivendo python bot.py, ora possiamo intrattenere una conversazione non molto proficua con il nostro bot il risultato dovrebbe essere quello in figura 5.
A questo punto possiamo integrare delle funzionalità ben più utili.
UN BOT CAPACE DI CONTARE
Cerchiamo ora di sfruttare le informazioni fornitoci dal messaggio dell’utente per esempio il nome, in modo da poter chiamare l’interlocutore del bot col proprio nome, inoltre vogliamo rendere il bot capace di contare quanti messaggi ha già ricevuto dall’utente.
Modifichiamo quindi il nostro bot nel seguente modo:
import time import telepot messaggi=[] def conta(id): j=0 for i in messaggi: if i==id: j=j+1 return j #dichiarazione funzione handle def handle(msg): content_type, chat_type, chat_id = telepot.glance(msg) if content_type == 'text': messaggi.append(chat_id) contatore=conta(chat_id) bot.sendMessage(chat_id,'ciao '+msg['from']['first_name']+' finora mi hai scritto '+str(contatore)+' volte') #token TOKEN = 'il nostro token’ bot = telepot.Bot(TOKEN) bot.message_loop(handle) print ('Listening ...') while 1: time.sleep(10)
Le modifiche che sono state apportate sono la lista messaggi, che conterrà gli id degli interlocutori, la funzione conta invece si occuperà di contare quante volte un singolo id è gia presente nella lista, per cui ogni volta che viene ricevuto un messaggio si aprirà un’istanza di handle, l’id dell’utente verrà aggiunto alla lista messaggi, successivamente si conterà quante volte l’id appare nella lista e si invierà un messaggio in chat con il nome utente e il numero di messaggi già ricevuto da questo, la nostra conversazione con il bot sarà qualcosa di simile a quella in figura 6.
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2348 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Salve, complimenti per il suo articolo. Desidererei contattarla, è possibile?
Nessun problema [email protected]
ciao Raul grazie del tutorial ., interessantissimo
Volevo informarti che Weather Underground a cui fai riferimento nel tutorial ha disabilitato la APi gratuita ..
————-
To improve our services and enhance our relationship with our users, we will no longer provide free weather API keys as part of our program. If you have been directed to download our Weather Underground free API key by a third party provider, please contact your vendor for resolution.
————-
Raul grazie di nuovo , avrei un’altra domanda .. adesso il mio python (ed il relativo BOT ) funzionano “in locale” e quindi solo fintanto che lo script python gira sul mio PC … come “pubblicarlo” ?
Ciao, per pubblicare il bot ti consiglio di affidarti a siti di hosting come “pythonanywhere”.
Il piano base se non mi sbaglio non permette l’installazione delle librerie per usare telegram ma i costi del piano base sono molto contenuti.
Ci sono altre soluzioni ovviamente, “affittare” un pc in rete che si dedichi solo al tuo bot non è dispendioso.
Ti consiglio di aggiungere anche di far generare al tuo bot dei file txt quotidiani, per tenere traccia di eventuali malfunzionamenti.