Seguro que te ha pasado alguna vez: llegas a clase, ves a todo el mundo repasando apuntes y de repente alguien dice «¿estáis listos para el examen de hoy?». Y tú no tenías ni idea. Ese momento de pánico tiene solución, y no pasa por apuntarlo todo en una agenda que acabarás perdiendo. Pasa por programar tu propio asistente, uno que te escriba por WhatsApp para avisarte de cada examen con días de antelación.

En este artículo vas a construir paso a paso un bot de WhatsApp con Python para estudiantes. No es un ejercicio de juguete: vas a trabajar con archivos de datos, fechas, tareas programadas y una API real que usan empresas de todo el mundo. Es uno de esos proyectos de Python para adolescentes que, cuando lo enseñes a tus amigos, te van a pedir que les hagas uno igual.

Logotipo oficial de Python

Por qué este proyecto merece la pena

Hay miles de tutoriales que te enseñan a imprimir «Hola mundo» en pantalla. Este no es uno de ellos. Cuando terminas este proyecto, tienes algo que funciona en tu vida real, en tu móvil, todos los días. Y por el camino aprendes conceptos que se usan en el desarrollo profesional:

  • Leer datos de un archivo JSON, el formato que usan casi todas las aplicaciones modernas para guardar y enviar información.
  • Trabajar con fechas para calcular cuántos días faltan para cada examen.
  • Conectarte a una API, que es la forma en la que unos programas hablan con otros a través de internet.
  • Automatizar tareas para que tu código se ejecute solo a la hora que tú decidas.
  • Crear un pequeño servidor web para que el bot responda cuando le escribes.

Si alguna vez te has preguntado cómo funcionan por dentro las notificaciones de las apps, este es el mejor punto de partida para aprender a programar APIs sin morir en el intento.

Qué necesitas antes de empezar

Python es un lenguaje gratuito y de código abierto, mantenido por la Python Software Foundation, una organización sin ánimo de lucro que se encarga de que siga siendo libre y accesible para cualquier persona. Es el lenguaje más usado en institutos y universidades porque se lee casi como si fuera inglés. Esto es lo que vas a necesitar:

  • Python 3 instalado en tu ordenador (descárgalo desde la web oficial python.org).
  • Un editor de código, como Visual Studio Code o Thonny.
  • Una cuenta gratuita en Twilio, el servicio que hará de puente entre tu programa y WhatsApp.
  • Tu móvil con WhatsApp instalado.

Importante: para crear la cuenta en Twilio te pedirán datos personales y un número de teléfono. Hazlo siempre con un adulto (tu padre, tu madre o un profesor). Es la forma correcta de trabajar con servicios en internet y además te pueden ayudar si algo se atasca.

Logotipo de WhatsApp

Paso 1: Instalar las librerías

Una librería es código que otra persona ya ha escrito para que tú no tengas que empezar de cero. Abre la terminal (o el símbolo del sistema en Windows) y escribe:

pip install twilio schedule flask

Con esto instalas tres herramientas: twilio para enviar mensajes, schedule para programar tareas a una hora concreta y flask para crear el servidor que permitirá al bot responderte.

Paso 2: Activar el sandbox de WhatsApp en Twilio

Twilio tiene un modo de pruebas llamado sandbox que es perfecto para proyectos educativos. Cuando entres en tu panel de Twilio, busca la sección de mensajería y la opción de probar WhatsApp. Te dará un número de teléfono y una frase del tipo «join palabra-palabra». Tienes que enviar esa frase por WhatsApp desde tu móvil a ese número. A partir de ese momento, tu móvil queda conectado al sandbox y podrá recibir mensajes de tu programa.

En el panel también verás dos datos muy importantes: el Account SID y el Auth Token. Son como el usuario y la contraseña de tu bot. Nunca los compartas ni los subas a internet.

Paso 3: Guardar tus claves de forma segura

Un error típico de principiante es escribir las contraseñas directamente en el código. Los programadores profesionales usan variables de entorno, que son valores guardados en el sistema y no en el archivo. En Windows se hace así desde la terminal:

set TWILIO_ACCOUNT_SID=tu_account_sid
set TWILIO_AUTH_TOKEN=tu_auth_token
set MI_NUMERO=whatsapp:+34600000000

Y en Mac o Linux:

export TWILIO_ACCOUNT_SID=tu_account_sid
export TWILIO_AUTH_TOKEN=tu_auth_token
export MI_NUMERO=whatsapp:+34600000000

Sustituye los valores por los tuyos. El número debe llevar el prefijo de tu país (+34 en España) y la palabra «whatsapp:» delante.

Paso 4: Tu primer mensaje desde Python

Antes de construir el bot completo, vamos a comprobar que todo funciona. Crea un archivo llamado prueba.py con este código:

import os
from twilio.rest import Client

cliente = Client(os.environ["TWILIO_ACCOUNT_SID"], os.environ["TWILIO_AUTH_TOKEN"])

