Una nueva guía centrada en Laravel muestra a los desarrolladores cómo evitar que los bots de Telegram agoten el tiempo de espera, dupliquen acciones o colapsen bajo carga, asegurando el webhook, utilizando Redis para la idempotencia y delegando las tareas pesadas a las colas.

Por qué los webhooks de Telegram necesitan algo más que una simple ruta

Telegram envía cada interacción del usuario a un bot mediante un HTTP POST a una URL especificada por el desarrollador. La plataforma espera un 200 OK en pocos segundos; si tarda más, reintenta la solicitud. Los reintentos significan que el mismo update_id puede llegar varias veces y, si el bot escribe en una base de datos o llama a APIs externas dentro de la solicitud, puede crear filas duplicadas, mensajes dobles o condiciones de carrera. Para los bots que gestionan decenas o cientos de mensajes por segundo, esa latencia se convierte rápidamente en un obstáculo.

1. Proteja el endpoint con un encabezado secreto

Telegram añade un encabezado X-Telegram-Bot-Api-Secret-Token a cada llamada de webhook. Compare ese encabezado con un secreto almacenado en el servidor —utilizando la función hash_equals de PHP para evitar ataques de temporización— y rechace cualquier solicitud que no se origine en Telegram. En Laravel, coloque esta comprobación en un middleware para que la verificación se ejecute antes de que el controlador toque el payload.

2. Haga que cada actualización sea idempotente con Redis

Cada payload entrante lleva un update_id único. La guía sugiere escribir ese ID en Redis con la bandera NX (set-if-not-exists). La operación tiene éxito solo en la primera aparición; un reintento encontrará que la clave ya está presente y el webhook podrá devolver inmediatamente un 200 OK, indicando a Telegram que la actualización ha sido gestionada. Debido a que Redis reside en la memoria, la comprobación no añade prácticamente latencia y la clave permanece para detectar duplicados.

3. Delegue el trabajo pesado a los trabajos en segundo plano

Incluso con una comprobación rápida en Redis, la lógica de negocio del bot —escrituras en la base de datos, llamadas a APIs de terceros, composición de mensajes— nunca debe ejecutarse dentro de la solicitud del webhook. Despache un job en cola de Laravel tan pronto como se verifique el webhook y se almacene el update_id. Envíe la respuesta HTTP al instante, permitiendo que el worker procese el trabajo a su propio ritmo. Esto mantiene al bot dentro del plazo de respuesta de Telegram y evita que la plataforma reintente la solicitud.

Ajustes de nivel de producción

  • Respete los límites de velocidad. Telegram devuelve un 429 Too Many Requests con un encabezado Retry-After cuando un bot supera sus límites por segundo. Los workers de la cola deben leer ese encabezado y pausarse antes de reintentar el trabajo fallido.
  • Persista antes de responder. Escriba primero cualquier dato del usuario en la base de datos; solo después de un commit exitoso debe el bot enviar un mensaje de confirmación. Este orden evita escenarios en los que un mensaje llega al usuario pero el registro correspondiente nunca se materializa.
  • Reduzca los payloads de los callbacks. Telegram limita callback_data a 64 bytes. Almacene blobs más grandes en la base de datos y pase solo un ID de referencia en el payload del botón para mantenerse dentro del límite.

En resumen: Autenticar la solicitud, eliminar duplicados con Redis y delegar el trabajo a las colas permite a los desarrolladores de Laravel crear bots de Telegram que responden al instante, se mantienen dentro de los límites de velocidad y escalan limpiamente a medida que aumenta la demanda de los usuarios.