Nuova sezione libri disponibile!

Implementiamo un bot Telegram con Python

Ludovico Russo

lettura in 6 minuti

Questo articolo è un po' vecchiotto e molte cose probabilmente non funzionano più! Scuatemi!

In attesa che lo aggiorni, potete accedere ad una seconda serie di articoli che sto scrivendo: Creare un Bot Telegram in Node.js

Da un po' di tempo ho scoperto la bellezza ed il divertimento di implementare bot telegram, cioè chatbot automatici che possono essere programmati per rispondere in modo semplice (o complesso) a messaggi da utenti reali.

Chi mi segue su questo blog o su HotBlack Robotics sa bene che mi diletto non poco con questa tecnologia. Vi propongo oggi quindi una brevissima introduzione allo sviluppo di chatbot utilizzando Python e la libreria Telepot.

ChatBot telegram in azione

La libreria telepot

Esistono diverse api Telegram per lo sviluppo di bot telegram in Python. Tra le più semplici, almeno dal mio punto di vista, troviamo telepot. Questa libreria permette in modo semplice e veloce di implementare bot telegram semplici, anche se risulta essere complessa e poco scalabile nel caso in cui si vogliano creare bot telegram più professionali.

Per installare questa libreria, basta semplicemente eseguire il comando pip install telepot.

Setup Ambiente di sviluppo

Come sempre (e non smetterò mai di dirlo), consiglio di creare prima di tutto un ambiente virtuale python su cui lavorare.

Per farlo, accediamo nel nostro workspace di lavoro e creiamo un nuovo ambiente virtuale con il seguete comando:

$ virtualenv telepot-example
$ cd telepot-example
$ source bin/activate
(telepot-example)$ pip install telepot
(telepot-example)$ mkdir project
(telepot-example)$ cd project

Creazione di un bot Telegram

Per creare un bot in telegram, possiamo sfruttare il bot Telegram (scusate il gioco di parole) @BotFather, a cui si può accedere cercando semplicemente @BotFather tra le chat telegram.

Una volta connessi al bot, ci basterà scrivere il comando /newbot e seguire le sue istruzioni per avere a di sposizione il nostro bot. In particolare, dovremmo fornire al bot le seguenti informazioni:

  • Nome del bot
  • username (che deve essere unico e finire con la parola "bot")

Una volta completata la procedura, il avremmo a disposizione un nostro TOKEN univoco (attenzione, non pubblicatelo altrimenti chiunque potrà usarlo) da utilizzare per sviluppare il nostro programma.

ChatBot telegram in azione

Implementiamo il primo programma!

Una volta ottenuto il token, siamo pronti a sviluppare il nostro primo bot! Questo bot semplicementemente risponderà a qualsiasi messaggio con una frase preimpostata, del tipo: "ciao, sono un bot molto stupido!".

Creiamo un file chiamato simple_bot.py, apriamolo e inseriamoci il seguiente codice. Questo basta per creare il nostro semplicissimo bot!

import telepot