mensaje = cliente.messages.create(
    from_="whatsapp:+14155238886",
    to=os.environ["MI_NUMERO"],
    body="Hola, soy tu bot de estudio. Ya estoy funcionando."
)

print("Mensaje enviado con identificador:", mensaje.sid)

Ejecútalo con python prueba.py. Si todo ha ido bien, en unos segundos te vibrará el móvil. Ese número que empieza por +1415 es el número oficial del sandbox de Twilio; comprueba en tu panel que coincide con el que te aparece a ti.

Acabas de hacer que un programa escrito por ti se comunique con un servicio en internet y llegue a tu teléfono. Eso es exactamente lo que significa trabajar con una API.

Paso 5: Crear tu calendario de exámenes

Ahora necesitamos que el bot sepa cuándo tienes cada examen. Crea un archivo llamado examenes.json en la misma carpeta y rellénalo con tus fechas:

[
  {"asignatura": "Matemáticas", "fecha": "2025-03-14", "tema": "Ecuaciones de segundo grado"},
  {"asignatura": "Historia", "fecha": "2025-03-18", "tema": "La Revolución Francesa"},
  {"asignatura": "Inglés", "fecha": "2025-03-21", "tema": "Present perfect"},
  {"asignatura": "Física y Química", "fecha": "2025-03-25", "tema": "Movimiento rectilíneo"}
]

Fíjate en que las fechas siguen el formato año-mes-día. Es el formato estándar internacional y tiene una ventaja enorme: si ordenas las fechas como texto, quedan ordenadas también cronológicamente. Cambia las fechas por las de tus exámenes reales.

Paso 6: El bot completo que te avisa cada día

Aquí viene la parte potente. Este programa revisa tu calendario todos los días a las 18:00 y te envía un aviso cuando falta una semana, tres días o un día para un examen. Crea un archivo llamado bot_examenes.py:

import os
import json
import time
from datetime import date, datetime

import schedule
from twilio.rest import Client

NUMERO_TWILIO = "whatsapp:+14155238886"
MI_NUMERO = os.environ["MI_NUMERO"]
DIAS_DE_AVISO = (7, 3, 1)

cliente = Client(os.environ["TWILIO_ACCOUNT_SID"], os.environ["TWILIO_AUTH_TOKEN"])


def cargar_examenes(ruta="examenes.json"):
    with open(ruta, encoding="utf-8") as archivo:
        return json.load(archivo)


def examenes_proximos(examenes):
    hoy = date.today()
    avisos = []
    for examen in examenes:
        fecha = datetime.strptime(examen["fecha"], "%Y-%m-%d").date()
        faltan = (fecha - hoy).days
        if faltan in DIAS_DE_AVISO:
            avisos.append((examen, faltan))
    return avisos


def construir_mensaje(avisos):
    lineas = ["Recordatorio de exámenes:"]
    for examen, faltan in avisos:
        if faltan == 1:
            cuando = "MAÑANA"
        else:
            cuando = f"en {faltan} días"
        lineas.append(f"- {examen['asignatura']} {cuando}: {examen['tema']}")
    lineas.append("Tú puedes. Dedica un rato a repasar hoy.")
    return "\n".join(lineas)


def enviar_whatsapp(texto):
    cliente.messages.create(from_=NUMERO_TWILIO, to=MI_NUMERO, body=texto)


def tarea_diaria():
    avisos = examenes_proximos(cargar_examenes())
    if avisos:
        enviar_whatsapp(construir_mensaje(avisos))
        print("Recordatorio enviado")
    else:
        print("Hoy no hay exámenes cerca")


schedule.every().day.at("18:00").do(tarea_diaria)
print("Bot en marcha. Pulsa Ctrl+C para detenerlo.")

while True:
    schedule.run_pending()
    time.sleep(60)

Qué hace cada parte del código

cargar_examenes abre el archivo JSON y lo convierte en una lista de diccionarios de Python. El parámetro encoding=»utf-8″ evita problemas con las tildes y la letra ñ.

examenes_proximos es el cerebro del bot. Convierte cada fecha de texto en un objeto de fecha real con strptime, la resta a la fecha de hoy y obtiene cuántos días faltan. Si ese número coincide con alguno de los días de aviso, lo guarda.

construir_mensaje monta el texto que te llegará al móvil usando f-strings, una forma muy cómoda de mezclar texto y variables. El símbolo \n crea saltos de línea.

schedule.every().day.at(«18:00») programa la tarea para que se ejecute cada día a esa hora. El bucle final mantiene el programa vivo y comprueba cada minuto si toca hacer algo.

Truco para probarlo sin esperar: cambia la hora a un par de minutos después de la hora actual, o añade una llamada a tarea_diaria() justo antes del bucle para que se ejecute nada más arrancar.

Símbolo de Python

Paso 7: Nivel avanzado, haz que el bot te responda

