Telegram: come creare un BOT con Python

telegrambianco
Telegram è uno dei servizi di messaggistica istantanea più usati al mondo, insieme al diffusissimo Whatsapp. Senza scendere in antipatiche diatribe su quale dei due sia migliore, limitiamoci a sottolineare che Telegram offre numerose caratteristiche aggiuntive e spesso poco note. Una di queste è l'utilizzo di BOT, ovvero software che svolgono in modo autonomo delle operazioni tramite internet. Nel caso di telegram questi BOT sono dei veri e propri utenti che potete aggiungere ai vostri contatti ed interrogare per avere le informazioni più disparate.
Alcuni dei BOT sono ufficiali e forniscono vari tipi di assistenza all'uso di Telegram ma la maggior parte sono creati da terze parti. Telegram stesso infatti fornisce delle API per la creazione e la gestione di un nostro BOT personale. Le possibili applicazioni sono limitate solo dalla vostra immaginazione: ne esistono per giocare a dama, mandare notifiche meteo, cercare video su youtube, creare sticker, incontrare persone e via dicendo.

Riassumendo, un BOT per Telegram è un account speciale che non necessita di un numero di telefono e che può essere usato per interfacciarsi a del codice che esegue su un nostro server remoto.

Creare un BOT

telegrambot

Creare un BOT è estremamente semplice e per farlo dobbiamo ricorrere ad... un BOT! Esatto, Telegram ha messo a disposizione un profilo automatizzato specifico per la loro creazione. Per creare il nostro BOT dobbiamo quindi aggiungere ai nostri contatti il profilo BotFather che ci guiderà durante il processo. Dopo averlo aggiunto vi verranno spiegati i comandi che avete a disposizione per configurare il vostro nuovo profilo. Inviamo a BotFather il comando /newbot per iniziare la procedura guidata.
A questo punto vi verrà chiesto di inserire un nome per il vostro nuovo BOT e successivamente un username, che deve terminare con "bot". Per trovare un username disponibile potrebbero volerci più tentativi, visto che tanti sono già occupati.
Quando sarete riusciti ad inserire un username vi verrà fornito il token per le HTTP API. Segnatevelo da qualche parte, non perdetelo e soprattutto non distribuitelo perché sarà la chiave di accesso per gestire e programmare il BOT.

Il vostro nuovo BOT è stato creato! Se volete cambiare il profilo o eliminare il BOT potete farlo sempre tramite BotFather con i seguenti comandi:

  • /setname – Cambia il nome del BOT.
  • /setdescription — Cambia la descrizione del BOT.
  • /setabouttext — Cambia le informazioni sul BOT. Questa è una descrizione più breve della precedente e viene visualizzata nel profilo o quando viene condiviso.
  • /setuserpic — Cambia l'immagine del profilo.
  • /setcommands — Cambia la lista di comandi supportati dal BOT. I comandi sono delle stringhe alfanumeriche anticipate da una slash "/" che verranno associate ad azioni del BOT.
  • /setjoingroups — Determina se il BOT può essere aggiunto ad un gruppo.
  • /setprivacy — Determina quali messaggi il BOT può ricevere quando si trova in un gruppo.
  • /deletebot — Elimina il BOT e ne libera l'username.

Programmare un BOT in Python

Per gestire un BOT esistono numerose alternative, tutte basate sulle WEB API fornite da Telegram. Oggi vedremo come sfruttarle utilizzando una libreria in Python: Telepot.
Questa libreria è nata con in mente Raspbian, un sistema operativo basato su Debian per Raspberry Pi (avremo modo di approfondire questo aspetto tra qualche settimana). In quanto segue faremo quindi riferimento a sistemi Linux utilizzando Python 2.7.

L'installazione è molto semplice. Se non avete già installato PIP, installatelo con:

sudo apt-get install python-pip

e installate quindi telepot

sudo pip install telepot
sudo pip install telepot --upgrade

Adesso siete già in grado di mettere in piedi il vostro primo BOT utilizzando il token fornitovi da BotFather (negli esempi che seguono verrà indicato come TOKEN, sostituitelo con il vostro codice dove necessario).
Per verificare di aver fatto tutto correttamente provate ad avviare il vostro BOT e a stamparne le informazioni:

>>> import telepot
>>> bot = telepot.Bot(TOKEN)
>>> bot.getMe()
{u'first_name': u'NOME_DEL_BOT', u'id': BOT_ID, u'username': u'USERNAME_DEL_BOT'}

Un BOT non può iniziare a mandare messaggi a chiunque in automatico, dovrà essere un altro utente ad iniziare una conversazione con lui. Una volta ricevuto un messaggio, il nostro BOT riceverà l'ID dell'utente e sarà in grado di parlarci. Per mettere il nostro BOT in ascolto, utilizziamo la funzione getUpdates():

