n8n-nodes-whatsapp-message 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +19 -0
- package/README.md +458 -0
- package/dist/credentials/WhatsappMessageApi.credentials.d.ts +14 -0
- package/dist/credentials/WhatsappMessageApi.credentials.js +77 -0
- package/dist/credentials/WhatsappMessageApi.credentials.js.map +1 -0
- package/dist/nodes/Whatsapp/WhatsappMessage.node.d.ts +5 -0
- package/dist/nodes/Whatsapp/WhatsappMessage.node.js +1049 -0
- package/dist/nodes/Whatsapp/WhatsappMessage.node.js.map +1 -0
- package/dist/nodes/Whatsapp/WhatsappMessage2.svg +6 -0
- package/dist/nodes/Whatsapp/icons/WhatsappMessage2.svg +6 -0
- package/package.json +60 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright 2022 n8n
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
8
|
+
so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# n8n-nodes-whatsapp-message
|
|
2
|
+
|
|
3
|
+
Un nodo personalizado para n8n que permite enviar mensajes por WhatsApp utilizando la API de WhatsApp Business con soporte completo para mensajes interactivos, detección de cierre de conversación y mensajes de espera automáticos.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- **Mensajes de texto** simples o con imágenes
|
|
8
|
+
- **Listas interactivas** (hasta 10 opciones con descripciones)
|
|
9
|
+
- **Botones interactivos** (hasta 3 botones de respuesta)
|
|
10
|
+
- **Botones Call-to-Action (CTA)** con URLs externas
|
|
11
|
+
- **Soporte para imágenes** en todos los tipos de mensaje
|
|
12
|
+
- **Headers personalizables** (texto o imagen con URL)
|
|
13
|
+
- **Footers opcionales** para contexto adicional
|
|
14
|
+
- **Detección automática de cierre** de conversación
|
|
15
|
+
- **Dos outputs** (Continue/Close) para flujos condicionales
|
|
16
|
+
- **Mensajes de espera automáticos** mientras se procesan tareas largas
|
|
17
|
+
- **Procesamiento de webhooks** para respuestas de usuarios
|
|
18
|
+
- Soporte para números internacionales
|
|
19
|
+
- Reintentos automáticos configurables
|
|
20
|
+
- Integración completa con n8n
|
|
21
|
+
|
|
22
|
+
## Instalación
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install n8n-nodes-whatsapp-message
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
O en n8n, ve a **Settings > Community Nodes** y busca `n8n-nodes-whatsapp-message`.
|
|
29
|
+
|
|
30
|
+
## Configuración
|
|
31
|
+
|
|
32
|
+
### Requisitos previos
|
|
33
|
+
|
|
34
|
+
1. Una cuenta de **WhatsApp Business API**
|
|
35
|
+
2. Tu **Phone Number ID**
|
|
36
|
+
3. Un **Access Token** válido de Meta/Facebook
|
|
37
|
+
4. Tu número de WhatsApp debe estar verificado y activo
|
|
38
|
+
|
|
39
|
+
### Pasos de configuración
|
|
40
|
+
|
|
41
|
+
1. En n8n, abre tu workflow
|
|
42
|
+
2. Agrega el nodo **WhatsApp Message**
|
|
43
|
+
3. Haz clic en **Credentials** y selecciona **Create New Credentials**
|
|
44
|
+
4. Completa los campos:
|
|
45
|
+
- **Phone Number ID**: El ID del número de teléfono de WhatsApp Business
|
|
46
|
+
- **Access Token**: Tu token de acceso (obtenido de Meta/Facebook)
|
|
47
|
+
- **API Version**: Selecciona la versión (por defecto v22.0)
|
|
48
|
+
|
|
49
|
+
## Tipos de mensajes
|
|
50
|
+
|
|
51
|
+
### 1. Mensaje de texto
|
|
52
|
+
|
|
53
|
+
Envía mensajes de texto simples o con imágenes adjuntas.
|
|
54
|
+
|
|
55
|
+
**Parámetros:**
|
|
56
|
+
- **Message**: El texto del mensaje
|
|
57
|
+
- **Include Image**: Opción para agregar una imagen
|
|
58
|
+
- **Image URL**: URL de la imagen (formato: https://...)
|
|
59
|
+
- **Caption**: Texto que acompaña la imagen
|
|
60
|
+
|
|
61
|
+
**Ejemplo:**
|
|
62
|
+
```
|
|
63
|
+
Message Type: Text
|
|
64
|
+
Message: "¡Hola! Tenemos una promoción especial para ti"
|
|
65
|
+
Include Image: ✓
|
|
66
|
+
Image URL: https://mipanederia.com/promo.jpg
|
|
67
|
+
Caption: "20% de descuento en pan integral"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. Lista interactiva
|
|
71
|
+
|
|
72
|
+
Crea menús con hasta 10 opciones que incluyen título, ID y descripción opcional.
|
|
73
|
+
**Nota importante sobre imágenes en listas:**
|
|
74
|
+
Debido a una limitación de la API de WhatsApp, cuando usas "Header Type: Image" en listas, la imagen se envía como un mensaje separado (0.3 segundos antes de la lista). Esto es automático y transparente - el usuario verá la imagen seguida inmediatamente de la lista. Este comportamiento solo ocurre en listas; los botones y CTA envían imágenes directamente en el header sin problema.
|
|
75
|
+
|
|
76
|
+
**Parámetros:**
|
|
77
|
+
- **Body Text**: Texto principal del mensaje
|
|
78
|
+
- **Button Text**: Texto del botón que abre la lista
|
|
79
|
+
- **Header Type**: None, Text o Image
|
|
80
|
+
- **Footer**: Texto opcional al final
|
|
81
|
+
- **Options**: Una opción por línea en formato: `Título|id|descripción|close`
|
|
82
|
+
|
|
83
|
+
**Formato de opciones:**
|
|
84
|
+
```
|
|
85
|
+
Pizza Margarita|pizza_mg|Queso mozzarella y albahaca
|
|
86
|
+
Pasta Carbonara|pasta_cb|Receta italiana tradicional
|
|
87
|
+
Ensalada César|ensalada_cs|Lechuga fresca con aderezo
|
|
88
|
+
Salir|exit_id|Cerrar el pedido|true
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Ejemplo completo:**
|
|
92
|
+
```
|
|
93
|
+
Message Type: Interactive List
|
|
94
|
+
Body Text: "¿Qué te gustaría ordenar hoy?"
|
|
95
|
+
Button Text: "Ver menú completo"
|
|
96
|
+
Header Type: Image
|
|
97
|
+
Header Image URL: https://restaurante.com/logo.jpg
|
|
98
|
+
Footer: "Delivery gratis en órdenes mayores a $50"
|
|
99
|
+
Options:
|
|
100
|
+
Desayuno completo|desayuno|Huevos, pan y café
|
|
101
|
+
Almuerzo ejecutivo|almuerzo|Sopa, plato fuerte y jugo
|
|
102
|
+
Cena especial|cena|Proteína, acompañamiento
|
|
103
|
+
No tengo hambre|salir|Cerrar conversación|true
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 3. Botones interactivos
|
|
107
|
+
|
|
108
|
+
Crea hasta 3 botones de respuesta rápida.
|
|
109
|
+
|
|
110
|
+
**Parámetros:**
|
|
111
|
+
- **Body Text**: Texto principal del mensaje
|
|
112
|
+
- **Header Type**: None, Text o Image
|
|
113
|
+
- **Footer**: Texto opcional al final
|
|
114
|
+
- **Buttons**: Un botón por línea en formato: `Texto del botón|button_id|close`
|
|
115
|
+
|
|
116
|
+
**Formato de botones:**
|
|
117
|
+
```
|
|
118
|
+
Sí, me interesa|yes_btn
|
|
119
|
+
No gracias|no_btn|true
|
|
120
|
+
Más información|info_btn
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Ejemplo completo:**
|
|
124
|
+
```
|
|
125
|
+
Message Type: Interactive Buttons
|
|
126
|
+
Body Text: "¿Te gustaría recibir nuestro catálogo de productos por email?"
|
|
127
|
+
Header Type: Text
|
|
128
|
+
Header Text: "Catálogo Digital 2025"
|
|
129
|
+
Footer: "Sin costo ni compromiso"
|
|
130
|
+
Buttons:
|
|
131
|
+
Sí, envíalo|send_catalog
|
|
132
|
+
No gracias|no_catalog|true
|
|
133
|
+
Ver muestra|preview_catalog
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 4. Call to Action (CTA)
|
|
137
|
+
|
|
138
|
+
Crea botones que redirigen a URLs externas (solo 1 botón por mensaje).
|
|
139
|
+
|
|
140
|
+
**Parámetros:**
|
|
141
|
+
- **Body Text**: Texto principal del mensaje
|
|
142
|
+
- **Header Type**: None, Text o Image
|
|
143
|
+
- **Footer**: Texto opcional al final
|
|
144
|
+
- **Action Buttons**: Formato: `Texto del botón|url|https://ejemplo.com`
|
|
145
|
+
|
|
146
|
+
**Ejemplo:**
|
|
147
|
+
```
|
|
148
|
+
Message Type: Call to Action
|
|
149
|
+
Body Text: "Visita nuestra tienda online para ver todos nuestros productos"
|
|
150
|
+
Header Type: Image
|
|
151
|
+
Header Image URL: https://tienda.com/banner.jpg
|
|
152
|
+
Footer: "Envío gratis en tu primera compra"
|
|
153
|
+
Action Buttons: Ir a la tienda|url|https://tienda.com/productos
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Sistema de outputs (Continue/Close)
|
|
157
|
+
|
|
158
|
+
El nodo tiene **dos salidas** para crear flujos conversacionales inteligentes:
|
|
159
|
+
|
|
160
|
+
### Output 1: Continue
|
|
161
|
+
Se activa cuando:
|
|
162
|
+
- El usuario selecciona una opción normal (sin marcar como `close`)
|
|
163
|
+
- Se envía un mensaje exitosamente
|
|
164
|
+
- El flujo debe continuar
|
|
165
|
+
|
|
166
|
+
### Output 2: Close
|
|
167
|
+
Se activa cuando:
|
|
168
|
+
- El usuario selecciona una opción marcada como cierre (`|true` al final)
|
|
169
|
+
- El ID de la opción está en la lista de **Close Option IDs**
|
|
170
|
+
- Se debe terminar la conversación
|
|
171
|
+
|
|
172
|
+
### Configuración de detección de cierre
|
|
173
|
+
|
|
174
|
+
**Parámetros:**
|
|
175
|
+
- **Enable Close Detection**: Activa la detección automática
|
|
176
|
+
- **Close Option IDs**: IDs separados por comas (ej: `exit_id,salir_id,no_thanks`)
|
|
177
|
+
- **Goodbye Message**: Mensaje automático que se envía al cerrar
|
|
178
|
+
|
|
179
|
+
**Ejemplo de configuración:**
|
|
180
|
+
```
|
|
181
|
+
Enable Close Detection: ✓ Activado
|
|
182
|
+
Close Option IDs: salir,exit,no_gracias,cerrar
|
|
183
|
+
Goodbye Message: "Gracias por contactarnos. ¡Hasta pronto!"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Ejemplo de workflow con outputs
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
[Webhook Trigger]
|
|
190
|
+
↓
|
|
191
|
+
[WhatsApp Message - Lista interactiva]
|
|
192
|
+
↓
|
|
193
|
+
├─→ Continue Output → [Procesar pedido] → [Confirmar orden]
|
|
194
|
+
└─→ Close Output → [Registro de abandono] → [Fin]
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Mensajes de espera automáticos
|
|
198
|
+
|
|
199
|
+
Mantén a tus usuarios informados durante procesos largos con mensajes automáticos.
|
|
200
|
+
|
|
201
|
+
**Parámetros:**
|
|
202
|
+
- **Send Waiting Messages**: Activa los mensajes automáticos
|
|
203
|
+
- **Wait Time Before First Check**: Segundos antes del primer mensaje (5-600)
|
|
204
|
+
- **Interval Between Messages**: Intervalo entre mensajes (10-300 segundos)
|
|
205
|
+
- **Waiting Messages**: Mensajes que se alternarán (uno por línea)
|
|
206
|
+
- **Max Messages**: Cantidad máxima de mensajes automáticos (1-20)
|
|
207
|
+
|
|
208
|
+
**Ejemplo:**
|
|
209
|
+
```
|
|
210
|
+
Send Waiting Messages: ✓ Activado
|
|
211
|
+
Wait Time Before First Check: 30
|
|
212
|
+
Interval Between Messages: 45
|
|
213
|
+
Waiting Messages:
|
|
214
|
+
¿Sigues ahí? Aún estoy procesando tu solicitud
|
|
215
|
+
Todavía trabajando en ello... gracias por esperar
|
|
216
|
+
Casi listo, un momento más por favor
|
|
217
|
+
Max Messages: 5
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Caso de uso típico:**
|
|
221
|
+
1. Usuario solicita un reporte complejo
|
|
222
|
+
2. Envías mensaje: "Generando tu reporte, esto puede tomar unos minutos..."
|
|
223
|
+
3. El sistema envía mensajes de espera mientras procesa
|
|
224
|
+
4. Finalmente envías: "¡Listo! Aquí está tu reporte"
|
|
225
|
+
|
|
226
|
+
## Procesamiento de webhooks
|
|
227
|
+
|
|
228
|
+
El nodo puede procesar webhooks de WhatsApp para capturar respuestas de usuarios.
|
|
229
|
+
|
|
230
|
+
**Detección automática:**
|
|
231
|
+
- El nodo detecta si el input es un webhook de WhatsApp
|
|
232
|
+
- Extrae automáticamente el número del remitente
|
|
233
|
+
- Identifica el ID de la opción seleccionada (en botones/listas)
|
|
234
|
+
- Aplica la lógica de cierre si corresponde
|
|
235
|
+
|
|
236
|
+
**Datos extraídos del webhook:**
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"selectedId": "pizza_id",
|
|
240
|
+
"isCloseAction": false,
|
|
241
|
+
"webhookProcessed": true,
|
|
242
|
+
"recipient": "+573001234567"
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Configuración avanzada
|
|
247
|
+
|
|
248
|
+
### Reintentos y tiempos de espera
|
|
249
|
+
|
|
250
|
+
**Parámetros:**
|
|
251
|
+
- **Number of Tries**: Cantidad de intentos de envío (1-10)
|
|
252
|
+
- **Message Wait Time**: Segundos de espera entre reintentos (0-60)
|
|
253
|
+
|
|
254
|
+
**Ejemplo:**
|
|
255
|
+
```
|
|
256
|
+
Number of Tries: 3
|
|
257
|
+
Message Wait Time: 5
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Si el primer intento falla, esperará 5 segundos e intentará nuevamente, hasta 3 veces.
|
|
261
|
+
|
|
262
|
+
## Ejemplos de workflows completos
|
|
263
|
+
|
|
264
|
+
### Ejemplo 1: Menú de panadería con seguimiento
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
[Webhook Trigger - WhatsApp]
|
|
268
|
+
↓
|
|
269
|
+
[WhatsApp Message Node]
|
|
270
|
+
Message Type: Interactive List
|
|
271
|
+
Body Text: "¡Bienvenido a Panadería Artesanal! ¿Qué te gustaría ordenar?"
|
|
272
|
+
Button Text: "Ver productos"
|
|
273
|
+
Options:
|
|
274
|
+
Pan integral|pan_int|Recién horneado, $3
|
|
275
|
+
Croissant francés|croissant|Mantequilla premium, $2.5
|
|
276
|
+
Torta de chocolate|torta_choc|Porción grande, $4
|
|
277
|
+
Ver promociones|promos|Ofertas del día
|
|
278
|
+
Cancelar pedido|cancelar|Cerrar conversación|true
|
|
279
|
+
↓
|
|
280
|
+
├─→ Continue → [IF Node - Verificar opción]
|
|
281
|
+
│ ↓
|
|
282
|
+
│ [Procesar pedido específico]
|
|
283
|
+
│ ↓
|
|
284
|
+
│ [Confirmar con botones]
|
|
285
|
+
│ ↓
|
|
286
|
+
│ [WhatsApp Message - Confirmación]
|
|
287
|
+
│
|
|
288
|
+
└─→ Close → [Guardar en DB como "Abandonado"]
|
|
289
|
+
↓
|
|
290
|
+
[Fin del workflow]
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Ejemplo 2: Generación de reporte con espera
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
[Webhook Trigger]
|
|
297
|
+
↓
|
|
298
|
+
[WhatsApp Message - Confirmación]
|
|
299
|
+
Message Type: Text
|
|
300
|
+
Message: "Iniciando generación de reporte. Esto puede tomar 2-3 minutos..."
|
|
301
|
+
Send Waiting Messages: ✓
|
|
302
|
+
Wait Time: 30 segundos
|
|
303
|
+
Interval: 45 segundos
|
|
304
|
+
Waiting Messages:
|
|
305
|
+
Procesando datos... por favor espera
|
|
306
|
+
Casi listo... gracias por tu paciencia
|
|
307
|
+
Max Messages: 4
|
|
308
|
+
↓
|
|
309
|
+
[HTTP Request - API externa - Generar reporte]
|
|
310
|
+
↓
|
|
311
|
+
[Code Node - Procesar datos]
|
|
312
|
+
↓
|
|
313
|
+
[WhatsApp Message - Envío de resultado]
|
|
314
|
+
Message Type: Text
|
|
315
|
+
Include Image: ✓
|
|
316
|
+
Message: "¡Reporte generado exitosamente!"
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Ejemplo 3: Sistema de atención con CTA
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
[Webhook Trigger]
|
|
323
|
+
↓
|
|
324
|
+
[WhatsApp Message - Saludo]
|
|
325
|
+
Message Type: Interactive Buttons
|
|
326
|
+
Body: "¿Cómo podemos ayudarte hoy?"
|
|
327
|
+
Buttons:
|
|
328
|
+
Hacer un pedido|order
|
|
329
|
+
Rastrear envío|track
|
|
330
|
+
Atención al cliente|support
|
|
331
|
+
↓
|
|
332
|
+
[Switch Node - Basado en selectedId]
|
|
333
|
+
↓
|
|
334
|
+
├─→ Case 'support' → [WhatsApp Message - CTA]
|
|
335
|
+
│ Message Type: Call to Action
|
|
336
|
+
│ Body: "Puedes chatear con nuestro equipo"
|
|
337
|
+
│ Action: Abrir chat|url|https://wa.me/573001234567
|
|
338
|
+
│
|
|
339
|
+
├─→ Case 'track' → [HTTP Request - API rastreo]
|
|
340
|
+
│
|
|
341
|
+
└─→ Case 'order' → [WhatsApp Message - Lista de productos]
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Solución de problemas
|
|
345
|
+
|
|
346
|
+
### El mensaje no se envía
|
|
347
|
+
|
|
348
|
+
**Verifica las credenciales:**
|
|
349
|
+
- Access Token válido y no expirado
|
|
350
|
+
- Phone Number ID correcto
|
|
351
|
+
- Permisos correctos en la app de Meta
|
|
352
|
+
|
|
353
|
+
**Formato del número:**
|
|
354
|
+
- Debe incluir `+` y código de país: `+573001234567`
|
|
355
|
+
- Sin espacios ni guiones
|
|
356
|
+
- Entre 10-15 dígitos después del `+`
|
|
357
|
+
|
|
358
|
+
**Créditos y límites:**
|
|
359
|
+
- Verifica que tengas créditos en tu cuenta de Meta
|
|
360
|
+
- Revisa los límites de envío diarios
|
|
361
|
+
- Confirma que el número esté verificado
|
|
362
|
+
|
|
363
|
+
### Error de autenticación (403)
|
|
364
|
+
|
|
365
|
+
- Regenera tu Access Token en Meta/Facebook
|
|
366
|
+
- Verifica que el token tenga los permisos: `whatsapp_business_messaging`
|
|
367
|
+
- Confirma que la app esté en modo producción
|
|
368
|
+
- Asegúrate de usar la API version correcta
|
|
369
|
+
|
|
370
|
+
### Las imágenes no se muestran
|
|
371
|
+
|
|
372
|
+
- La URL debe ser accesible públicamente (no localhost)
|
|
373
|
+
- La URL debe comenzar con `https://` (no `http://`)
|
|
374
|
+
- Formatos soportados: JPG, PNG, GIF, WEBP
|
|
375
|
+
- Tamaño máximo recomendado: 5MB
|
|
376
|
+
|
|
377
|
+
### Los mensajes de espera no funcionan
|
|
378
|
+
|
|
379
|
+
- `Send Waiting Messages` debe estar activado
|
|
380
|
+
- `Wait Time Before First Check` mínimo 5 segundos
|
|
381
|
+
- `Interval Between Messages` mínimo 10 segundos
|
|
382
|
+
- Verifica que haya al menos un mensaje en `Waiting Messages`
|
|
383
|
+
- `Max Messages` debe estar entre 1-20
|
|
384
|
+
|
|
385
|
+
### El output Close no se activa
|
|
386
|
+
|
|
387
|
+
- `Enable Close Detection` debe estar activado
|
|
388
|
+
- El ID de la opción debe estar en `Close Option IDs`
|
|
389
|
+
- O la opción debe terminar con `|true` en la configuración
|
|
390
|
+
- Verifica que el webhook esté enviando el `selectedId` correctamente
|
|
391
|
+
|
|
392
|
+
### Problemas con listas o botones
|
|
393
|
+
|
|
394
|
+
- **Listas**: Máximo 10 opciones
|
|
395
|
+
- **Botones**: Máximo 3 botones
|
|
396
|
+
- **CTA**: Solo 1 botón por mensaje
|
|
397
|
+
- Formato correcto: `Título|id|descripción|close`
|
|
398
|
+
- Los títulos de botones máximo 20 caracteres
|
|
399
|
+
- Los títulos de opciones de lista máximo 24 caracteres
|
|
400
|
+
|
|
401
|
+
## Limitaciones de la API de WhatsApp
|
|
402
|
+
|
|
403
|
+
- Máximo 3 botones interactivos por mensaje
|
|
404
|
+
- Máximo 10 opciones en listas interactivas
|
|
405
|
+
- Máximo 1 botón CTA por mensaje
|
|
406
|
+
- Los títulos de botones no pueden exceder 20 caracteres
|
|
407
|
+
- Los headers de imagen deben ser URLs públicas
|
|
408
|
+
- No se puede enviar Base64 directamente (solo URLs)
|
|
409
|
+
-Las imágenes en headers de listas se envían como mensaje separado (workaround automático para bug de WhatsApp API)
|
|
410
|
+
|
|
411
|
+
## Desarrollo
|
|
412
|
+
|
|
413
|
+
### Compilar el proyecto
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
npm run build
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Ejecutar lint
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
npm run lint
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Modo desarrollo
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
npm run dev
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## Contribuir
|
|
432
|
+
|
|
433
|
+
Las contribuciones son bienvenidas. Por favor:
|
|
434
|
+
|
|
435
|
+
1. Haz fork del repositorio
|
|
436
|
+
2. Crea una rama para tu feature (`git checkout -b feature/amazing-feature`)
|
|
437
|
+
3. Commit tus cambios (`git commit -m 'Add amazing feature'`)
|
|
438
|
+
4. Push a la rama (`git push origin feature/amazing-feature`)
|
|
439
|
+
5. Abre un Pull Request
|
|
440
|
+
|
|
441
|
+
## Recursos adicionales
|
|
442
|
+
|
|
443
|
+
- [Documentación oficial de WhatsApp Business API](https://developers.facebook.com/docs/whatsapp)
|
|
444
|
+
- [n8n Documentation](https://docs.n8n.io/)
|
|
445
|
+
- [Crear credenciales de WhatsApp Business](https://developers.facebook.com/docs/whatsapp/business-management-api/get-started)
|
|
446
|
+
- [Mensajes interactivos de WhatsApp](https://developers.facebook.com/docs/whatsapp/guides/interactive-messages)
|
|
447
|
+
|
|
448
|
+
## Soporte
|
|
449
|
+
|
|
450
|
+
Para reportar bugs o solicitar features:
|
|
451
|
+
- [Abre un issue en GitHub](https://github.com/MayoB20/n8n-nodes-whatsapp-message/issues)
|
|
452
|
+
- Email: maryurialonso11@gmail.com
|
|
453
|
+
|
|
454
|
+
## Licencia
|
|
455
|
+
|
|
456
|
+
MIT © 2025 Maryuri
|
|
457
|
+
|
|
458
|
+
---
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ICredentialType, INodeProperties, IAuthenticateGeneric, ICredentialTestRequest } from 'n8n-workflow';
|
|
2
|
+
export declare class WhatsappMessageApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
documentationUrl: string;
|
|
6
|
+
icon: {
|
|
7
|
+
readonly light: "file:WhatsappMessage.svg";
|
|
8
|
+
readonly dark: "file:WhatsappMessage.svg";
|
|
9
|
+
};
|
|
10
|
+
properties: INodeProperties[];
|
|
11
|
+
authenticate: IAuthenticateGeneric;
|
|
12
|
+
test: ICredentialTestRequest;
|
|
13
|
+
}
|
|
14
|
+
export default WhatsappMessageApi;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WhatsappMessageApi = void 0;
|
|
4
|
+
class WhatsappMessageApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'whatsAppBusinessApi';
|
|
7
|
+
this.displayName = 'WhatsApp Business API';
|
|
8
|
+
this.documentationUrl = 'https://developers.facebook.com/docs/whatsapp';
|
|
9
|
+
this.icon = {
|
|
10
|
+
light: 'file:WhatsappMessage.svg',
|
|
11
|
+
dark: 'file:WhatsappMessage.svg',
|
|
12
|
+
};
|
|
13
|
+
this.properties = [
|
|
14
|
+
{
|
|
15
|
+
displayName: 'WABA ID',
|
|
16
|
+
name: 'wabaId',
|
|
17
|
+
type: 'string',
|
|
18
|
+
default: '',
|
|
19
|
+
required: true,
|
|
20
|
+
description: 'ID de tu cuenta WhatsApp Business',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
displayName: 'Phone Number ID',
|
|
24
|
+
name: 'phoneNumberId',
|
|
25
|
+
type: 'string',
|
|
26
|
+
default: '',
|
|
27
|
+
required: true,
|
|
28
|
+
description: 'ID del número de teléfono de WhatsApp',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
displayName: 'Access Token',
|
|
32
|
+
name: 'accessToken',
|
|
33
|
+
type: 'string',
|
|
34
|
+
typeOptions: {
|
|
35
|
+
password: true,
|
|
36
|
+
},
|
|
37
|
+
default: '',
|
|
38
|
+
required: true,
|
|
39
|
+
description: 'Token de acceso de tu aplicación de WhatsApp Business',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
displayName: 'API Version',
|
|
43
|
+
name: 'version_api',
|
|
44
|
+
type: 'options',
|
|
45
|
+
options: [
|
|
46
|
+
{
|
|
47
|
+
name: 'v22.0',
|
|
48
|
+
value: 'v22.0',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'v19.0',
|
|
52
|
+
value: 'v19.0',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
default: 'v22.0',
|
|
56
|
+
description: 'Versión de la API de WhatsApp Business',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
this.authenticate = {
|
|
60
|
+
type: 'generic',
|
|
61
|
+
properties: {
|
|
62
|
+
headers: {
|
|
63
|
+
Authorization: '=Bearer {{$credentials.accessToken}}',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
this.test = {
|
|
68
|
+
request: {
|
|
69
|
+
url: '/me',
|
|
70
|
+
baseURL: 'https://graph.facebook.com/v22.0',
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.WhatsappMessageApi = WhatsappMessageApi;
|
|
76
|
+
exports.default = WhatsappMessageApi;
|
|
77
|
+
//# sourceMappingURL=WhatsappMessageApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhatsappMessageApi.credentials.js","sourceRoot":"","sources":["../../credentials/WhatsappMessageApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,kBAAkB;IAA/B;QACC,SAAI,GAAG,qBAAqB,CAAC;QAC7B,gBAAW,GAAG,uBAAuB,CAAC;QACtC,qBAAgB,GAAG,+CAA+C,CAAC;QACnE,SAAI,GAAG;YACN,KAAK,EAAE,0BAA0B;YACjC,IAAI,EAAE,0BAA0B;SACvB,CAAC;QAEX,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,mCAAmC;aAChD;YACD;gBACC,WAAW,EAAE,iBAAiB;gBAC9B,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,uCAAuC;aACpD;YACD;gBACC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE;oBACZ,QAAQ,EAAE,IAAI;iBACd;gBACD,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,uDAAuD;aACpE;YACD;gBACC,WAAW,EAAE,aAAa;gBAC1B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,OAAO;qBACd;oBACD;wBACC,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,OAAO;qBACd;iBACD;gBACD,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,wCAAwC;aACrD;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,sCAAsC;iBACrD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,GAAG,EAAE,KAAK;gBACV,OAAO,EAAE,kCAAkC;aAC3C;SACD,CAAC;IACH,CAAC;CAAA;AAvED,gDAuEC;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class WhatsappMessage implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
}
|