Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
\n# Log files
*.log
74 changes: 74 additions & 0 deletions INSTRUCCIONES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Guía de Despliegue: Cómo Poner tu Chatbot en Internet

¡Felicidades! Hemos llegado al último paso. Todo el código de tu chatbot está preparado y listo para ser "desplegado", es decir, puesto en línea para que WhatsApp pueda comunicarse con él.

Usaremos un servicio gratuito llamado **Render**. Sigue estos pasos cuidadosamente.

---

### Video de Apoyo

Si prefieres una guía visual, este video (en inglés) muestra un proceso muy similar. Puedes usarlo como referencia junto con mis instrucciones escritas.

**Ver Video:** [Cómo Desplegar una App de Flask en Render (2025)](https://www.youtube.com/watch?v=vwoUriuqcio)

---

### Paso 1: Crea tu Cuenta en Render

1. Ve a la página de Render: [https://render.com/](https://render.com/)
2. Haz clic en **"Get Started"** o **"Sign Up"**.
3. **La forma más fácil es registrarte usando tu cuenta de GitHub.** Esto conectará automáticamente tus proyectos.

### Paso 2: Crea un Nuevo "Web Service"

1. Una vez dentro de tu panel de control de Render, busca y haz clic en el botón **"New +"**.
2. En el menú que aparece, selecciona la opción **"Web Service"**.

### Paso 3: Conecta tu Repositorio de GitHub

1. Render te mostrará una lista de tus repositorios de GitHub.
2. Busca el repositorio de nuestro proyecto de chatbot en la lista y haz clic en **"Connect"** al lado de su nombre.

### Paso 4: Configura tu Servicio

Esta es la parte más importante. Render leerá nuestro código y rellenará algunos campos automáticamente. Asegúrate de que la configuración sea exactamente la siguiente:

* **Name:** Elige un nombre único para tu bot (por ejemplo, `nova-cloud-bot`). Este nombre formará parte de tu URL.
* **Region:** Puedes dejar la que viene por defecto.
* **Branch:** Asegúrate de que esté seleccionada la rama `main` o `master`.
* **Runtime:** Render debería detectar `Python 3` automáticamente. Si no, selecciónalo.
* **Build Command:** `pip install -r requirements.txt` (Este comando instala todas las librerías que necesita nuestro bot).
* **Start Command:** `sh start.sh` (Este comando ejecuta el script que creamos para iniciar el servidor de producción).

### Paso 5: Elige el Plan Gratuito y Lanza el Servicio

1. Asegúrate de que está seleccionado el plan **"Free"**.
2. Desplázate hasta el final de la página y haz clic en el botón **"Create Web Service"**.

### Paso 6: ¡Espera la Magia!

Render empezará a construir y desplegar tu bot. Este proceso puede tardar unos minutos. Verás un registro (log) en la pantalla que muestra el progreso.

Sabrás que ha terminado cuando veas un mensaje que dice **"Your service is live"**.

---

### Paso 7: Obtén tu URL y Conéctala a WhatsApp

Una vez que el despliegue haya terminado, Render te dará una URL pública en la parte superior de la página. Se verá algo así:

`https://nova-cloud-bot.onrender.com`

**¡Esta URL es la pieza final del rompecabezas!**

1. **Copia esta URL.**
2. Ve a tu **panel de desarrollador de Meta (Facebook for Developers)** donde configuraste tu número de WhatsApp.
3. Busca la sección de **"Webhook"**.
4. Pega tu URL de Render en el campo **"Callback URL"**.
5. En el campo **"Verify Token"**, escribe exactamente el token que pusimos en nuestro código: `NOVA_CLOUD_TOKEN`.
6. Guarda los cambios.

¡Y listo! A partir de ese momento, cada vez que alguien envíe un mensaje a tu número de WhatsApp, Meta lo enviará a tu servidor en Render, nuestro bot procesará el mensaje y (en la siguiente fase) le enviaremos la respuesta.

Has completado con éxito el despliegue del backend de tu chatbot. ¡Felicidades!
223 changes: 15 additions & 208 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,219 +1,26 @@
<p align="center">
<img src="assets/jules-readme.png" alt="Jules Awesome List" width="600">
</p>
# Proyecto: Chatbot para WhatsApp Business - Nova Cloud

<div align="center">
<h1>Awesome Jules Prompts 🌟</h1>
<p>Curated prompts for Jules, an async coding agent from Google Labs.</p>
<br>
<a href="https://jules.google.com">Visit Jules</a> •
<a href="#contributing">Contribute</a>
</div>
> **¡Tu bot está listo para ser desplegado!**
> Para poner tu chatbot en internet y conectarlo a WhatsApp, sigue la guía paso a paso que he preparado para ti:
> ### ➡️ [**Ver Instrucciones de Despliegue**](INSTRUCCIONES.md)

---

## Table of Contents
## Descripción General

- [Table of Contents](#table-of-contents)
- [Everyday Dev Tasks](#everyday-dev-tasks)
- [Debugging](#debugging)
- [Documentation](#documentation)
- [Testing](#testing)
- [Package Management](#package-management)
- [AI-Native Tasks](#ai-native-tasks)
- [Context](#context)
- [Fun \& Experimental](#fun--experimental)
- [Start from Scratch](#start-from-scratch)
- [Contributing](#contributing)
Este proyecto contiene el código fuente para un chatbot avanzado diseñado para operar en WhatsApp Business. El propósito del bot es actuar como el primer punto de contacto para los clientes de **Nova Cloud**, automatizando las conversaciones iniciales y demostrando la competencia y el enfoque de la empresa.

---

## Everyday Dev Tasks

- `// Refactor {a specific} file from {x} to {y}...`
<sub>General-purpose, applies to any language or repo.</sub>

- `// Add a test suite...`
<sub>Useful for repos lacking test coverage.</sub>

- `// Add type hints to {a specific} Python function...`
<sub>Python codebases transitioning to typed code.</sub>

- `// Generate mock data for {a specific} schema...`
<sub>APIs, frontends, or test-heavy environments.</sub>

- `// Convert these commonJS modules to ES modules...`
<sub>JS/TS projects modernizing legacy code.</sub>

- `// Turn this callback-based code into async/await...`
<sub>JavaScript or Python codebases improving async logic.</sub>

- `// Implement a data class for this dictionary structure...`
<sub>Useful for Python projects moving towards more structured data handling with `dataclasses` or Pydantic.</sub>



## Debugging

- `// Help me fix {a specific} error...`
<sub>For any repo where you're stuck on a runtime or build error.</sub>

- `// Why is {this specific snippet of code} slow?`
<sub>Performance profiling for loops, functions, or queries.</sub>

- `// Trace why this value is undefined...`
<sub>Frontend and backend JS/TS bugs.</sub>

- `// Diagnose this memory leak...`
<sub>Server-side apps or long-running processes.</sub>

- `// Add logging to help debug this issue...`
<sub>Useful when troubleshooting silent failures.</sub>

- `// Find race conditions in this async code`
<sub>Concurrent systems in JS, Python, Go, etc.</sub>

- `// Add print statements to trace the execution flow of this Python script...`
<sub>For debugging complex Python scripts or understanding unexpected behavior.</sub>


## Documentation

- `// Write a README for this project`
<sub>Any repo lacking a basic project overview.</sub>

- `// Add comments to this code`
<sub>Improves maintainability of complex logic.</sub>

- `// Write API docs for this endpoint`
<sub>REST or GraphQL backends.</sub>

- `// Generate Sphinx-style docstrings for this Python module/class/function...`
<sub>Ideal for Python projects using Sphinx for documentation generation.</sub>



## Testing

- `// Add integration tests for this API endpoint`
<sub>Express, FastAPI, Django, Flask apps.</sub>

- `// Write a test that mocks fetch`
<sub>Browser-side fetch or axios logic.</sub>

- `// Convert this test from Mocha to Jest`
<sub>JS test suite migrations.</sub>

- `// Generate property-based tests for this function`
<sub>Functional or logic-heavy code.</sub>

- `// Simulate slow network conditions in this test suite`
<sub>Web and mobile apps.</sub>

- `// Write a test to ensure backward compatibility for this function`
<sub>Library or SDK maintainers.</sub>

- `// Write a Pytest fixture to mock this external API call...`
<sub>For Python projects using Pytest and needing robust mocking for testing.</sub>



## Package Management

- `// Upgrade my linter and autofix breaking config changes`
<sub>JS/TS repos using ESLint or Prettier.</sub>

- `// Show me the changelog for React 19`
<sub>Web frontend apps using React.</sub>

- `// Which dependencies can I safely remove?`
<sub>Bloated or legacy codebases.</sub>

- `// Check if these packages are still maintained`
<sub>Security-conscious or long-term projects.</sub>

- `// Set up Renovate or Dependabot for auto-updates`
<sub>Best for active projects with CI/CD.</sub>



## AI-Native Tasks

- `// Analyze this repo and generate 3 feature ideas`
<sub>Vision-stage or greenfield products.</sub>

- `// Identify tech debt in this file`
<sub>Codebases with messy or fragile logic.</sub>

- `// Find duplicate logic across files`
<sub>Sprawling repos lacking DRY practices.</sub>

- `// Cluster related functions and suggest refactors`
<sub>Projects with lots of utils or helpers.</sub>

- `// Help me scope this issue so Jules can solve it`
<sub>For working with Jules on real issues.</sub>

- `// Convert this function into a reusable plugin/module`
<sub>Componentizing logic-heavy code.</sub>

- `// Refactor this Python function to be more amenable to parallel processing (e.g., using multiprocessing or threading)...`
<sub>For optimizing performance in computationally intensive Python applications.</sub>



## Context

- `// Write a status update based on recent commits`
<sub>Managerial and async communication.</sub>

- `// Summarize all changes in the last 7 days`
<sub>Catching up after time off.</sub>



## Fun & Experimental

- `// Add a confetti animation when {a specific} action succeeds`
<sub>Frontend web apps with user delight moments.</sub>

- `// Inject a developer joke when {a specific} build finishes`
<sub>Personal projects or team tools.</sub>

- `// Build a mini CLI game that runs in the terminal`
<sub>For learning or community fun.</sub>

- `// Add a dark mode Easter egg to this UI`
<sub>Design-heavy frontend projects.</sub>

- `// Turn this tool into a GitHub App`
<sub>Reusable, platform-integrated tools.</sub>

## Start from Scratch

- `// What's going on in this repo?`
<sub>Great for legacy repos or onboarding onto unfamiliar code.</sub>

- `// Initialize a new Express app with CORS enabled`
<sub>Web backend projects using Node.js and Express.</sub>

- `// Set up a monorepo using Turborepo and PNPM`
<sub>Multi-package JS/TS projects with shared dependencies.</sub>

- `// Bootstrap a Python project with Poetry and Pytest`
<sub>Python repos aiming for clean dependency and test setup.</sub>

- `// Create a starter template for a Chrome extension`
<sub>Browser extension development.</sub>

- `// I want to build a web scraper—start me off`
<sub>Data scraping or automation tools using Python/Node.</sub>
## Personalidad del Bot

El bot está diseñado para emular la personalidad de un **CEO acogedor, familiar y con una visión clara**. Su tono es profesional pero cercano, y está programado para ser un experto en múltiples disciplinas digitales. El objetivo es que cada interacción deje al cliente con la sensación de haber hablado con un líder competente y de confianza que entiende sus necesidades.

## Funcionalidades Clave (En Desarrollo)

## Contributing
* **Respuesta a Saludos y Consultas Comunes:** Maneja preguntas sobre precios, servicios y soporte.
* **Captura de Requisitos:** Realiza preguntas clave para entender las necesidades del cliente y poder ofrecer una solución a medida.
* **Integración con la API de WhatsApp:** Se conectará a través de un servidor web (webhook) para recibir y enviar mensajes en tiempo real.
* **Lógica de Conversación Avanzada:** Futuras versiones incorporarán un procesamiento de lenguaje más sofisticado para manejar conversaciones más complejas y naturales.

Your contributions are welcome! Add new prompts, fix formatting, or suggest categories.
## Estado Actual

- 📄 [Contributing Guide](contributing.md)
- 🪄 Open a [Pull Request](https://github.com/YOUR_REPO/pulls)
Actualmente, hemos desarrollado la lógica base del bot y un simulador de chat en la terminal. El siguiente paso es construir el servidor web con Flask para conectar el bot a la API de WhatsApp.
71 changes: 71 additions & 0 deletions bot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from flask import Flask, request
import logging

# --- Configuración del Logging ---
# Esto guardará los mensajes en un archivo llamado bot.log
logging.basicConfig(
filename='bot.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# ---------------------------------

# Creamos la aplicación Flask
app = Flask(__name__)

def get_bot_response(message: str) -> str:
"""
Este es el cerebro del bot. Recibe un mensaje y devuelve una respuesta.
"""
lower_message = message.lower()
if 'hola' in lower_message:
return "¡Hola! Gracias por contactar a Nova Cloud. ¿Cómo puedo ayudarte hoy?"
elif 'precio' in lower_message or 'costo' in lower_message or 'cotización' in lower_message:
return "¡Claro! Para darte una cotización precisa, ¿podrías contarme más sobre tu proyecto?"
elif 'ayuda' in lower_message or 'soporte' in lower_message:
return "Por supuesto. Nuestro equipo de soporte está listo para ayudarte. ¿Cuál es tu consulta?"
elif 'gracias' in lower_message:
return "¡De nada! Ha sido un placer ayudarte."
else:
return "No he entendido tu consulta. ¿Podrías reformularla?"

@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
"""
Este es el webhook que recibe los mensajes de WhatsApp.
"""
if request.method == 'GET':
if request.args.get("hub.verify_token") == "NOVA_CLOUD_TOKEN":
logging.info("Webhook verificado correctamente.")
return request.args.get("hub.challenge")
else:
logging.error("Error de autenticación en el webhook.")
return "Error de autenticación.", 403

if request.method == 'POST':
try:
body = request.json
logging.info(f"Datos recibidos de WhatsApp: {body}")

if body.get('entry') and body['entry'][0].get('changes') and \
body['entry'][0]['changes'][0].get('value') and \
body['entry'][0]['changes'][0]['value'].get('messages') and \
body['entry'][0]['changes'][0]['value']['messages'][0].get('text'):

user_message = body['entry'][0]['changes'][0]['value']['messages'][0]['text']['body']
logging.info(f"Mensaje del usuario: '{user_message}'")

bot_response = get_bot_response(user_message)
logging.info(f"Respuesta del bot: '{bot_response}'")

except Exception as e:
logging.error(f"Error procesando el mensaje: {e}", exc_info=True)
pass

return "OK", 200

if __name__ == "__main__":
# El servidor se ejecutará en el puerto que la plataforma de hosting asigne,
# o en el 5000 si se ejecuta localmente.
# Escuchar en 0.0.0.0 hace que sea accesible desde fuera del contenedor.
app.run(host='0.0.0.0', port=5000)
Loading