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 🙂