
Telegram non ha certo bisogno di presentazioni: si tratta di una tra le più note applicazioni per la chat, nata da un progetto open source e disponibile su numerose piattaforme hardware. Scopriamo in questo articolo come, seguendo alcuni semplici passi, sia possibile realizzare un Bot per Telegram, che potremo utilizzare per interagire direttamente con il nostro Raspberry Pi, impartendo da remoto dei semplici comandi.
Introduzione
Telegram è un servizio di messaggistica istantanea, liberamente utilizzabile, basato sul cloud. I client Telegram sono disponibili per i più comuni sistemi operativi rivolti sia al mondo mobile (Android, iOS, Windows Phone) che a quello desktop (Windows, Linux, e macOS). Gli utenti che si sottoscrivono al servizio possono scambiarsi foto, video, sticker, brani audio, o file di qualunque altro tipo. E’ inoltre disponibile una funzionalità opzionale di messaggistica end-to-end criptata. Essendo un servizio basato sul cloud, è possibile accedere al contenuto dei messaggi tramite un qualunque dispositivo dotato di connessione a internet.
Nel giugno 2015, Telegram ha lanciato una piattaforma per sviluppatori di terze parti tramite la quale è possibile creare dei Bot. Con il termine Bot si intende un account Telegram che non è gestito da un utente reale, ma bensì da un programma. Ci addentriamo quindi nel campo dell’intelligenza artificiale, dove l’obiettivo è creare un utente che sia a tutti gli effetti assimilabile (compia quindi lo stesso tipo di azioni e operazioni) di un utente in carne e ossa. I Bot Telegram possono rispondere automaticamente a messaggi o menzioni/reply, possono essere invitati ad entrare nei gruppi, e possono essere integrati in altri programmi. I Bot per Telegram sono dei programmi che elaborano un input (che, a seconda dei casi, può essere rappresentato da messaggi di testo, comandi, immagini, file di vario tipo) e producono un output per l’utilizzatore. I Bot vengono utilizzati per:
- avvisare gli utenti sul verificarsi di un determinato evento (un nuovo commento, post, o altro genere di attività);
- recuperare informazioni, foto, e altri tipi di dati da siti, blog, motori di ricerca, ecc.;
- memorizzare informazioni;
- … qualunque cosa siano stati programmati a fare …
Uno dei Bot più utili in assoluto è sicuramente Trackbot, progettato per notificare l’utente quando lo stato della consegna relativo ai propri pacchi ha subito una variazione, supportando numerosi tipi di corrieri differenti.
I creatori di Telegram hanno inoltre rilasciato delle API pubbliche, tramite le quali gli sviluppatori possono accedere alle stesse funzionalità dell’applicazione ufficiale, creando le proprie applicazioni di messaggistica. Tra queste API vi sono anche quelle necessarie per la creazione dei Bot, e saranno proprio queste che andremo a utilizzare nella nostra applicazione per Raspberry Pi.
Vediamo quindi come creare e gestire un Bot per Telegram, utilizzando come piattaforma hardware la nota scheda Raspberry Pi.
Materiale occorrente
L’elenco dei componenti richiesti per la realizzazione del progetto è il seguente:
- scheda Raspberry Pi 3 model B;
- led (di qualunque dimensione e colore);
- cavetti jumper per i collegamenti;
- resistenza da 330 Ω (per limitare la corrente sul led, vedi nota successiva);
- scheda di prototipazione in plastica (protoboard).
Realizzazione del Bot
Per installare e cominciare a utilizzare un Bot Telegram sulla scheda Raspberry Pi occorre seguire alcuni semplici passi, che ora andremo ad esaminare in dettaglio.
Step 1
Se non avete ancora installato Telegram sul vostro dispositivo mobile, dovrete anzitutto scaricare e installare la versione adatta al vostro dispositivo. Successivamente, dovrete aprire l’applicazione Telegram. La modalità può differire leggermente a seconda della versione di sistema operativo utilizzato, come indicato in Figura 1.
Avvio di “BotFather”
BotFather (Figura 2) è lo strumento di Telegram che consente di creare un nuovo Bot, utilizzando le apposite API menzionate in precedenza.
Apertura di “BotFather”
BotFather è a sua volta un Bot, che permette non solo di creare altri Bot, ma anche di gestirli una volta creati. Come visibile in Figura 3, BotFather propone due link ai quali si possono ottenere, rispettivamente, informazioni sul funzionamento dei Bot Telegram e un manuale relativo all’utilizzo delle API.
Avvio di “BotFather”
Come indicato in Figura 4, l’avvio di BotFather viene eseguito fornendo il comando /start. Si noti come BotFather (Figura 4) proponga una lista dei comandi utilizzabili pe accedere alle sue funzionalità.
Creazione di un nuovo Bot
La creazione di un nuovo Bot avviene tramite il comando /newbot. BotFather chiederà anzitutto il nome da assegnare al nuovo Bot (nell’esempio indicato in Figura 5 è stato scelto il nome salman). Viene poi chiesto all’utente di scegliere una username per il nuovo Bot: è necessario che questa termini con “bot”. Nell’esempio di Figura 5 è stata scelta la username Salmanfaris_bot, che viene correttamente accettata da BotFather. Al Bot appena creato è poi possibile aggiungere una descrizione, una sezione “about”, e un’immagine per il profilo (il comando /help permette di visualizzare la lista completa dei comandi disponibili).
Come ottenere il token di accesso
In fondo alla pagina, BotFather visualizzerà il token (oscurato in Figura 6) tramite il quale è possibile accedere alle API HTTP.
Step 2
L’obiettivo di questo passo è quello di installare (se non ancora presente) un server VNC sul Raspberry Pi. Ricordiamo che VNC è l’acronimo di Virtual Network Computing, ed indica uno strumento attraverso il quale è possibile “virtualizzare” il desktop di un computer (in questo caso il Raspberry Pi) tramite una connessione via rete da remoto. Questa operazione è molto comoda, in quanto non necessita di collegare mouse, tastiera, e monitor al Raspberry Pi: è sufficiente collegarsi alla board tramite una connessione di rete Ethernet con un PC o un portatile (al limite anche un dispositivo mobile, come schematizzato in Figura 7), e operare direttamente sul sistema target visualizzando il relativo desktop sul monitor della macchina host. VNC si compone di un’applicazione server e di una client: il server andrà installato e configurato sul Raspberry, mentre il client andrà utilizzato sul PC. La distribuzione Raspbian, una delle più note e utilizzate sul Raspberry, include sia un server che un client VNC.
La configurazione del server VNC non è un’operazione particolarmente complessa. Se sulla vostra board non è ancora configurato il server VNC, potete fare riferimento alle guide [2] oppure [3].
Step 3
A questo punto possiamo procedere con l’installazione di TelegramBot sul Raspberry Pi. Ci collegheremo alla board tramite il protocollo SSH, utilizzando l’applicazione Putty come client, liberamente scaricabile all’indirizzo [4].
Avvio di Putty
Lanciando l’applicazione Putty, comparirà la schermata visualizzata in Figura 8.
Connessione al Raspberry Pi tramite SSH
Nella schermata di Putty occorre selezionare SSH come tipo di connessione (Figura 9), e inserire l’indirizzo IP assegnato alla board nell’apposita casella di testo (come numero di porta va bene il default, cioè 22). Volendo si può anche procedere con il salvataggio di questa configurazione di Putty, in modo tale da poterla richiamare alle attivazioni successive senza dover reinserire l’indirizzo IP.
Premendo il tasto “Open”, il computer aprirà la connessione SSH richiesta, e il sistema operativo installato sul Raspberry Pi (tipicamente Raspbian) richiederà l’autenticazione, come indicato in Figura 10 e in Figura 11. Ricordiamo che per la distribuzione Rasbian i valori di default sono: username=pi e password=raspberry.
Installazione di “Python Package Index”
Dopo essersi accertati che il Raspberry Pi sia correttamente collegato alla rete internet, occorre immettere tramite la connessione SSH il seguente comando, come indicato nella screenshot di Figura 12.
sudo apt-get install python-pip
Se il pacchetto è già installato sulla scheda Raspberry Pi, si otterranno le indicazioni di stato visualizzate in Figura 13.