Hasta ahora el bot habla, pero no escucha. Vamos a darle la vuelta: cuando le escribas la palabra «examenes», te responderá con la lista de todos tus exámenes pendientes. Para ello Twilio usa algo llamado webhook: cada vez que recibes un mensaje, Twilio avisa a una dirección web tuya, y tu programa contesta. Crea un archivo llamado servidor.py:

import json
from datetime import date, datetime

from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse

app = Flask(__name__)


def cargar_examenes(ruta="examenes.json"):
    with open(ruta, encoding="utf-8") as archivo:
        return json.load(archivo)


@app.route("/whatsapp", methods=["POST"])
def responder():
    texto = request.form.get("Body", "").strip().lower()
    respuesta = MessagingResponse()

    if "examen" in texto:
        hoy = date.today()
        futuros = [
            ex for ex in cargar_examenes()
            if datetime.strptime(ex["fecha"], "%Y-%m-%d").date() >= hoy
        ]
        futuros.sort(key=lambda ex: ex["fecha"])

        if futuros:
            lineas = ["Tus próximos exámenes:"]
            for ex in futuros:
                lineas.append(f"- {ex['fecha']} | {ex['asignatura']}: {ex['tema']}")
            respuesta.message("\n".join(lineas))
        else:
            respuesta.message("No tienes exámenes pendientes. Disfruta.")
    else:
        respuesta.message("Escribe 'examenes' para ver tu calendario.")

    return str(respuesta)


if __name__ == "__main__":
    app.run(port=5000)

Este servidor funciona en tu ordenador, pero Twilio necesita poder encontrarlo desde internet. Para eso se usa una herramienta llamada ngrok, que crea un túnel temporal y te da una dirección pública. Con el servidor en marcha, ejecutas en otra terminal:

ngrok http 5000

Copia la dirección que empieza por https, añade /whatsapp al final y pégala en la configuración del sandbox de Twilio, en el campo que indica qué hacer cuando llega un mensaje. Ahora escribe «examenes» a tu bot y verás cómo te contesta al instante.

Errores frecuentes y cómo solucionarlos

  • KeyError: ‘TWILIO_ACCOUNT_SID’: no has definido las variables de entorno o las has definido en otra ventana de la terminal. Tienen que estar en la misma ventana donde ejecutas el programa.
  • No llega ningún mensaje: revisa que has enviado la frase «join» al número del sandbox. Esa conexión caduca pasado un tiempo, así que quizá tengas que repetirla.
  • ValueError al leer la fecha: alguna fecha del JSON no sigue el formato año-mes-día. Revisa que no haya barras ni espacios.
  • JSONDecodeError: te falta o te sobra una coma, o has usado comillas simples en lugar de dobles dentro del archivo JSON.

Retos para llevar tu bot al siguiente nivel

Si has llegado hasta aquí, ya tienes un proyecto del que presumir. Pero lo mejor de programar es que siempre puedes ir más allá. Aquí tienes algunas ideas para seguir mejorando:

  1. Añadir exámenes desde WhatsApp: haz que al escribir «nuevo Matemáticas 2025-04-02 Funciones» el bot guarde el examen en el JSON.
  2. Recordatorio de deberes: crea otro archivo para las tareas y que el bot te las recuerde la noche anterior.
  3. Frases motivadoras aleatorias: usa la librería random para que cada mensaje termine con una frase distinta.
  4. Bot para toda la clase: con permiso de tus compañeros, guarda una lista de números y envía el recordatorio a todos.
  5. Ejecutarlo en una Raspberry Pi: así funciona las 24 horas sin necesidad de dejar tu ordenador encendido.

Este último reto es especialmente interesante si te atrae la electrónica, porque mezcla programación y hardware. Es justo el tipo de proyecto que conecta Python con el mundo de la robótica.

Lo que has aprendido realmente

Más allá de no olvidar nunca un examen, has trabajado con lectura de archivos, manejo de fechas, funciones, bucles, variables de entorno, peticiones a una API externa, tareas programadas y un servidor web con webhooks. Son exactamente las piezas con las que se construyen aplicaciones de verdad. La diferencia entre un estudiante que «sabe un poco de Python» y uno que sabe programar está en proyectos como este, donde todo encaja y produce algo útil.

Y recuerda la regla de oro: el bot te avisa, pero estudiar sigue siendo cosa tuya. Eso sí, ahora tendrás tiempo de sobra para prepararte.

¿Quieres crear más proyectos como este y aprender a programar de verdad?

En Robótica Online tienes cursos de Python, robótica y programación pensados para estudiantes de secundaria.

Descubre los cursos de Robótica Online

Su título va aquí

Resumen de privacidad
Robodemia

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.

Toda le información en: https://www.robodemia.es/politica-de-privacidad

 

Cookies estrictamente necesarias

Las cookies estrictamente necesarias tiene que activarse siempre para que podamos guardar tus preferencias de ajustes de cookies.

Analítica

Esta web utiliza Google Analytics para recopilar información anónima tal como el número de visitantes del sitio, o las páginas más populares.

Dejar esta cookie activa nos permite mejorar nuestra web.