Cómo Construir Sistemas de Confirmación Robustos con Telegram Bots
Share
Cómo Construir Sistemas de Confirmación Robustos con Telegram Bots
Introducción
Cuando desarrollas sistemas automatizados que manejan operaciones críticas, la confiabilidad no es opcional. Un error de interpretación en un comando puede significar la diferencia entre registrar una transacción correctamente o crear inconsistencias en tus datos. En este artículo, exploraremos cómo construir sistemas de confirmación robustos usando Telegram Bot API, basándonos en la implementación real de un sistema de gestión de préstamos que alcanzó 100% de confiabilidad operativa.
El Problema: Interpretación Ambigua de Comandos
Los sistemas tradicionales que dependen de procesamiento de lenguaje natural (NLU) para comandos críticos enfrentan un dilema fundamental: la ambigüedad del lenguaje humano. Cuando un usuario envía "Pago de Fany $800", ¿se refiere a un pago recibido, una promesa de pago, o una consulta? La interpretación incorrecta genera errores costosos.
La Solución: Arquitectura ASK-CONFIRM-ACT
La clave está en separar tres capas:
- ASK (Extracción): Usa regex para extraer datos estructurados sin ambigüedad
- CONFIRM (Confirmación): Presenta los datos extraídos para validación humana
- ACT (Ejecución): Solo ejecuta acciones tras confirmación explícita
Esta arquitectura elimina la interpretación ambigua y coloca al humano como validador final.
Implementación: Sistema de Confirmación con Botones
Paso 1: Extracción Directa con Regex
En lugar de depender de modelos de IA para interpretar, usa patrones regex precisos:
import re
def extract_payment_data(message_text):
# Patrón: Nombre $Monto #NumPrestamo
pattern = r'([A-ZÁÉÍÓÚÑ][A-Za-záéíóúñ]+)\s\$([0-9,]+)\s#(\d+)'
matches = re.findall(pattern, message_text)
payments = []
for name, amount, loan_id in matches:
payments.append({
'name': name.upper(),
'amount': float(amount.replace(',', '')),
'loan_id': loan_id
})
return payments
Esta función puede procesar múltiples pagos en un solo mensaje:
Input: "Fany $800 #11, Fabiola $1050 #5"
Output: [
{'name': 'FANY', 'amount': 800.0, 'loan_id': '11'},
{'name': 'FABIOLA', 'amount': 1050.0, 'loan_id': '5'}
]
Paso 2: Botones Inline para Confirmación
Usa la API de Telegram para crear botones de confirmación:
import requests
def send_confirmation_buttons(chat_id, payments, bot_token):
text = "📋 Confirma los siguientes pagos:\n\n"
for p in payments:
text += f"• {p['name']}: ${p['amount']:.2f} (Préstamo #{p['loan_id']})\n"
keyboard = {
"inline_keyboard": [[
{"text": "✅ Confirmar", "callback_data": f"confirm_{generate_id()}"},
{"text": "❌ Cancelar", "callback_data": "cancel"}
]]
}
requests.post(
f"https://api.telegram.org/bot{bot_token}/sendMessage",
json={
"chat_id": chat_id,
"text": text,
"reply_markup": keyboard
}
)
Paso 3: Protección contra Duplicados
Implementa idempotency keys para prevenir ejecuciones duplicadas:
import hashlib
import json
processed_confirmations = set()
def generate_idempotency_key(payment_data):
data_string = json.dumps(payment_data, sort_keys=True)
return hashlib.sha256(data_string.encode()).hexdigest()[:16]
def process_confirmation(callback_data, payment_data):
idempotency_key = generate_idempotency_key(payment_data)
if idempotency_key in processed_confirmations:
return {"status": "duplicate", "message": "Ya procesado"}
# Ejecutar operación crítica
result = register_payments(payment_data)
if result['success']:
processed_confirmations.add(idempotency_key)
return result
Monitoreo en Tiempo Real con inotify
Para sistemas que requieren alertas inmediatas, implementa monitoring basado en eventos del sistema de archivos:
#!/bin/bash
DB_FILE="/path/to/database.csv"
BOT_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"
inotifywait -m -e modify "$DB_FILE" | while read path action file; do
LAST_LINE=$(tail -n 1 "$DB_FILE")
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=🔔 Nuevo registro: ${LAST_LINE}"
done
Integra con systemd para ejecución permanente:
[Unit]
Description=Monitor de Base de Datos
After=network.target
[Service]
Type=simple
ExecStart=/path/to/monitor_script.sh
Restart=always
User=appuser
[Install]
WantedBy=multi-user.target
Consideraciones de Permisos y Seguridad
Cuando múltiples servicios interactúan con archivos compartidos, los permisos son críticos:
Asegurar que ambos servicios puedan leer/escribir
chmod 666 /path/to/shared/database.csv
O mejor: usar grupo común
sudo groupadd appgroup
sudo usermod -a -G appgroup service1_user
sudo usermod -a -G appgroup service2_user
chown :appgroup /path/to/shared/database.csv
chmod 660 /path/to/shared/database.csv
Lecciones Aprendidas
1. Simplicidad sobre Inteligencia Artificial
Para operaciones críticas, regex bien diseñadas superan a modelos de IA en confiabilidad. Un patrón `([A-Z]+)\s\$([0-9,]+)\s#(\d+)` nunca interpretará mal si los usuarios siguen el formato.
2. Confirmación Explícita Obligatoria
Nunca ejecutes operaciones críticas sin confirmación humana explícita. Los botones inline de Telegram eliminan ambigüedad: el usuario debe hacer clic en ✅ o ❌.
3. Idempotencia por Defecto
Toda operación debe ser idempotente. Genera keys únicas basadas en el contenido de la operación, no en timestamps o IDs secuenciales.
4. Evita Opciones Numeradas
No preguntes "Elige: 1) Confirmar 2) Cancelar". Los usuarios pueden responder con contexto adicional que confunde al parser. Usa botones inline que generan callbacks inequívocos.
Conclusión
Construir sistemas confiables para operaciones críticas requiere arquitectura intencional. La combinación de extracción determinística con regex, confirmación explícita mediante botones interactivos, y protección contra duplicados mediante idempotency keys, crea sistemas que alcanzan niveles de confiabilidad superiores al 99%.
La clave está en reconocer cuándo no usar IA: para comandos críticos, la precisión determinística de regex supera la flexibilidad pero ambigüedad del procesamiento de lenguaje natural. Reserva la IA para análisis, recomendaciones y tareas donde la ambigüedad es aceptable, pero mantén las operaciones críticas bajo control determinístico.
Implementa estas técnicas en tu próximo proyecto que maneje transacciones financieras, inventarios o cualquier operación donde un error tenga consecuencias reales. Tu futuro yo te lo agradecerá.