Realizziamo un bot per telegram in ambiente Python

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.

Figura 1: Per installare il package sarà necessario utilizzare pip, script installato automaticamente con l'installazione di python

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.

Figura 2: Il botfather è un utlity di Telegram per poter generare bot

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.

Figura 3: Il botfather ci permetterà di impostare il nome del bot e il suo username

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.

Figura 4: Nella finestra di comando compariranno tutte le informazioni relative all'ultimo 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.

Figura 5: Il bot è programmato per rispondere soltanto in caso di messaggio di testo

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.

figura 6: Il bot è in grado di riconoscere il nostro nome e contare il numero di messaggi ricevuti

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2348 parole ed è riservato agli abbonati MAKER. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici MAKER e potrai fare il download (PDF) dell'EOS-Book del mese. ABBONATI ORA, è semplice e sicuro.

Abbonati alle riviste di elettronica

2 Commenti

  1. Marco Giancola Marco Giancola 20 settembre 2018

Scrivi un commento

EOS-Academy

Ricevi GRATIS le pillole di Elettronica

Ricevi via EMAIL 10 articoli tecnici di approfondimento sulle ultime tecnologie