Files
whatsappNucleo/README.md
josedario87 0edec1e975
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m10s
Docs: Documentar API REST con endpoints de API Key
- Agregar tabla resumen de endpoints disponibles
- Documentar endpoint principal POST /api/messages/send
- Documentar GET /api/messages/:instanceId/chats para listar contactos
- Documentar GET /api/messages/:instanceId/:chatId con paginación
- Documentar POST /api/messages/:instanceId/react para reacciones
- Eliminar documentación de endpoints OAuth (solo interfaz web)
2025-12-04 16:22:04 -06:00

328 lines
8.1 KiB
Markdown

# WhatsApp Nucleo
Sistema de gestión centralizada de múltiples instancias de WhatsApp para Nucleo V3.
## MCP Server para Claude Code
Agregar el MCP a tu proyecto (usa tu NUXT_MASTER_API_KEY):
```bash
claude mcp add --transport http whatsapp https://whatsapp.nucleoriofrio.com/api/mcp --header "Authorization: Bearer <NUXT_MASTER_API_KEY>"
```
---
## Setup
```bash
npm install
```
## Development
```bash
npm run dev
```
## Production
```bash
npm run build
node .output/server/index.mjs
```
---
## API REST
### Autenticación
**API Externa (servicios, bots, agentes):**
```
Authorization: Bearer <NUXT_MASTER_API_KEY>
```
### Resumen de Endpoints
| Endpoint | Descripción |
|----------|-------------|
| `POST /api/messages/send` | **Enviar mensaje de texto** |
| `GET /api/instances` | Listar instancias |
| `GET /api/messages/:instanceId/chats` | Listar chats/contactos |
| `GET /api/messages/:instanceId/:chatId` | Obtener mensajes de un chat |
| `POST /api/messages/:instanceId/react` | Reaccionar a un mensaje |
### Instancias
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| GET | `/api/instances` | Listar todas las instancias |
| POST | `/api/instances` | Crear nueva instancia |
| GET | `/api/instances/:id` | Obtener detalles de instancia |
| GET | `/api/instances/:id/qr` | Obtener código QR |
| POST | `/api/instances/:id/connect` | Conectar instancia |
| POST | `/api/instances/:id/disconnect` | Desconectar instancia |
| DELETE | `/api/instances/:id` | Eliminar instancia |
**Ejemplo - Listar instancias:**
```bash
curl -X GET "https://whatsapp.nucleoriofrio.com/api/instances" \
-H "Authorization: Bearer <API_KEY>"
```
**Ejemplo - Crear instancia:**
```bash
curl -X POST "https://whatsapp.nucleoriofrio.com/api/instances" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"name": "Mi WhatsApp"}'
```
### Obtener Lista de Chats/Contactos
```
GET /api/messages/:instanceId/chats
```
Retorna todos los chats (contactos individuales y grupos) de una instancia, ordenados por última actividad.
**Ejemplo:**
```bash
curl -X GET "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/chats" \
-H "Authorization: Bearer <API_KEY>"
```
**Respuesta:**
```json
[
{
"id": "chat_abc123",
"jid": "5491155551234@s.whatsapp.net",
"name": "Juan Pérez",
"isGroup": false,
"unreadCount": 2,
"lastMessageAt": "2025-01-15T10:30:00Z",
"lastMessage": "Hola, ¿cómo estás?",
"lastMessageType": "text"
},
{
"id": "chat_xyz789",
"jid": "120363123456789012@g.us",
"name": "Grupo de Trabajo",
"isGroup": true,
"unreadCount": 0,
"lastMessageAt": "2025-01-15T09:00:00Z",
"lastMessage": "Reunión a las 3pm",
"lastMessageType": "text"
}
]
```
**Campos de respuesta:**
| Campo | Tipo | Descripción |
|-------|------|-------------|
| `id` | string | ID interno del chat (usar en otros endpoints) |
| `jid` | string | JID de WhatsApp del contacto/grupo |
| `name` | string | Nombre del contacto o grupo |
| `isGroup` | boolean | `true` si es un grupo |
| `unreadCount` | number | Cantidad de mensajes no leídos |
| `lastMessageAt` | string | Fecha ISO del último mensaje |
| `lastMessage` | string | Contenido del último mensaje |
| `lastMessageType` | string | Tipo del último mensaje |
---
### Obtener Mensajes de un Chat
```
GET /api/messages/:instanceId/:chatId
```
Obtiene los mensajes de un chat con soporte para paginación.
**Parámetros de Query:**
| Parámetro | Tipo | Default | Descripción |
|-----------|------|---------|-------------|
| `limit` | number | 50 | Cantidad de mensajes (máx: 100) |
| `offset` | number | 0 | Saltar N mensajes |
| `before` | string | - | Timestamp ISO para scroll infinito |
**Ejemplo - Obtener últimos 50 mensajes:**
```bash
curl -X GET "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/{chatId}" \
-H "Authorization: Bearer <API_KEY>"
```
**Ejemplo - Paginación con limit/offset:**
```bash
curl -X GET "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/{chatId}?limit=20&offset=40" \
-H "Authorization: Bearer <API_KEY>"
```
**Ejemplo - Scroll infinito (mensajes antes de fecha):**
```bash
curl -X GET "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/{chatId}?limit=20&before=2025-01-15T10:00:00Z" \
-H "Authorization: Bearer <API_KEY>"
```
**Respuesta:**
```json
[
{
"id": "msg_123",
"messageId": "3EB0A1B2C3D4E5F6",
"chatId": "chat_abc123",
"fromJid": "5491155551234@s.whatsapp.net",
"fromMe": false,
"type": "text",
"content": "Hola, ¿cómo estás?",
"caption": null,
"media": null,
"timestamp": "2025-01-15T10:30:00Z",
"status": "read",
"pushName": "Juan",
"isGroup": false
},
{
"id": "msg_124",
"messageId": "3EB0A1B2C3D4E5F7",
"chatId": "chat_abc123",
"fromJid": "me",
"fromMe": true,
"type": "image",
"content": null,
"caption": "Mira esta foto",
"media": {
"mimetype": "image/jpeg",
"filesize": 245000,
"width": 1920,
"height": 1080,
"thumbnail": "base64..."
},
"timestamp": "2025-01-15T10:31:00Z",
"status": "delivered",
"isGroup": false
}
]
```
**Campos de respuesta por tipo:**
| Campo | Descripción |
|-------|-------------|
| `messageId` | ID de WhatsApp (usar para reaccionar o citar) |
| `fromMe` | `true` si lo envié yo |
| `type` | text, image, video, audio, document, sticker, contact, location, poll, event |
| `content` | Texto del mensaje |
| `caption` | Caption de media |
| `media` | Info de archivo (mimetype, filesize, thumbnail, etc.) |
| `poll` | Datos de encuesta (name, options, selectableCount) |
| `event` | Datos de evento (name, startDate, location) |
| `quoted` | Mensaje citado (id, content, type) |
| `pushName` | Nombre del remitente |
| `participant` | JID del participante (en grupos) |
---
### Enviar Mensajes
```
POST /api/messages/send
```
**Este es el endpoint principal para enviar mensajes desde servicios externos.** Solo requiere el número de teléfono, no necesitas buscar el chatId previamente.
**Parámetros:**
| Campo | Requerido | Descripción |
|-------|-----------|-------------|
| `instanceId` | Sí | ID de la instancia de WhatsApp |
| `to` | Sí | Número de teléfono (con o sin código país) |
| `message` | Sí | Texto del mensaje |
**Ejemplo:**
```bash
curl -X POST "https://whatsapp.nucleoriofrio.com/api/messages/send" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"instanceId": "4b57e897-f29b-4562-bd41-9a6fa32d584b",
"to": "5491155551234",
"message": "Hola! Este es un mensaje de texto"
}'
```
**Respuesta:**
```json
{
"success": true,
"messageId": "3EB06791F557866FDA1823",
"to": "5491155551234@s.whatsapp.net"
}
```
> **Nota:** El número se formatea automáticamente a JID. Puedes enviar `5491155551234` o `+54 9 11 5555-1234`, ambos funcionan.
---
### Reaccionar a Mensajes
```
POST /api/messages/:instanceId/react
```
Envía una reacción (emoji) a un mensaje existente.
**Body:**
```json
{
"messageId": "3EB0A1B2C3D4E5F6",
"emoji": "👍"
}
```
**Ejemplo - Agregar reacción:**
```bash
curl -X POST "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/react" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"messageId": "3EB0A1B2C3D4E5F6", "emoji": "👍"}'
```
**Ejemplo - Quitar reacción:**
```bash
curl -X POST "https://whatsapp.nucleoriofrio.com/api/messages/{instanceId}/react" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"messageId": "3EB0A1B2C3D4E5F6", "emoji": ""}'
```
**Emojis comunes:**
| Emoji | Significado |
|-------|-------------|
| 👍 | Me gusta |
| ❤️ | Amor |
| 😂 | Risa |
| 😮 | Sorpresa |
| 😢 | Tristeza |
| 🙏 | Gracias |
**Respuesta:**
```json
{
"success": true,
"messageId": "3EB0A1B2C3D4E5F6",
"emoji": "👍"
}
```
> **Nota:** El `messageId` se obtiene de la respuesta al obtener mensajes (`GET /api/messages/:instanceId/:chatId`)
---
## Stack
- **Frontend:** Nuxt 3, Vue 3, Nuxt UI, TailwindCSS
- **Backend:** Nitro, PostgreSQL
- **WhatsApp:** Baileys v6.7.9
- **Auth:** Authentik + Traefik