Figura 13: output del comando di installazione (in questo caso il pacchetto era già presente sulla board)
Installazione di telepot
Telepot è un framework, scritto in Python, che aiuta a creare applicazioni basate sulle API di Telegram Bot. Il framework viene installato tramite il seguente comando, sempre digitato dalla shell associata alla connessione SSH:
sudo pip install telepot
ottenendo l’output visualizzato in Figura 14.
Step 4
L’obiettivo di questo step sarà quello di eseguire il codice scritto in Python.
Repository git
Dovremo anzitutto clonare il repository git, creandone una copia in locale, tramite il seguente comando:
git clone https://github.com/salmanfarisvp/TelegramBot.git
Inserimento del token bot
Il token per Telegram Bot ottenuto in precedenza (tramite lo strumento Bot Father), andrà ora inserito tramite il seguente comando:
bot = telepot.Bot('Bot Token')
(sostituite ‘Bot Token’ con il token effettivamente ottenuto in precedenza)
Lanciare il codice
Possiamo a questo punto eseguire il codice dello script Python tramite il comando:
python telegrambot.py
La parte relativa all’installazione e alla configurazione del software è così terminata. Possiamo ora procedere collegando la scheda Raspberry Pi e il led.
Step 5
In questo step collegheremo un comune led alla board Raspberry Pi. Lo schema di collegamento è riportato in Figura 15.
Nota: in Figura 15 è mostrato lo schema esatto incluso nell’articolo originale [1]. In esso, tuttavia, non compare la resistenza per la limitazione della corrente sul diodo. In assenza della stessa, si corre il rischio di danneggiare il diodo led, o ancor peggio la board Raspberry Pi. Occorre pertanto inserire una resistenza da circa 300 Ω (ad esempio, una da 330 Ω va benissimo) sul tratto di filo che collega il diodo al pin 11 del connettore della board (corrispondente al GPIO numero 0, il 6° pin a partire da sinistra della fila in basso).