>>> from pprint import pprint
>>> resp = bot.getUpdates()
>>> pprint(resp)
[{u'message': {u'chat': {u'first_name': u'NOME_UTENTE',
                         u'id': ID_UTENTE,
                         u'last_name': u'COGNOME_UTENTE',
                         u'type': u'private'},
               u'date': 1458034719,
               u'from': {u'first_name': u'NOME_UTENTE',
                         u'id': ID_UTENTE,
                         u'last_name': u'COGNOME_UTENTE'},
               u'message_id': 13,
               u'text': u'TESTO_MESSAGGIO'},
  u'update_id': NUM_MESS}]

In questo modo stamperemo le informazioni dei messaggi ricevuti fino a questo momento dal BOT. Nell'esempio l'utente NOME_UTENTE COGNOME_UTENTE ha mandato un messaggio privato con scritto TESTO_MESSAGGIO al nostro BOT. Di particolare importanza è l'update_id, un valore incrementale che viene dato ad ogni messaggio ricevuto. Se vogliamo interrogare il BOT solo sugli ultimi messaggi ricevuti possiamo limitarci a chiamare

getUpdates(offset=NUM_OFFSET)

dove NUM_OFFSET è l'id del messaggio più vecchio che volete ricevere. Questo è utile per richiedere messaggi al BOT quando sappiamo di aver già letto i messaggi fino a NUM_OFFSET-1.

Potete anche istruire il vostro BOT per rimanere in attesa di nuovi messaggi e di notificarvi alla ricezione. Una volta ricevuto il messaggio potete stabilire dei comportamenti differenti a seconda del tipo di messaggio ricevuto: text, voice, sticker, photo, audio, document, video, contact, location, new_chat_participant, left_chat_participant, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created.

Per farlo utilizziamo la funzione message_loop() in combinazione con la funzione glance() che analizza il contenuto del messaggio.

import telepot

# funzione che viene eseguita ad ogni messaggio ricevuto
def handle(message):
    content_type, chat_type, chat_id = telepot.glance(message)
    print content_type, chat_type, chat_id

bot = telepot.Bot(TOKEN)
bot.message_loop(handle)
print 'In attesa di nuovi messaggi...'

Ora la parte interessante, iniziamo a mandare qualche messaggio ad altri utenti. Una volta ricevuto un messaggio da un utente e stabilito il suo ID_UTENTE possiamo contattarlo con

>>> bot.sendMessage(ID_UTENTE, 'TESTO_MESSAGGIO')

Ma perché limitarci a messaggi di testo? Possiamo mandare una foto con

>>> f = open('FILE.jpg', 'rb')
>>> response = bot.sendPhoto(ID_UTENTE, f)

La funzione sendPhoto() ci restituirà in risposta una variable con tutte le informazioni sull'immagine che abbiamo appena mandato:

>>> pprint(response)
{u'chat': {u'first_name': u'NOME_UTENTE', u'id': ID_UTENTE, u'type': u'private'},
 u'date': 1444728667,
 u'from': {u'first_name': u'NOME_BOT',
           u'id': ID_BOT,
           u'username': u'USERNAME_BOT'},
 u'message_id': 42,
 u'photo': [{u'file_id': u'FILE_ID1',
             u'file_size': 887,
             u'height': 29,
             u'width': 90},
            {u'file_id': u'FILE_ID2',
             u'file_size': 9971,
             u'height': 102,
             u'width': 320},
            {u'file_id': u'FILE_ID3',
             u'file_size': 14218,
             u'height': 128,
             u'width': 400}]}

Se avete bisogno di mandare più volte la stessa foto potete farlo semplicemente prendendo il FILE_ID e mandarlo con

>>> bot.sendPhoto(ID_UTENTE, u'FILE_ID')

Analogamente possiamo mandare altri tipi di oggetti come messaggi vocali, video, sticker o posizioni. Potete trovare una lista degli oggetti disponibili sulla documentazione di Telepot.

Per adesso questo è tutto, continueremo ad esplorare le possibilità che ci offrono i BOT di Telegram nei prossimi articoli dove vedremo come utilizzarli per controllare un Raspberry Pi!

Federico Becattini

Dottorando in computer vision. Appassionato di informatica e elettronica fai da te, specialmente se per applicazioni futili. Tormenta i suoi amici e colleghi con idee geniali spesso non riconosciute come tali.

Telegram: come creare un BOT con Python ultima modifica: 2016-03-15T12:34:06+00:00 da Federico Becattini


Advertisment ad adsense adlogger