Pirobits
  

Cómo crear un Bot de Telegram usando Python

alberto avatar Alberto Sola · 12/23/2023 · 4 min

En este post te explico cómo crear un bot de telegram usando Python en tres sencillos pasos.

Estos días he estado viendo cómo automatizar algunos de mis procesos, y la verdad, me ha parecido una buena idea utilizar telegram. Es una aplicación a la que yo prácticamente no le daba uso, pero recientemente me he dado cuenta el valor que aporta para algunas tareas.

En cualquier caso, hoy quiero contarte cómo crear un bot de telegram. Si tienes alguna duda o quieres que explique o cuente algún tema en más detalle, puedes enviarme tus ideas a través de telegram, twitter o youtube.

Paso 1. Registra tu bot en telegram.

El primer paso es, desde la aplicación de telegram, buscar el usuario @BotFather. A través de este usuario puedes configurar y gestionar tus bots.

Lo primero es mandar el mensaje /start para ejecutar un comando que te mostrará una lista de todos los comandos que te ofrece.

Como verás, el primer paso es mandar el mensaje /newbot para crear tu primer bot, y seguir el proceso de configuración.

Cuando termines, obtendrás un token que deberás guardar a buen recaudo.

Paso 2. Crea tu primer bot usando Python.

Ahora crea una carpeta para guardar el código de tu bot, y crea los siguientes ficheros:

  • .env
  • main.py

Para empezar con esto es suficiente. Ahora abre el fichero .env y añade el token de tu bot, obtenido en el paso anterior:

```.env TELEGRAM_TOKEN="mysecrettoken1234"


Y en tu fichero `main.py` añade el siguiente código:

```python
import logging
from functools import wraps
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, MessageHandler, filters
import os
from dotenv import load_dotenv

load_dotenv()

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text(f'Hello {update.effective_user.first_name}')

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text if update.message else update.channel_post.text
    await context.bot.send_message(chat_id=update.effective_chat.id, text=text)

if __name__ == '__main__':
    token = os.getenv("TELEGRAM_TOKEN")
    app = ApplicationBuilder().token(token).build()
    app.add_handler(CommandHandler("hello", hello))
    app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), echo))
    app.run_polling()

Este código te permite crear un bot de Telegram para interactuar con los usuarios de forma simple. La función hello permite que el bot responda al comando "/hello" con un saludo personalizado, incluyendo el nombre del usuario que envió el comando. Por otro lado, la función echo hace que el bot repita cualquier mensaje que reciba que no sea un comando. Por último, el bot se inicializa para gestionar los mensajes mediante la función run_polling(), utilizando un token de autenticación obtenido del entorno.

Para que puedas ejecutarlo, primero tienes que instalar las dependencias, que son:

pip install python-dotenv python-telegram-bot

Te explico brevemente cada una:

Finalmente ejecuta el código en tu máquina utilizando python main.py. El bot lo puedes desplegar en cualquier servicio. Si te parece interesante puedo enseñarte cómo en otro post.

Paso 3. Configura la seguridad.

Por defecto, cualquier usuario puede enviar mensajes con tu bot y añadirlo a cualquier grupo. Si esto es lo que quieres, genial ya lo tienes. Si no es el caso, que quieres limitar tu uso para que sea privado, sigue leyendo.

Si no quieres que pueda añadirse a ningún grupo, vuelva a la conversación con @BotFather, y manda un mensaje /setjoingroups. Con este comando puedes configurar que tu bot no pueda unirse a grupos. De esta forma, si alguien lo añade a un grupo, recibirás un enlace de invitación.

Por otro lado telegram no ofrece ninguna funcionalidad para que otros usuarios puedan interactuar con tu bot, por lo que debemos protegerlo en la capa de aplicación.

Te dejo el siguiente decorador, que no deja de ser una función que envuelve a otra función, de forma que los handlers de comandos o mensajes de tu bot que desees, estén protegidos y solamente los usuarios que tengan un ID que esté permitido podrán interactuar con tu bot.

LIST_OF_CHATS = [int(item) for item in os.getenv("ALLOWED_CHATS").split(',')]

def restricted(func):
    @wraps(func)
    async def wrapped(update, context, *args, **kwargs):
        if update.effective_chat is not None:
            sender_chat = update.effective_chat.id
            if sender_chat not in LIST_OF_CHATS:
                print(f"Unauthorized access denied for {sender_chat}.")
                return
        return await func(update, context, *args, **kwargs)
    return wrapped

Recuerda añadir la variable ALLOWED_CHATS en tu .env de la siguiente forma:

.env ALLOWED_CHATS="first_id,second_id"

Para obtener el ID de tu usuario, crea un handler sencillo para tu bot que imprima el parámetro update de la función handler, y ahí podrás ver el ID del usuario y el ID del chat.

Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.


Posts recientes