Figura 15: schema di collegamento del diodo al connettore del Raspi (leggere bene la nota precedente)
Il led è stato collegato tra il pin 9 (ground) e il pin 11 (GPIO 0) del connettore disponibile sul lato destro della board. Il software, che vedremo tra poco, farà ovviamente riferimento a questa scelta del layout operata a livello hardware.
Step 6
A questo punto abbiamo predisposto tutto quanto ci serviva per inviare un comando alla scheda Raspberry Pi tramite il Bot di Telegram. Vediamo subito come.
Avvio del Bot
Lanciamo il Bot di Telegram, ottenendo un output simile a quanto mostrato in Figura 16.
Diamo poi il comando di start (/start), come indicato in Figura 17.
Invio dei comandi “on” e “off”
Possiamo a questo punto, tramite il Bot, impartire un comando di “on” (output visibile in Figura 18), oppure di “off” (output visibile in Figura 19). Osservando attentamente lo stato del led collegato al connettore del Raspberry Pi, potremo osservare come lo stesso si accenda oppure spenga in funzione del comando di On oppure Off, rispettivamente, ricevuto.
Il codice
Non ci resta altro che dare un’occhiata al codice, contenuto nello script Python telegrambot.py:
import sys
import time
import random
import datetime
import telepot
import RPi.GPIO as GPIO
#LED
def on(pin):
GPIO.output(pin,GPIO.HIGH)
return
def off(pin):
GPIO.output(pin,GPIO.LOW)
return
# to use Raspberry Pi board pin numbers
GPIO.setmode(GPIO.BOARD)
# set up GPIO output channel
GPIO.setup(11, GPIO.OUT)
def handle(msg):
chat_id = msg['chat']['id']
command = msg['text']
print 'Got command: %s' % command
if command == 'on':
bot.sendMessage(chat_id, on(11))
elif command =='off':
bot.sendMessage(chat_id, off(11))
bot = telepot.Bot('Bot Token')
bot.message_loop(handle)
print 'I am listening...'
while 1:
time.sleep(10)
Il codice è abbastanza semplice e autoesplicativo (le API di Telegram Bot sono accompagnate da un’esauriente documentazione, a cui si rimanda per dettagli e approfondimenti sulle stesse). Possiamo comunque fare un paio di osservazioni. Per quanto riguarda la configurazione degli I/O sulla board, possiamo anzitutto osservare come sia stata selezionata la modalità di numerazione degli stessi a livello hardware: setmode(GPIO.BOARD). Inoltre, viene configurato il pin numero 11 (corrispondente al GPIO 0) come pin di uscita (a questo verrà collegato un pin del led, mentre l’altro pin andrà collegato a massa, come indicato nello schema elettrico). Il resto riguarda le API di Telegram Bot. In particolare, se viene ricevuto il messaggio (comando) “on”, vengono eseguite le istruzioni associate a on(pin), viene cioè comandato uno stato logico alto sul pin 11, causando l’accensione del led. Viceversa, se viene ricevuto il messaggio (comando) “off”, verrà eseguito il codice associato a off(pin), con conseguente spegnimento del led.
Riferimenti
[1] Telegram Bot with Raspberry Pi
[2] Configurazione di un server VNC sul Raspberry Pi (di Salman Faris)
[3] VNC (documentazione ufficiale di RaspberryPi.org)
[4] Link per il download di putty

