Bot per Telegram con il Raspberry Pi

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.

Figura 1: il primo step consiste nell’apertura di Telegram sul dispositivo mobile

Avvio di “BotFather”

BotFather (Figura 2) è lo strumento di Telegram che consente di creare un nuovo Bot, utilizzando le apposite API menzionate in precedenza.

Figura 2: avvio dello strumento BotFather

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.

Figura 3: apertura di BotFather

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à.

Figura 4: avvio di BotFather

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).

Figura 5: creazione di un nuovo Bot

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.

Figura 6: token per 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].

Figura 7: client VNC su un dispositivo mobile

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.

Figura 8: avvio di Putty

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.

Figura 9: inserimento dell’indirizzo IP in Putty

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.

Figura 10: connessione SSH: inserimento username

 

Figura 11: connessione SSH: inserimento password, accesso autorizzato

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

Figura 12: comando per l’installazione di Python Package Index

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.

Figura 14: output relativo all’installazione di telepot

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.

Figura 16: avvio del Bot Telegram

Diamo poi il comando di start (/start), come indicato in Figura 17.

Figura 17: comando di start del Bot

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.

Figura 18: invio del comando On

 

Figura 19: invio del comando Off

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

 

 

2 Commenti

  1. Ivan.Tarozzi 5 aprile 2017
  2. Stefano Lovati Stefano Lovati 5 aprile 2017

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!