[Charla] Bots de WhatsApp

Charlas

¿Cómo instalar docker?

Ubuntu 24.04

# Añade la clave GPG oficial de Docker:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Añadir el repositorio a las fuentes de APT:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Arch Linux

sudo pacman -Syu docker docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

Fedora

sudo dnf update -y
sudo dnf install docker-cli containerd
sudo dnf install docker-compose
sudo dnf install docker-switch

Instalar waha

docker run -it --network=host devlikeapro/waha

¿Cómo inslar waha en un entorno de producción?

Para instalar waha en un entorno de producción debemos configurar parametros especiales para proteger nuestra API, para información visitar: waha.

Ejemplos

¡Hola mundo 🧑🏻‍🎓!

Ejemplo con curl

curl -X 'POST' \
  'http://localhost:3000/api/sendText' \
  -H 'Content-Type: application/json' \
  -d '{                                
  "chatId": "[email protected]",
  "text": "¡Hola mundo 🧑🏻‍🎓!",
  "linkPreview": false,
  "linkPreviewHighQuality": false,
  "session": "default"
}'

Ejemplo con python

import requests
import json

url = "http://localhost:3000/api/sendText"
headers = {"Content-Type": "application/json"}
data = {
    "chatId": "[email protected]",
    "text": "¡Hola mundo 🧑🏻‍🎓!",
    "linkPreview": False,
    "linkPreviewHighQuality": False,
    "session": "default"
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.status_code)
print(response.json())

¿Cómo se podrían responder a mensajes?

¡Con WebHooks!

import requests
import time
import random
import threading
from flask import Flask, request

# Configuración
HELP_MESSAGE = "Este es el mensaje de ayuda."
ENABLE_LOGGING = True

def log(message):
    if ENABLE_LOGGING:
        print(message)

def start_typing(chat_id, session="default"):
    typing_url = "http://127.0.0.1:3000/api/startTyping"
    typing_data = {
        "chatId": chat_id,
        "session": session
    }
    try:
        requests.post(typing_url, json=typing_data)
        log(f"Simulación de escritura iniciada en el chat {chat_id}.")
    except requests.RequestException as e:
        log(f"Error al iniciar la simulación de escritura: {e}")

def stop_typing(chat_id, session="default"):
    typing_url = "http://127.0.0.1:3000/api/stopTyping"
    typing_data = {
        "chatId": chat_id,
        "session": session
    }
    try:
        requests.post(typing_url, json=typing_data)
        log(f"Simulación de escritura detenida en el chat {chat_id}.")
    except requests.RequestException as e:
        log(f"Error al detener la simulación de escritura: {e}")

def send_message(chat_id, text, session="default"):
    send_data = {
        "chatId": chat_id,
        "text": text,
        "session": session
    }
    send_url = "http://127.0.0.1:3000/api/sendText"
    log(f"Enviando mensaje al chat {chat_id} mediante {send_url}")
    try:
        resp = requests.post(send_url, json=send_data)
        resp.raise_for_status()
        log("Mensaje enviado con éxito.")
    except requests.RequestException as e:
        log(f"Error al enviar el mensaje: {e}")

def process_ping(payload):
    log("Procesando /ping")
    chat_id = payload.get("from")
    if not chat_id:
        return
    start_typing(chat_id)
    time.sleep(random.uniform(1, 2))
    stop_typing(chat_id)
    send_message(chat_id, "pong", payload.get("session", "default"))


app = Flask(__name__)

@app.route('/notification', methods=['POST'])
def notification():
    log("Recibiendo solicitud en /notification")
    data = request.get_json()
    if not data:
        log("No se recibieron datos JSON válidos.")
        return '', 400

    log(f"Datos recibidos: {data}")
    payload = data.get('payload', {})
    command_body = payload.get('body', '').strip()
    log(f"Comando recibido: {command_body}")
    command_lower = command_body.lower()

    if command_lower == '/ping':
        process_ping(payload)

    return '', 200

if __name__ == '__main__':
    log("Iniciando servidor Flask en el puerto 2343")
    app.run(port=2343, host='0.0.0.0')

Deja un comentario