def on_chat_message(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    if content_type == 'text':
        bot.sendMessage(chat_id, 'ciao, sono un bot molto stupido!')

TOKEN = '*** inserisci il tuo token qui  ***'

bot = telepot.Bot(TOKEN)
bot.message_loop(on_chat_message)

print 'Listening ...'

import time
while 1:
    time.sleep(10)

Analizziamo il codice passo passo

Vediamo adesso passo passo come funziona il codice implementato sopra:

Per prima cosa, dobbiamo importare la libreria telepot all'interno del nostro programma, in modo da porterla usare in seguito.

import telepot

Una volta importata la libreria, possiamo andare a creare il nostro bot con questi semplici passaggi:

TOKEN = '*** inserisci il tuo token qui  ***'
bot = telepot.Bot(TOKEN)
bot.message_loop(on_chat_message)

In particolare, all'interno della variabile TOKEN dovremmo andare a inserire il token ritornato dal botFather (attezione, si tratta di una stringa).

Una volta ottenuto il token, creiamo realmente il bot con il comando bot = telepot.Bot(TOKEN).

Per finire, linkiamo il bot con la funzione on_chat_message. Questa funzione verrà richiamata ogni qual volta il nostro bot riceve un messaggio, ed è (a tutti gli effetti), il vero cuore del nostro programma.

Questa funzione riceverà sempre un argomento, che corrisponde al messaggio che è stato inviato al bot, contenuto nel parametro msg:

def on_chat_message(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    if content_type == 'text':
        bot.sendMessage(chat_id, 'ciao, sono un bot molto stupido!')

Essendo il bot semplice, anche la funzione è semplice. In particolare, all'interno di on_chat_message, facciamo solo 3 operazioni.

Per prima cosa, estraiamo dei dati importanti dal messaggio usando il comando content_type, chat_type, chat_id = telepot.glance(msg). In questo modo, creiamo 3 variabili con i seguenti significati:

  • content_type dice che tipo di dati sono contenuti nel messaggio (se un messaggio di testo, un'immagine, un messaggio vocale, o altro);
  • chat_type contiene informazioni sul tipo di chat: se privata, gruppo, ecc.
  • chat_id contiene un identificativo univoco alla chat, e può essere usato per rispondere nella stessa chat in cui è stato mandato il messaggio.

Come seconda operazione, controlliamo che il messaggio che è stato mandato al robot sia di tipo testuale, andando a fare un check sul contenuto di content_type, con la rica if content_type == 'text':. Ricordiamo infatti che il bot è stupido, e sa rispondere solo a messaggi testuale.

Per finire, il bot invia sulla chat da cui è arrivato il messaggio un messaggio fisso: bot.sendMessage(chat_id, 'ciao, sono un bot molto stupido!').

L'utima parte del codice, serve semplicemente per evitare che il programma termini. Senza un ciclo infino, infatti, il programma terminerebbe e il bot non potrebbe rispondere alla chat.

print 'Listening ...'

import time
while 1:
    time.sleep(10)

Test del programma

Per testare il programma, semplicemente lanciamolo utilizzando il seguente comando:

(telepot-example)$ python simple_bot.py

Una volta in funzione, apriamo la chat telegram ed iniziamo a messaggiare con il nostro bot. Per chiudere il programma, semplicemente basta premere i pulsanti ctrl-C dal terminale.

Leggere il messaggio e le informazioni dell'utente!

Complichiamo adesso leggermente il nostro piccolo bot in modo che sia in grado di ricevere informazioni sull'utente con sta chattando e i messaggi che gli arrivano.

Per farlo, modifichiamo la funzione on_chat_message come segue (lasciando il resto inalterato):

def on_chat_message(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    if content_type == 'text':
        name = msg["from"]["first_name"]
        txt = msg['text']
        bot.sendMessage(chat_id, 'ciao %s, sono un bot molto stupido!'%name)
        bot.sendMessage(chat_id, 'ho ricevuto questo: %s'%txt)

come vedete, abbiamo aggiunto le due variabili

name = msg["from"]["first_name"]
txt = msg['text']

In cui estrapoliamo e salviamo, rispettivamente, il nome dell'utente che ha mandato il messaggio al bot e il testo del messaggio.

A questo punto, usiamo queste informazioni per scrivere delle risposte dinamiche, sfruttando l'operatore speciale %s delle stringhe python:

bot.sendMessage(chat_id, 'ciao %s, sono un bot molto stupido!'%name)
bot.sendMessage(chat_id, 'ho ricevuto questo: %s'%txt)

In particolare, utilizzando una stringa contenente la sequenza %s e seguita da %variabile, python automaticante inserirà il contenuto della variabile nella posizione in cui si trova il %s.

L'effetto, come potete immaginare, è quello di far sembrare il bot un po' meno stupido.

ChatBot telegram in azione

Conclusioni

Che ve ne pare di questa breve guida? Siete interessati ad approfondire l'utilizzo di questa libreria? Scrivetemelo su facebook.

Update

Questo post ha ricevuto un notevole successo, per questo motivo, ho deciso di scrivere altri tutorial sull'argomento telegram.

Ma voglio fare qualcosa di più divertente.. Invece che pubblicare i nuovi tutorial direttamente sul sito, ho sviluppato un bot Telegram che vi dirà dove trovare i nuovi tutorial!

Provatelo cliccando qui

Ti è piaciuto questo post?

Registrati alla newsletter per rimanere sempre aggiornato!

Ci tengo alla tua privacy. Leggi di più sulla mia Privacy Policy.

Ti potrebbe anche interessare

HB Cloud Tutorial #1 - Uso dei Led
Iniziamo ad utilizzare la piattaforma di Cloud Robotics
HB Cloud Tutorial #2 - Uso dei Bottoni
Rieccomi con il secondo tutorial legato all'uso dei bottoni per il robot **DotBot-ROS**. In questo tutorial, vedremo come configurare ed utilizzare in Python un bottone attaccato ad un pin GPIO del Raspberry Pi 3.
HB Cloud Tutorial #3 - I Motori
I Motori sono una delle parti essenziali dei robot. In questo tutorial, vederemo come è possibile in modo semplice ed intuitivo implementare un programma in Python che controlla i motori in base a comandi inviati via Wifi al Robot.
Utilizzare la RaspiCam in streaming con la piattaforma Cloud
Breve tutorial che spiega come abilitare la RaspiCam su ROS e la piattaforma di Cloud Robotics
Installiamo ROS su Raspberry Pi
Un breve tutorial su come utilizzare ROS sul Raspberry Pi
Video Corso ROS Rokers - Completati i video di Introduzione
Sono disponibili online i video tutorial del corso di ROS partito dalla community Rokers
Inviare Goals alla Navigation Stack - versione nodo ROS Python
Inviare un goal all ROS navigation stack utilizzando un nodo Python
Controllare siBOT dalla piattaforma HBR
Come controllare il manipolatore siBOT utilizzando la piattaforma HBR
Sviluppare un rilevatore di fiamma con la visione artificiale
Sviluppare un rilevatore di fiamma con la visione artificiale
Scriviamo un Blog in Python e Flask
Tutorial su come implementare, a partire da zero, un blog personale utilizzando Python e Flask! Prima parte!
Un laboratorio di Fisica con Arduino e Python
Primi esperimenti con Arduino e Python per realizzare un semplice laboratorio di fisica sfruttando la potenza di Python e la versatilità di Arduino
Un IDE web Arduino sviluppato in Python e Flask
Un mio progetto dell'estate del 2015 che permette di programmare Arduino da un'interfaccia Web esposta da un Raspberry Pi
Utilizziamo Atom come editor di testo remoto su Raspberry Pi
Come usare Atom come editor di testo remoto per Raspberry Pi
Canopy: una Pythonica alternativa a Matlab
Presento questo interessante tool python che può essere considerato una buona alternativa a Matlab per l'analisi dei dati!
Spyder, un'altra alternativa in Python a Matlab
Una velocissima prova del tool interattivo Spyder per l'analisi scientifica in Python
Simuliamo il moto parabolico in Python e Spyder
Un piccolo tutorial per iniziare ad utilizzare Spyder con Python
Python + Arduino = Nanpy
Programmare Arduino in Python con Nanpy
Utilizzo di Nanpy con il sensore di temperatura/umidità della famiglia DHT
Come utilizzare Nanpy col sensore DHT di temperatura e Umidità
Accendere led con Arduino e Telegram
Un bot telegram in grado di controllare Arduino realizzato da 3 ragazzi del Liceo Stampacchia
Gestire le macchine virtuali senza sforzo con Vagrant
Introduzione ed esempio di utilizzo su Vagrant, il tool che semplifica la gestione delle macchine virtuali per lo sviluppo.
Pillole di Python: pyscreenshot
Una semplice tutorial che mostra il funzionamento della libreria pyscreenshot
Python Decorators
Introduzione ai decoratori in Python
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 1
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Implementiamo un bot Telegram con Python - I Comandi
Vediamo come gestire i comandi del nostro bot in Telegram
4 (+1) Libri su Python (in Inglese) da cui imparare
Una lista di libri su Python (in Inglese) da cui ho imparato a programmare
Virtualenv: gestiamo meglio le dipendenze in Python
A cosa servono e come si utilizzano i virtualenv Python
Leggere i codici a barre con OpenCV e zbar in Python
Come usare Python per leggere i codici a barre degli alimenti e ricavarne alcune informazioni utili
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 2
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Sviluppiamo un bot Telegram che legge i codici a barre degli alimenti
Implementiamo un bot Telegram in grado di leggere ed analizzare le immagini per la lettura ed interpretazione dei codici a barre
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 3
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Divertiamoci sviluppando UI da terminale con ASCIIMATICS
Le UI da terminale fanno molto anni '80, però sono sempre diventerti da implementare. Oggi vi voglio introdurre ad una semplice libreria per creare questo tipo di applicazione.
Sviluppiamo un Robot con tecnologie Open Source
Inizio una serie di videoguide, in cui voglio introdurvi al mondo della robotica di servizio in modo pratico, facendo vedere come è possibilile, sfruttando tecnologie completamente Open Source, quali Arduino, Raspberry Pi, ROS e Docker, costruire un piccolo robot di Servizio.
Parliamo come GMaps: come creare file audio con gtts (Google Text to Speech) in Python
gtts è una libreria in Python per sfruttare le API di Google Text to Speech per generare file audio dal testo
Robot Open Source - Introduzione a Docker
È disponibile il video "Introduzione a Docker".
I chatbot possono Parlare? Sviluppiamo un bot telegram che manda messaggi vocali
Usiamo le API di sintesi vocale di google per creare un bot in grado di mandare messaggi vocali
Robot Open Source - Docker e Raspberry
È disponibile il video "Docker e Raspberry".
Un bot telegram che invia messaggi al verificarsi di eventi sui GPIO del Raspberry Pi
Mandare un messaggio tramite telegram quando il un GPIO del Raspberry cambia stato è possibile, ecco come!