Telepot (Python interface to Telegram Bot API)

T

Telepot
(Python interface to Telegram Bot API)

Studiando Python e volendo provare a scrivere un Bot Telegram tutto mio, mi sono imbattuto in Telepot.

Questa è una libreria estremamente comoda e versatile per la scrittura di Bot per Telegram.

Innanzi tutto ci servirà un server che lo ospiti. Possiamo tranquillamente farlo girare sul nostro computer, se connesso a Internet, ma se vogliamo che resti online 24/7 abbiamo bisogno di un servizio apposito. Usando Heroku, che offre gratuitamente anche un database fino a 10.000 record, parlerò di questo nel seguito dell’articolo.

Cominciamo con il preparare l’ambiente di sviluppo.
(do per scontato che abbiate installato python 3.x.x)

mkdir il_mio_bot
cd il_mio_bot
python -m venv bot_env
source bot_env/bin/activate

Noterete che il prompt cambierà, riflettendo il fatto che siete all’interno del virtual environment appena creato.

Procediamo quindi con l’installazione di telepot (e pprint):

pip install telepot
pip install pprint

Ora che è tutto pronto possiamo aprire il nostro Editor/IDE di fiducia e procedere con lo sviluppo. (Io uso Komodo Edit)

Questo è il codice stub da cui partire (file bot.py)

import telepot
from telepot.loop import MessageLoop
from pprint import pprint

def handle(msg):

    content_type, chat_type, chat_id = telepot.glance(msg)
    print(content_type, chat_type, chat_id)
    pprint(msg)

    username = msg['from']['username']
    user_id = msg['from']['id']
    
    if content_type == 'text':
        text = msg['text']
    


TOKEN = 'Il Vostro Token Generato da Botfather'

bot = telepot.Bot(TOKEN)
MessageLoop(bot, handle).run_as_thread()
print('Listening ...')

# Keep the program running.
while 1:
    time.sleep(10)

Apriamo adesso Telegram e chattiamo con @BotFather…
Diamo il comando /newbot per creare un nuovo bot e copia-incolliamo il Token risultante nella variabile TOKEN di bot.py.

Prima di proseguire facciamo una rapida analisi del codice:
handle è la nostra funzione che verrà eseguita ogniqualvolta il bot riceverà un messaggio… sia in privato sia nei gruppi a cui appartiene.
MessageLoop(bot, handle).run_as_thread() in sostanza crea un message loop sul bot di nome bot usando handle come gestore dei messaggi.
La parte finale dello script serve a tenere  in vita il programma che altrimenti, raggiunta la fine del codice, terminerebbe. Creiamo quindi un ciclo infinito e utlizziamo sleep per non consumare le risorse del processore. Tanto il message handler è su un altro thread.

Nel corpo di handler possiamo sbizzarrirci come vogliamo.
Le funzioni messe a disposizione da telepot (per il bot) sono le seguenti:

Bot.sendMessage()
Bot.forwardMessage()
Bot.sendPhoto()
Bot.sendAudio()
Bot.sendDocument()
Bot.sendSticker()
Bot.sendVideo()
Bot.sendVoice()
Bot.sendVideoNote()
Bot.sendLocation()
Bot.sendVenue()
Bot.sendContact()
Bot.sendGame()
Bot.sendChatAction()

Bot.kickChatMember()
Bot.unbanChatMember()
Bot.restrictChatMember()
Bot.promoteChatMember()
Bot.exportChatInviteLink()
Bot.setChatPhoto()
Bot.deleteChatPhoto()
Bot.setChatTitle()
Bot.setChatDescription()
Bot.pinChatMessage()
Bot.unpinChatMessage()
Bot.leaveChat()
Bot.getChat()
Bot.getChatAdministrators()
Bot.getChatMembersCount()
Bot.getChatMember()
Bot.setChatStickerSet()
Bot.deleteChatStickerSet()

Per la guida completa vi rimando a http://telepot.readthedocs.io/en/latest/reference.html#functions

Ad esempio, se vogliamo fare un bot “pappagallo”, che ripeta tutto ciò che viene scritto (anche per controllare che tutto funzioni correttamente) basterà scrivere nel corpo dell’handler:

bot.sendMessage(chat_id, text)

Se volete che il vostro bot possa interagire in un gruppo, prima di proseguire torniamo un attimo da BotFather e impostiamo il bot per ricevere tutti i messaggi che verranno digitati.
Digitiamo quindi /mybots per avere la lista dei nostri bot, tappiamo sul nome del nostro bot, Bot Settings, Group Privacy, Turn Off.

Avviamo finalmente il bot tramite il comando:
python bot.py

Se tutto è stato impostato correttamente, scrivendo qualcosa in privato al bot, questo dovrebbe ripetere esattamente ciò che è stato digitato.

Vediamo ora come tenerlo online 24/7 con Heroku.

Se non lo siamo già, registriamoci su https://signup.heroku.com/ e andiamo poi nella dashboard e creiamo una nuova app.

Vi consiglio di scaricare la CLI di Heroku qui.

Una volta installata la cli procediamo con la seguente serie di comandi:

heroku login

cd il_mio_bot/
git init
heroku git:remote -a nome-della-vostra-app-heroku

Proseguiamo con l’impostazione del progetto in modo che Heroku possa farlo girare automaticamente.

Creiamo un file di nome Procfile e scriviamoci dentro solamente:

worker: python bot.py

Questo dice a Heroku quale file avviare per far girare la nostra applicazione, e specifica che è di tipo worker.

Ora, per far sapere a Heroku quali siano le librerie di cui la nostra applicazione necessita, diamo il comando pip freeze > requirements.txt nella directory del progetto (assicurandoci di essere ancora nel virtual environment di cui all’inizio dell’articolo)

git add .
git commit -am "il mio primo bot"
git push heroku master

A questo punto Heroku si occuperà automaticamente di scaricare le librerie necessarie al progetto, lo compilerà, e lo avvierà.

Attenzione che non potete far girare il bot sia sulla vostra macchina sia su Heroku, contemporanemente.

Basta, il bot è pronto…
Ora potete far volare la fantasia per fargli fare le cose più interessanti e disparate 🙂
(Fargli controllare le email con qualche libreria imap, fargli mandare testi e foto, creare un quiz-bot, o tutto quello che vi passa per la testa.)

Per vedere in tempo reale cosa stia accadendo possiamo dare il comando (nella directory del progetto):

heroku logs --tail

Questo ci aiuterà anche in caso di errori o eccezioni del codice, poiché l’output dell’interprete python, così come ogni print() o pprint(), verrà stampato qui.

Buon lavoro a tutti 🙂

A proposito di me

Manfredo Manfredi

Computer Scientist.

I nostri Partner

Gli articoli più letti

Articoli recenti

Commenti recenti