Ciao Stefano,
Grazie per l’articolo.
Non ho ben capito la necessità dello step 2 (vnc) in quanto poi viene usato ssh, giustamente.
Volevo inoltre segnalare, oltre all’utilizzo di python e altri linguaggi, la possibilità di gestire i telegram bot anche attraverso nodered installato su raspberry pi.
Lo uso da un po’in qualche corso e sperimentazione e sembra funzionare bene
Ciao Ivan,
grazie per la segnalazione relativa a Node-Red (uno strumento che da solo meriterebbe lo spazio di un articolo su EOS), e in particolare al suo utilizzo sul Raspberry Pi per gestire i Bot Telegram.
Sul riferimento a vnc nelo step 2 hai ragione, non è necessario in quanto alla fine si è utilizzata soltanto la shell messa a disposizione da SSH. Ero indeciso se rimuoverlo in fase di revisione dell’articolo, alla fine è rimasto, magari il link potrà essere utile a qualche lettore.
Ciao Stefano , vorrei chiederti perchè incontro questo errore:
-bash: syntax error near unexpected token `(‘
quando lancio :
bot = telepot.Bot(‘451604100:……………………….AWL6UR3k’)
?
ho messo i puntini per non rendere visibie tutto il mio token
Ciao Stefano, complimenti per la guida. Tutto molto chiaro:)
Avrei una necessità poco più avanzata, si tratta di leggere degli input tramite GPIO e di conseguenza compiere azioni ed eventualmente mandare dei messaggi. Ho fatto alcuni tentativi, la GPIO viene letta correttamente, tuttavia i messaggi vengono mandati solo a fronte di un messaggio inviato dall’utente e alla stessa maniera la GPIO viene letta solo dopo che viene mandato un messaggio dall’utente. Il tutto si svolge nel loop chiamato dalla funzione “bot.message_loop()”. Sono consapevole che andrebbe fatto al di fuori di questa funzione, ma le cose sono ncora peggiori facendo così. Sapresti consigliarmi in tal senso?
Grazie in anticipo, un salutone AT
Salve, AT. Come ha potuto constatare, l’applicazione è di tipo comando -> risposta. In particolare l’istruzione message_loop crea un thread che gestisce i comandi come definito nella funzione handle. Ha provato a inserire la gestione dell’I/O e l’invio di eventuali messaggi dentro al ciclo while?
Qualcosa di simile a questo (osservi le linee di commento con il carattere ‘#’)::
while 1:
time.sleep(10)
# gestione GPIO
# invio di un messaggio tramite la chiamata bot.sendMessage(chat_id, “……..”)
Proverò senz’altro. Nel caso vi fosse un sistema di tipo while 1: try “….” except “…” ecc. quale potrebbe essere la modalità? Intanto grazie mille per la cortese risposta, un cordiale saluto AT
Sì, certo, può senz’altro utilizzare la forma try: xxx except yyy: else: zzz, dove al posto di xxx mette l’istruzione di I/O (lettura o scrittura tramite rpi.gpio), al posto di yyy il tipo di eccezione (da reperire sulla documentazione della libreria Python) e al posto di zzz (l’else è opzionale) le operazioni da fare successive a quella che può sollevare l’eccezione.
ANcora grazie molte per le utilissime risposte!
Ciao Stefano.
Di recente ho fatto più o meno lo stesso ma ho utilizzato un modulo da quattro relè e delle API diverse per Telegram. Sul mio blog ho pubblicato tutti i dettagli e sul mio account GitHub il progetto software.
Ottimo, complimenti!
Caro Stefano, grazie per questo articolo! l’ho scoperto in ritardo mentre cercavo argomenti per i miei studenti. Ieri sera, seguendo questo tutorial, sono riuscita a comunicare tramite telegram con il mio raspberry. Sono felicissima!
Ottimo! In effetti il Raspberry Pi ha raggiunto oggi delle prestazioni paragonabili a quelle di un computer desktop, aprendo la strada a numerevoli applicazioni un tempo non supportate dai sistemi embedded.
Vorrei chiedere solo una cosa: una volta occupato il canale telegram, come è possibile liberarlo?
Salve Mariangela, non so se per “liberare il canale” intende rimuovere i singoli messaggi o eliminare il canale stesso. In ogni caso, penso che occorra essere amministratori del canale e poi utilizzare le funzioni offerte da Telegram versione desktop (PC), ma penso anche Android o comunque sistema operativo mobile. Purtroppo non ho esperienza diretta su questo punto, le posso suggerire un paio di link di approfondimento:
https://telegram.org/faq_channels/it?ln=f#d-cosa-succede-se-elimino-un-messaggio
https://www.quora.com/How-do-I-delete-an-abandoned-Telegram-channel#:~:text=On%20Telegram%20for%20Android.%20go,be%20deleted%20by%20leaving%20it.
Grazie,
Saluti
Grazie! nemmeno io sono esperta di telegram anzi, non ne conoscevo nemmeno l’esistenza! però ne sono entusiasta! approfondisco un pò. A presto.