Automatizando WhatsApp con WAHA en Docker y Python
Este tutorial explica cómo levantar WAHA en Docker, conectar WhatsApp y crear un bot en Python que responda automáticamente a mensajes usando eventos.
1️⃣ Preparar el entorno Docker
Crea un directorio para el proyecto y agrega los archivos necesarios:
mkdir -p /home/docker/waha
cd /home/docker/waha
Archivo docker-compose.yml
:
services:
waha:
image: devlikeapro/waha:noweb
container_name: waha
ports:
- "3001:3000"
environment:
WHATSAPP_DEFAULT_ENGINE: noweb
WHATSAPP_DEFAULT_SESSION: default
LOG_LEVEL: info
volumes:
- ./waha-data:/app/data
Archivo .env
(opcional):
# Tu API key en texto plano (opcional)
WAHA_API_KEY=tu_clave_segura
# O, mejor, el hash SHA512 que recomienda WAHA
# WAHA_API_KEY=sha512:{SHA512_HASH_DE_TU_API_KEY}
Levanta el contenedor:
docker-compose up -d
WAHA estará disponible en http://localhost:3001/dashboard/ y usará la sesión default.
2️⃣ Configurar la sesión de WhatsApp
Crear la sesión:
curl -X POST http://localhost:3001/api/sessions \
-H 'Content-Type: application/json' \
-d '{
"name": "default",
"config": {"noweb": {"markOnline": true}}
}'
Actualizar sesión existente:
curl -X PUT http://localhost:3001/api/sessions/default \
-H 'Content-Type: application/json' \
-d '{
"config": {"noweb": {"markOnline": true}}
}'
Arrancar la sesión:
curl -X POST http://localhost:3001/api/sessions/default/start \
-H "Content-Type: application/json"
Escanea el código QR desde WhatsApp: Ajustes > Dispositivos vinculados > Vincular un dispositivo. Una vez escaneado, la sesión estará activa.
3️⃣ Enviar mensajes desde la API
curl -X POST http://localhost:3001/api/sendText \
-H "Content-Type: application/json" \
-d '{
"session": "default",
"chatId": "595991xxxxxx@c.us",
"text": "Hola, este es un mensaje de prueba"
}'
4️⃣ Crear un bot en Python usando eventos
WAHA permite recibir mensajes sin exponer la API al público mediante eventos:
import requests
import time
SESSION = "default"
URL_EVENTS = "http://localhost:3001/api/events"
def send_text(chat_id, text):
payload = {
"session": SESSION,
"chatId": chat_id,
"text": text
}
return requests.post("http://localhost:3001/api/sendText", json=payload).json()
def handle_event(event):
if event.get("type") == "chat":
from_id = event["from"]
text = event["body"]
print(f"Nuevo mensaje de {from_id}: {text}")
send_text(from_id, f"Recibí tu mensaje: {text}")
while True:
try:
r = requests.get(URL_EVENTS)
events = r.json()
for event in events:
handle_event(event)
except Exception as e:
print(f"Error al procesar eventos: {e}")
time.sleep(1)
Usar eventos es seguro para uso personal o pruebas, ya que no requiere exponer la API. Para producción o integración con servidores públicos, considera usar Webhooks.
Comentarios
Publicar un comentario