jueves, 29 de septiembre de 2022

Bot Telegram usando Python


En este tutorial vamos a aprender a crear un bot de telegram usando Python y el bot API.

El bot API es  una interfaz basada en HTTP creada para los desarrolladores interesados ​​en crear bots para Telegram.

Para comenzar debemos crear un bot de telegram usando el bot padre (o conocido por su alias @botfather) que es quien crea los bots, administra los tókenes, los alias y permisos. Los pasos se muestran a continuación. 



1. Inicir el botfather
Abrimos la aplicación de Telegram y buscamos @botfather.
Alternativamente podemos encontrar el botfather aquí



Presionamos INICIAR y enviamos el mensaje /help para ver todos los comando disponibles. 



2. Crear el bot
Para crear un nuevo bot, enviamos el mensaje /newbot. El botfather solicitarà un nombre para el nuevo bot. El nombre debe ser único y terminar con la palabra "_bot", por ejemplo Mirobot11_bot. Adicionalmente será necesario un nombre de usuario para nuestro bot, puede ser el mismo nombre.


Una vez creado el bot, el botfather mostrará información de acceso como es el URL y  el TOKEN que se necesita para acceder al bot a través del API



 
 NO COMPARTA EL TOKEN

Para verificar que el bot está funcionando, ingresamos en el navegador la url https://api.telegram.org/bot<TOKEN>/getUpdates (reemplace <TOKEN> por su token) y obtendremos el siguiente resultado:

3. Crear el código en Python

Instalamos Python 3 en nuestro dispositivo. Si no sabes como hacerlo pulsa aquí. Creamos un script con el siguiente código y lo guardamos con el nombre telegram.py:


#importamos el módulo de control del bot API
import utelegram
#creamos asociada a la entrada de un mensaje en general 
def get_message(message):
    #print(message) #descomente para visualizar el objeto mensaje
    print(message['message']['text'])
    bot.send(message['message']['chat']['id'], message['message']['text'].upper())
#creamos una fucnión asociada a la entrada de un mensaje tipo /comando 
def reply_ping(message):
    #print(message) #descomente para visualizar el objeto mensaje 
    bot.send(message['message']['chat']['id'], 'pong')
#creamos el bot
try:
    bot = utelegram.ubot('1818111702:Yw6To8B6rAYuQlrsYn8') #usamos nuestro PIN
    bot.register('/ping', reply_ping)    #asociamos la función de entrada de un comando
    bot.set_default_handler(get_message) #asociamos la función de entrada de un mensaje en general 
    print('BOT LISTENING')               #Mensaje de depuración
    bot.listen()                         #iniciamos la escucha continua de mensajes, esta fucnión
                                         #bloquea la ejecución del programa
except:
    print('NOT CONNECTED - aborting')    # controlamos si existe algún error

Creamos otro script con el siguiente código y lo guardamos con el nombre de utelegram.py en el mismo directorio donde se guardò el script anterior.


import gc
try:
     import utime
except:
    import time as utime
try:
    import ujson
except:
    import json as ujson
try:    
    import urequests
except:
    import requests as urequests
class ubot:
    def __init__(self, token, offset=0):
        self.url = 'https://api.telegram.org/bot' + token
        self.commands = {}
        self.default_handler = None
        self.message_offset = offset
        self.sleep_btw_updates = 3

        messages = self.read_messages()
        if messages:
            if self.message_offset==0:
                self.message_offset = messages[-1]['update_id']
            else:
                for message in messages:
                    if message['update_id'] >= self.message_offset:
                        self.message_offset = message['update_id']
                        break


    def send(self, *argv):
        if len(argv)>1: 
            data = {'chat_id': argv[0], 'text': argv[1]}
        else:
            data=argv[-1]
        try:
            headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
            response = urequests.post(self.url + '/sendMessage', json=data, headers=headers)
            response.close()
            return True
        except:
            return False

    def read_messages(self):
        result = []
        self.query_updates = {
            'offset': self.message_offset + 1,
            'limit': 1,
            'timeout': 30,
            'allowed_updates': ['message']}

        try:
            update_messages = urequests.post(self.url + '/getUpdates', json=self.query_updates).json() 
            if 'result' in update_messages:
                for item in update_messages['result']:
                    result.append(item)
            return result
        except (ValueError):
            return None
        except (OSError):
            print("OSError: request timed out")
            return None

    def listen(self):
        while True:
            self.read_once()
            utime.sleep(self.sleep_btw_updates)
            gc.collect()

    def read_once(self):
        messages = self.read_messages()
        if messages:
            if self.message_offset==0:
                self.message_offset = messages[-1]['update_id']
                self.message_handler(messages[-1])
            else:
                for message in messages:
                    if message['update_id'] >= self.message_offset:
                        self.message_offset = message['update_id']
                        self.message_handler(message)
                        break
    
    def register(self, command, handler):
        self.commands[command] = handler

    def set_default_handler(self, handler):
        self.default_handler = handler

    def set_sleep_btw_updates(self, sleep_time):
        self.sleep_btw_updates = sleep_time

    def message_handler(self, message):
        if 'text' in message['message']:
            parts = message['message']['text'].split(' ')
            if parts[0] in self.commands:
                self.commands[parts[0]](message)
            else:
                if self.default_handler:
                    self.default_handler(message)

 

Ejecutamos el script telegram.py y esperamos a que se conecte al bot. Si no existe  ningún problema se imprimirá el mensaje BOT LISTENING y el bot empezará a escuchar los mensajes.



4. Probar el bot

Para enviar un mensaje al bot, lo buscamos en la app de telegram o accedemos al URL de acceso al mismo https://telegram.me/mirobot11_bot y presionamos INICIAR (se puede iniciar el bot enviando el comando /start)

 

Enviamos un mensaje de texto y el bot responderá con el mismo mensaje en mayúsculas. Si enviamos el comando /ping el bot responderá con el texto "pong"




Para mayor información acerca del bot API entra aquì 

No hay comentarios: