@fer2809fl/baileys 7.0.2 → 7.0.5
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/README.md +409 -32
- package/lib/Defaults/index.js +2 -1
- package/lib/Modded/message_builder.js +2356 -0
- package/lib/Signal/libsignal.js +19 -0
- package/lib/Socket/business.d.ts +213 -532
- package/lib/Socket/business.js +359 -401
- package/lib/Socket/chats.d.ts +30 -2
- package/lib/Socket/chats.js +295 -40
- package/lib/Socket/groups.d.ts +16 -0
- package/lib/Socket/groups.js +101 -18
- package/lib/Socket/index.d.ts +17 -0
- package/lib/Socket/messages-recv.js +18 -1
- package/lib/Socket/messages-send.d.ts +18 -0
- package/lib/Socket/messages-send.js +50 -2
- package/lib/Socket/newsletter.js +3 -3
- package/lib/Socket/socket.js +50 -6
- package/lib/Types/Newsletter.d.ts +13 -4
- package/lib/Types/Newsletter.js +12 -2
- package/lib/Utils/anti-ban.d.ts +41 -0
- package/lib/Utils/anti-ban.js +182 -0
- package/lib/Utils/banner.d.ts +8 -0
- package/lib/Utils/banner.js +76 -0
- package/lib/Utils/bot-utils.d.ts +57 -0
- package/lib/Utils/bot-utils.js +241 -0
- package/lib/Utils/chat-utils.d.ts +34 -4
- package/lib/Utils/chat-utils.js +80 -20
- package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
- package/lib/Utils/companion-reg-client-utils.js +35 -0
- package/lib/Utils/enhanced-cache.d.ts +40 -0
- package/lib/Utils/enhanced-cache.js +242 -0
- package/lib/Utils/enhanced-logger.d.ts +41 -0
- package/lib/Utils/enhanced-logger.js +185 -0
- package/lib/Utils/event-buffer.js +49 -1
- package/lib/Utils/index.d.ts +14 -0
- package/lib/Utils/index.js +14 -0
- package/lib/Utils/lid-utils.d.ts +139 -0
- package/lib/Utils/lid-utils.js +503 -0
- package/lib/Utils/message-queue.d.ts +47 -0
- package/lib/Utils/message-queue.js +226 -0
- package/lib/Utils/message-retry-manager.js +40 -0
- package/lib/Utils/rich-message-utils.d.ts +21 -0
- package/lib/Utils/rich-message-utils.js +229 -0
- package/lib/Utils/rich-messages.d.ts +52 -0
- package/lib/Utils/rich-messages.js +185 -0
- package/lib/Utils/scheduled-messages.d.ts +122 -0
- package/lib/Utils/scheduled-messages.js +289 -0
- package/lib/Utils/smart-reconnect.d.ts +48 -0
- package/lib/Utils/smart-reconnect.js +207 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
- package/lib/Utils/use-sqlite-auth-state.js +95 -0
- package/lib/VoIP/audio-feeder.d.ts +15 -0
- package/lib/VoIP/audio-feeder.js +132 -0
- package/lib/VoIP/index.js +277 -0
- package/lib/VoIP/relay-transport.d.ts +43 -0
- package/lib/VoIP/relay-transport.js +559 -0
- package/lib/VoIP/signaling.js +594 -0
- package/lib/VoIP/types.d.ts +69 -0
- package/lib/VoIP/types.js +17 -0
- package/lib/VoIP/wasm-engine.d.ts +103 -0
- package/lib/VoIP/wasm-engine.js +1214 -0
- package/lib/VoIP/worker-bootstrap.js +1042 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/index.js +1 -0
- package/lib/WAUSync/USyncQuery.js +5 -1
- package/lib/assets/wasm/loader.js +5 -0
- package/lib/assets/wasm/whatsapp.wasm +0 -0
- package/lib/assets/wasm/worker-modules.js +273 -0
- package/lib/index.d.ts +41 -0
- package/lib/index.js +3 -0
- package/package.json +15 -7
- package/lib/Defaults/index.d.ts.map +0 -1
- package/lib/Defaults/index.js.map +0 -1
- package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
- package/lib/Signal/Group/ciphertext-message.js.map +0 -1
- package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
- package/lib/Signal/Group/group-session-builder.js.map +0 -1
- package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
- package/lib/Signal/Group/group_cipher.js.map +0 -1
- package/lib/Signal/Group/index.d.ts.map +0 -1
- package/lib/Signal/Group/index.js.map +0 -1
- package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
- package/lib/Signal/Group/keyhelper.js.map +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-chain-key.js.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-name.js.map +0 -1
- package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-record.js.map +0 -1
- package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-state.js.map +0 -1
- package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-message-key.js.map +0 -1
- package/lib/Signal/libsignal.d.ts.map +0 -1
- package/lib/Signal/libsignal.js.map +0 -1
- package/lib/Signal/lid-mapping.d.ts.map +0 -1
- package/lib/Signal/lid-mapping.js.map +0 -1
- package/lib/Socket/Client/index.d.ts.map +0 -1
- package/lib/Socket/Client/index.js.map +0 -1
- package/lib/Socket/Client/types.d.ts.map +0 -1
- package/lib/Socket/Client/types.js.map +0 -1
- package/lib/Socket/Client/websocket.d.ts.map +0 -1
- package/lib/Socket/Client/websocket.js.map +0 -1
- package/lib/Socket/business.d.ts.map +0 -1
- package/lib/Socket/business.js.map +0 -1
- package/lib/Socket/chats.d.ts.map +0 -1
- package/lib/Socket/chats.js.map +0 -1
- package/lib/Socket/communities.d.ts.map +0 -1
- package/lib/Socket/communities.js.map +0 -1
- package/lib/Socket/dugong.d.ts.map +0 -1
- package/lib/Socket/dugong.js.map +0 -1
- package/lib/Socket/groups.d.ts.map +0 -1
- package/lib/Socket/groups.js.map +0 -1
- package/lib/Socket/index.d.ts.map +0 -1
- package/lib/Socket/index.js.map +0 -1
- package/lib/Socket/messages-recv.d.ts.map +0 -1
- package/lib/Socket/messages-recv.js.map +0 -1
- package/lib/Socket/messages-send.d.ts.map +0 -1
- package/lib/Socket/messages-send.js.map +0 -1
- package/lib/Socket/mex.d.ts.map +0 -1
- package/lib/Socket/mex.js.map +0 -1
- package/lib/Socket/newsletter.d.ts.map +0 -1
- package/lib/Socket/newsletter.js.map +0 -1
- package/lib/Socket/socket.d.ts.map +0 -1
- package/lib/Socket/socket.js.map +0 -1
- package/lib/Types/Auth.d.ts.map +0 -1
- package/lib/Types/Auth.js.map +0 -1
- package/lib/Types/Bussines.d.ts.map +0 -1
- package/lib/Types/Bussines.js.map +0 -1
- package/lib/Types/Call.d.ts.map +0 -1
- package/lib/Types/Call.js.map +0 -1
- package/lib/Types/Chat.d.ts.map +0 -1
- package/lib/Types/Chat.js.map +0 -1
- package/lib/Types/Contact.d.ts.map +0 -1
- package/lib/Types/Contact.js.map +0 -1
- package/lib/Types/Events.d.ts.map +0 -1
- package/lib/Types/Events.js.map +0 -1
- package/lib/Types/GroupMetadata.d.ts.map +0 -1
- package/lib/Types/GroupMetadata.js.map +0 -1
- package/lib/Types/Label.d.ts.map +0 -1
- package/lib/Types/Label.js.map +0 -1
- package/lib/Types/LabelAssociation.d.ts.map +0 -1
- package/lib/Types/LabelAssociation.js.map +0 -1
- package/lib/Types/Message.d.ts.map +0 -1
- package/lib/Types/Message.js.map +0 -1
- package/lib/Types/Newsletter.d.ts.map +0 -1
- package/lib/Types/Newsletter.js.map +0 -1
- package/lib/Types/Product.d.ts.map +0 -1
- package/lib/Types/Product.js.map +0 -1
- package/lib/Types/Signal.d.ts.map +0 -1
- package/lib/Types/Signal.js.map +0 -1
- package/lib/Types/Socket.d.ts.map +0 -1
- package/lib/Types/Socket.js.map +0 -1
- package/lib/Types/State.d.ts.map +0 -1
- package/lib/Types/State.js.map +0 -1
- package/lib/Types/USync.d.ts.map +0 -1
- package/lib/Types/USync.js.map +0 -1
- package/lib/Types/index.d.ts.map +0 -1
- package/lib/Types/index.js.map +0 -1
- package/lib/Utils/auth-utils.d.ts.map +0 -1
- package/lib/Utils/auth-utils.js.map +0 -1
- package/lib/Utils/browser-utils.d.ts.map +0 -1
- package/lib/Utils/browser-utils.js.map +0 -1
- package/lib/Utils/business.d.ts.map +0 -1
- package/lib/Utils/business.js.map +0 -1
- package/lib/Utils/chat-utils.d.ts.map +0 -1
- package/lib/Utils/chat-utils.js.map +0 -1
- package/lib/Utils/crypto.d.ts.map +0 -1
- package/lib/Utils/crypto.js.map +0 -1
- package/lib/Utils/decode-wa-message.d.ts.map +0 -1
- package/lib/Utils/decode-wa-message.js.map +0 -1
- package/lib/Utils/event-buffer.d.ts.map +0 -1
- package/lib/Utils/event-buffer.js.map +0 -1
- package/lib/Utils/generics.d.ts.map +0 -1
- package/lib/Utils/generics.js.map +0 -1
- package/lib/Utils/history.d.ts.map +0 -1
- package/lib/Utils/history.js.map +0 -1
- package/lib/Utils/identity-change-handler.d.ts.map +0 -1
- package/lib/Utils/identity-change-handler.js.map +0 -1
- package/lib/Utils/index.d.ts.map +0 -1
- package/lib/Utils/index.js.map +0 -1
- package/lib/Utils/link-preview.d.ts.map +0 -1
- package/lib/Utils/link-preview.js.map +0 -1
- package/lib/Utils/logger.d.ts.map +0 -1
- package/lib/Utils/logger.js.map +0 -1
- package/lib/Utils/lt-hash.d.ts.map +0 -1
- package/lib/Utils/lt-hash.js.map +0 -1
- package/lib/Utils/make-mutex.d.ts.map +0 -1
- package/lib/Utils/make-mutex.js.map +0 -1
- package/lib/Utils/message-retry-manager.d.ts.map +0 -1
- package/lib/Utils/message-retry-manager.js.map +0 -1
- package/lib/Utils/messages-media.d.ts.map +0 -1
- package/lib/Utils/messages-media.js.map +0 -1
- package/lib/Utils/messages.d.ts.map +0 -1
- package/lib/Utils/messages.js.map +0 -1
- package/lib/Utils/noise-handler.d.ts.map +0 -1
- package/lib/Utils/noise-handler.js.map +0 -1
- package/lib/Utils/offline-node-processor.d.ts.map +0 -1
- package/lib/Utils/offline-node-processor.js.map +0 -1
- package/lib/Utils/pre-key-manager.d.ts.map +0 -1
- package/lib/Utils/pre-key-manager.js.map +0 -1
- package/lib/Utils/process-message.d.ts.map +0 -1
- package/lib/Utils/process-message.js.map +0 -1
- package/lib/Utils/reporting-utils.d.ts.map +0 -1
- package/lib/Utils/reporting-utils.js.map +0 -1
- package/lib/Utils/rich-messages.d.ts.map +0 -1
- package/lib/Utils/rich-messages.js.map +0 -1
- package/lib/Utils/signal.d.ts.map +0 -1
- package/lib/Utils/signal.js.map +0 -1
- package/lib/Utils/stanza-ack.d.ts.map +0 -1
- package/lib/Utils/stanza-ack.js.map +0 -1
- package/lib/Utils/sync-action-utils.d.ts.map +0 -1
- package/lib/Utils/sync-action-utils.js.map +0 -1
- package/lib/Utils/tc-token-utils.d.ts.map +0 -1
- package/lib/Utils/tc-token-utils.js.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
- package/lib/Utils/validate-connection.d.ts.map +0 -1
- package/lib/Utils/validate-connection.js.map +0 -1
- package/lib/WABinary/constants.d.ts.map +0 -1
- package/lib/WABinary/constants.js.map +0 -1
- package/lib/WABinary/decode.d.ts.map +0 -1
- package/lib/WABinary/decode.js.map +0 -1
- package/lib/WABinary/encode.d.ts.map +0 -1
- package/lib/WABinary/encode.js.map +0 -1
- package/lib/WABinary/generic-utils.d.ts.map +0 -1
- package/lib/WABinary/generic-utils.js.map +0 -1
- package/lib/WABinary/index.d.ts.map +0 -1
- package/lib/WABinary/index.js.map +0 -1
- package/lib/WABinary/jid-utils.d.ts.map +0 -1
- package/lib/WABinary/jid-utils.js.map +0 -1
- package/lib/WABinary/types.d.ts.map +0 -1
- package/lib/WABinary/types.js.map +0 -1
- package/lib/WAM/BinaryInfo.d.ts.map +0 -1
- package/lib/WAM/BinaryInfo.js.map +0 -1
- package/lib/WAM/constants.d.ts.map +0 -1
- package/lib/WAM/constants.js.map +0 -1
- package/lib/WAM/encode.d.ts.map +0 -1
- package/lib/WAM/encode.js.map +0 -1
- package/lib/WAM/index.d.ts.map +0 -1
- package/lib/WAM/index.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/index.js.map +0 -1
- package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
- package/lib/WAUSync/USyncQuery.js.map +0 -1
- package/lib/WAUSync/USyncUser.d.ts.map +0 -1
- package/lib/WAUSync/USyncUser.js.map +0 -1
- package/lib/WAUSync/index.d.ts.map +0 -1
- package/lib/WAUSync/index.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -16,21 +16,117 @@
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
## 🆕 Novedades —
|
|
19
|
+
## 🆕 Novedades — v7.0.5
|
|
20
|
+
|
|
21
|
+
**La actualización más completa hasta ahora.** Se revisó el fork "beta" del proyecto en busca de utilidades que este repo todavía no tenía, se portaron una por una (evitando duplicar nombres ya existentes) y se hizo una auditoría de código de punta a punta — no solo del README.
|
|
22
|
+
|
|
23
|
+
### 🔧 Mantenimiento y correcciones
|
|
24
|
+
- **`messages-send.js`** — se corrigió un caso donde el nodo `biz` (usado por los botones nativos) podía duplicarse dentro del stanza si ya venía agregado por otra parte del mensaje; ahora se verifica que no exista antes de agregarlo.
|
|
25
|
+
- **Auditoría completa de `lib/`**, archivo por archivo contra el fork beta: no faltaba ninguna función real, solo faltaban algunos exports y tipos, ya corregidos.
|
|
26
|
+
- **Exports arreglados** — `Utils/reporting-utils.js` y `Utils/companion-reg-client-utils.js` existían en el código pero no se exportaban bien desde el paquete; quien instalaba `@fer2809fl/baileys` no podía importar sus funciones. Ya se puede.
|
|
27
|
+
- **Tipos de TypeScript agregados** para los 9 módulos que solo venían en JavaScript — `anti-ban`, `smart-reconnect`, `message-queue`, `enhanced-cache`, `enhanced-logger`, `bot-utils`, `banner`, `rich-message-utils` y `use-sqlite-auth-state` — verificados con `tsc`. Ahora tienen autocompletado y chequeo de tipos.
|
|
28
|
+
- **Limpieza de marca** en `banner.js` y `enhanced-logger.js` (traían branding del proyecto original de donde se portó el código).
|
|
29
|
+
- En general: se optimizó y se prolijaron varios detalles sueltos de código y documentación que quedaron de fusiones anteriores.
|
|
30
|
+
|
|
31
|
+
Se documentaron además funciones que ya existían en el código pero no tenían ejemplo de uso: tablas, bloques de código, carruseles, álbumes y canales/newsletters (ver secciones nuevas más abajo).
|
|
32
|
+
|
|
33
|
+
Próximas tandas (se irán agregando poco a poco): documentación de Grupos avanzados, Comunidades, Negocios, Perfil/Privacidad, Estados (stories) y Eventos.
|
|
34
|
+
|
|
35
|
+
### 🆕 Protocolo actualizado + funciones nuevas de chat
|
|
36
|
+
- **Versión de WhatsApp Web actualizada** a `2.3000.1047406223` (la más reciente confirmada al momento de esta actualización), reduciendo el riesgo de rechazo de conexión por versión vieja.
|
|
37
|
+
- **Nuevas funciones de chat** (no existían ni en este fork ni en el beta — son de cosecha propia esta vez): atajos simples para las operaciones de chat más comunes, en vez de tener que armar el objeto de `chatModify` a mano:
|
|
38
|
+
```javascript
|
|
39
|
+
await sock.pinChat(jid) // fijar chat
|
|
40
|
+
await sock.pinChat(jid, false) // desfijar
|
|
41
|
+
await sock.archiveChat(jid) // archivar
|
|
42
|
+
await sock.archiveChat(jid, false) // desarchivar
|
|
43
|
+
await sock.muteChat(jid, Date.now() + 8 * 60 * 60 * 1000) // silenciar 8 horas
|
|
44
|
+
await sock.muteChat(jid) // quitar silencio
|
|
45
|
+
await sock.markChatRead(jid) // marcar como leído
|
|
46
|
+
await sock.markChatUnread(jid) // marcar como no leído
|
|
47
|
+
await sock.clearChat(jid) // vaciar el historial del chat
|
|
48
|
+
await sock.deleteChat(jid) // eliminar el chat de la lista
|
|
49
|
+
```
|
|
50
|
+
Todas usan por debajo el mismo `chatModify` de siempre (mismo protocolo, mismos parches de estado), solo que ahora no hay que recordar la forma exacta del objeto `mod`.
|
|
51
|
+
- **Fijar un mensaje dentro del chat** (`pinInChatMessage`) — esta ya existía en el código pero no estaba documentada:
|
|
52
|
+
```javascript
|
|
53
|
+
// Fijar el mensaje citado por 24 horas (86400 segundos)
|
|
54
|
+
await sock.sendMessage(jid, { pin: quotedMsg.key, type: 1, time: 86400 })
|
|
55
|
+
// Desfijar
|
|
56
|
+
await sock.sendMessage(jid, { pin: quotedMsg.key, type: 2 })
|
|
57
|
+
```
|
|
20
58
|
|
|
21
59
|
### ✅ Nuevas funciones añadidas
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
60
|
+
|
|
61
|
+
**Anti-Ban** (`Utils/anti-ban.js`)
|
|
62
|
+
- `randomDelay`, `messageDelay`, `typingDelay` — retrasos aleatorios "humanizados" antes de enviar.
|
|
63
|
+
- `RateLimiter`, `globalRateLimiter`, `groupRateLimiter`, `broadcastRateLimiter` — limitadores de tasa listos para usar por chat/grupo/difusión.
|
|
64
|
+
- `PresenceManager`, `generateSessionFingerprint`, `isValidJid`, `sanitizeMessage` — utilidades de apoyo para reducir el riesgo de baneo por comportamiento de bot.
|
|
65
|
+
|
|
66
|
+
**Reconexión inteligente** (`Utils/smart-reconnect.js`)
|
|
67
|
+
- `SmartReconnect`, `createConnectionHandler`, `withRetry` — backoff exponencial con jitter y detección de causas de desconexión recuperables vs definitivas.
|
|
68
|
+
|
|
69
|
+
**Cola de mensajes** (`Utils/message-queue.js`)
|
|
70
|
+
- `MessageQueue`, `createMessageQueue` — colas con prioridad (`PRIORITY.CRITICAL` a `PRIORITY.BACKGROUND`) y control de tasa por tipo de contenido.
|
|
71
|
+
|
|
72
|
+
**Caché mejorada** (`Utils/enhanced-cache.js`)
|
|
73
|
+
- `EnhancedCache`, `CacheManager` — caché en memoria con TTL/stale-TTL basada en `lru-cache`, con snapshot a disco.
|
|
74
|
+
|
|
75
|
+
**Logger mejorado** (`Utils/enhanced-logger.js`)
|
|
76
|
+
- `createLogger`, `RyzeLogger` — logger con niveles, colores en consola e iconos por categoría (no reemplaza tu logger `pino` existente, es una alternativa opcional).
|
|
77
|
+
|
|
78
|
+
**Mensajes programados** (`Utils/scheduled-messages.js`)
|
|
79
|
+
```javascript
|
|
80
|
+
import { startScheduler, scheduleMessage, recurringMessage } from '@fer2809fl/baileys'
|
|
81
|
+
|
|
82
|
+
startScheduler(sock) // arranca el scheduler una vez tengas el sock conectado
|
|
83
|
+
|
|
84
|
+
// una sola vez, en una fecha exacta
|
|
85
|
+
scheduleMessage('123@s.whatsapp.net', { text: 'Recordatorio' }, Date.now() + 60_000)
|
|
86
|
+
|
|
87
|
+
// recurrente con cron simple: "MIN HOUR DOM MON DOW"
|
|
88
|
+
recurringMessage('123@s.whatsapp.net', { text: 'Buenos días' }, '0 9 * * *')
|
|
89
|
+
```
|
|
90
|
+
También: `cancelScheduledMessage`, `deleteScheduledMessage`, `listScheduledMessages`, `getScheduledMessage`, `updateScheduledMessage`, `getSchedulerStats`. Persiste en `database/scheduled-messages.json`.
|
|
91
|
+
|
|
92
|
+
**Utilidades de LID** (`Utils/lid-utils.js`)
|
|
93
|
+
- `isLid`, `lidToJid`, `resolveAnyLidToJid`, `resolveParticipant`, `getParticipantJid(s)`, `cacheParticipantLids`, `findParticipantByNumber`, entre otras — resolución y cacheo de `@lid` ↔ número real con persistencia en `database/lid-cache.json`. Complementa (no reemplaza) la resolución de admins/JID-LID nativa que ya tenía este fork desde v1.10.0.
|
|
94
|
+
|
|
95
|
+
**Utilidades para bots** (`Utils/bot-utils.js`)
|
|
96
|
+
- `parseCommand(text, prefix)` — parseo de comandos con flags (`--flag=valor`) y argumentos.
|
|
97
|
+
- `CooldownManager`, `PermissionManager` (owners/admins/baneados/premium).
|
|
98
|
+
- `extractMentions`, `extractQuotedMessage`, `isGroupAdmin`, `isBotAdmin`, `formatPhoneNumber`, `parseTime('10m')`, `formatDuration(ms)`, `sendFast(sock, jid, contenido)`.
|
|
99
|
+
|
|
100
|
+
**Auth state en SQLite** (`Utils/use-sqlite-auth-state.js`)
|
|
101
|
+
```javascript
|
|
102
|
+
import { useSqliteAuthState } from '@fer2809fl/baileys'
|
|
103
|
+
const { state, saveCreds } = await useSqliteAuthState({ dbPath: './auth.db' })
|
|
104
|
+
```
|
|
105
|
+
Requiere `better-sqlite3` (peer dependency opcional: `npm i better-sqlite3`).
|
|
106
|
+
|
|
107
|
+
**Banner de inicio** (`Utils/banner.js`) — `printBanner()` opcional para mostrar un logo ASCII al arrancar el bot.
|
|
108
|
+
|
|
109
|
+
**AI Rich Response — helpers de bajo nivel** (`Utils/rich-message-utils.js`)
|
|
110
|
+
- `prepareRichResponseMessage(contenido)` — arma un `AIRichResponseMessage` completo (texto + código + tabla + links) en un solo llamado, incluyendo la firma/certificado de `botMetadata`.
|
|
111
|
+
- `toUnified`, `wrapToBotForwardedMessage`, `botMetadataSignature`, `botMetadataCertificate` — piezas internas reutilizables si armas tus propios mensajes enriquecidos.
|
|
112
|
+
- Se ampliaron los lenguajes soportados para resaltado de código en `LANGUAGE_KEYWORDS` (`Utils/rich-messages.js`): ahora incluye `rust`, `c`, `cpp`/`c++`, `csharp`/`c#`, `html` y `css`, además de los que ya tenías.
|
|
113
|
+
|
|
114
|
+
**Builder "Modded"** (`Modded/message_builder.js`) — clases con API encadenable para armar botones, carruseles y respuestas AI-Rich sin construir el objeto a mano: `Button`, `ButtonV2`, `Carousel`, `AIRich`, `ORich`, `Toolkit`. *(Este archivo trae una nota de autoría de su creador original — se mantuvo intacta tal cual, junto con los términos: uso libre para proyectos propios, pero no puede revenderse ni redistribuirse como librería independiente.)*
|
|
115
|
+
|
|
116
|
+
**VoIP — llamadas de voz** (`VoIP/`) — cliente experimental de llamadas de voz de WhatsApp sobre el motor WASM oficial:
|
|
117
|
+
```javascript
|
|
118
|
+
import { VoipClient, CallState } from '@fer2809fl/baileys'
|
|
119
|
+
|
|
120
|
+
const voip = new VoipClient(sock)
|
|
121
|
+
const call = await voip.call('123@s.whatsapp.net')
|
|
122
|
+
call.on('stateChange', (state) => console.log(CallState[state]))
|
|
123
|
+
```
|
|
124
|
+
Incluye `ActiveCall`, manejo de señalización, y el binario WASM necesario (`lib/assets/wasm/`). Es una función pesada y experimental: úsala solo si tu bot realmente necesita hacer/recibir llamadas.
|
|
125
|
+
|
|
126
|
+
### 📌 Notas finales
|
|
127
|
+
- Se revisó cuidadosamente cada función nueva contra el código ya existente para no pisar ni duplicar exports (por ejemplo, `BufferJSON` y los tipos de resaltado de código se reutilizan de los archivos que ya tenías, en vez de crear una segunda copia).
|
|
128
|
+
- Las funciones marcadas arriba con ejemplo de código ya están 100% cableadas y listas para usar; el resto se documentará con más ejemplos en la próxima revisión.
|
|
129
|
+
- Los archivos `anti-ban.js`, `smart-reconnect.js`, `message-queue.js`, `enhanced-cache.js`, `enhanced-logger.js`, `bot-utils.js`, `banner.js`, `rich-message-utils.js` y `use-sqlite-auth-state.js` se distribuyen por ahora solo en JavaScript (igual que en el fork de origen); los tipos de TypeScript para estos módulos llegarán en una futura actualización.
|
|
34
130
|
|
|
35
131
|
---
|
|
36
132
|
|
|
@@ -61,7 +157,7 @@ yarn add github:Fer2809fl/Baileys
|
|
|
61
157
|
```json
|
|
62
158
|
{
|
|
63
159
|
"dependencies": {
|
|
64
|
-
"@fer2809fl/baileys": "^1.
|
|
160
|
+
"@fer2809fl/baileys": "^1.11.0"
|
|
65
161
|
}
|
|
66
162
|
}
|
|
67
163
|
```
|
|
@@ -77,29 +173,29 @@ Paquete npm: [npmjs.com/package/@fer2809fl/baileys](https://www.npmjs.com/packag
|
|
|
77
173
|
const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
|
|
78
174
|
|
|
79
175
|
async function startBot() {
|
|
80
|
-
const { state, saveCreds } = await useMultiFileAuthState('session-
|
|
176
|
+
const { state, saveCreds } = await useMultiFileAuthState('session-myfer')
|
|
81
177
|
|
|
82
|
-
const
|
|
178
|
+
const fer = makeWASocket({
|
|
83
179
|
auth: state,
|
|
84
180
|
printQRInTerminal: true,
|
|
85
181
|
generateHighQualityLinkPreview: true // recomendado para que las previews se vean mejor
|
|
86
182
|
})
|
|
87
183
|
|
|
88
|
-
|
|
184
|
+
fer.ev.on('connection.update', ({ connection }) => {
|
|
89
185
|
if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
|
|
90
186
|
if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
|
|
91
187
|
})
|
|
92
188
|
|
|
93
|
-
|
|
189
|
+
fer.ev.on('messages.upsert', async ({ messages }) => {
|
|
94
190
|
const m = messages[0]
|
|
95
191
|
if (!m.message) return
|
|
96
192
|
|
|
97
|
-
await
|
|
98
|
-
text: '¡Hola! Soy un bot de
|
|
193
|
+
await fer.sendMessage(m.key.remoteJid, {
|
|
194
|
+
text: '¡Hola! Soy un bot de Fer!'
|
|
99
195
|
})
|
|
100
196
|
})
|
|
101
197
|
|
|
102
|
-
|
|
198
|
+
fer.ev.on('creds.update', saveCreds)
|
|
103
199
|
}
|
|
104
200
|
|
|
105
201
|
startBot()
|
|
@@ -109,7 +205,7 @@ startBot()
|
|
|
109
205
|
|
|
110
206
|
## 🔘 Botones Interactivos *(actualizado en v1.9.0)*
|
|
111
207
|
|
|
112
|
-
A diferencia de otras librerías, acá **no se importan funciones sueltas**: los botones son métodos que ya están directamente en el socket que devuelve `makeWASocket`. Solo llamalos desde `sock` (o como hayas nombrado tu conexión, `
|
|
208
|
+
A diferencia de otras librerías, acá **no se importan funciones sueltas**: los botones son métodos que ya están directamente en el socket que devuelve `makeWASocket`. Solo llamalos desde `sock` (o como hayas nombrado tu conexión, `fer` en los ejemplos).
|
|
113
209
|
|
|
114
210
|
Todos aceptan al final un objeto `extra` opcional (`footer`, `image`, `video`, `document`, `quoted`) y uno de `options` para lo que ya soporta `sendMessage` normalmente.
|
|
115
211
|
|
|
@@ -118,7 +214,7 @@ Todos aceptan al final un objeto `extra` opcional (`footer`, `image`, `video`, `
|
|
|
118
214
|
### ⚡ `sendQuickReplyButtons` — Botones de Respuesta Rápida
|
|
119
215
|
|
|
120
216
|
```javascript
|
|
121
|
-
await
|
|
217
|
+
await fer.sendQuickReplyButtons(
|
|
122
218
|
jid,
|
|
123
219
|
'🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
|
|
124
220
|
[
|
|
@@ -136,7 +232,7 @@ await melody.sendQuickReplyButtons(
|
|
|
136
232
|
Genera solo la tarjeta de previsualización (imagen, título, descripción) del link del botón.
|
|
137
233
|
|
|
138
234
|
```javascript
|
|
139
|
-
await
|
|
235
|
+
await fer.sendUrlButton(
|
|
140
236
|
jid,
|
|
141
237
|
'🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
|
|
142
238
|
'🌐 Ver GitHub', // etiqueta del botón
|
|
@@ -149,7 +245,7 @@ await melody.sendUrlButton(
|
|
|
149
245
|
### 📞 `sendCallButton` — Botón de Llamada
|
|
150
246
|
|
|
151
247
|
```javascript
|
|
152
|
-
await
|
|
248
|
+
await fer.sendCallButton(
|
|
153
249
|
jid,
|
|
154
250
|
'📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
|
|
155
251
|
'📞 Llamar Ahora', // etiqueta del botón
|
|
@@ -162,7 +258,7 @@ await melody.sendCallButton(
|
|
|
162
258
|
### 📋 `sendCopyButton` — Botón Copiar
|
|
163
259
|
|
|
164
260
|
```javascript
|
|
165
|
-
await
|
|
261
|
+
await fer.sendCopyButton(
|
|
166
262
|
jid,
|
|
167
263
|
'📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
|
|
168
264
|
'📋 Copiar Comando', // etiqueta del botón
|
|
@@ -175,7 +271,7 @@ await melody.sendCopyButton(
|
|
|
175
271
|
### ⏰ `sendReminderButton` — Botón de Recordatorio
|
|
176
272
|
|
|
177
273
|
```javascript
|
|
178
|
-
await
|
|
274
|
+
await fer.sendReminderButton(
|
|
179
275
|
jid,
|
|
180
276
|
'⏰ *RECORDATORIO*\n\nActiva un aviso para no olvidarlo:',
|
|
181
277
|
'⏰ Recordarme'
|
|
@@ -187,7 +283,7 @@ await melody.sendReminderButton(
|
|
|
187
283
|
### 📋 `sendListButton` — Menú Desplegable (Lista)
|
|
188
284
|
|
|
189
285
|
```javascript
|
|
190
|
-
await
|
|
286
|
+
await fer.sendListButton(
|
|
191
287
|
jid,
|
|
192
288
|
'📋 *SELECCIONA UNA OPCIÓN*',
|
|
193
289
|
'Menú Principal', // título del botón que abre la lista
|
|
@@ -219,7 +315,7 @@ await melody.sendListButton(
|
|
|
219
315
|
Para armar cualquier combinación libre de tipos (o alguno que no tenga método propio) en un solo mensaje.
|
|
220
316
|
|
|
221
317
|
```javascript
|
|
222
|
-
await
|
|
318
|
+
await fer.sendMixedButtons(
|
|
223
319
|
jid,
|
|
224
320
|
'🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
|
|
225
321
|
[
|
|
@@ -237,7 +333,7 @@ await melody.sendMixedButtons(
|
|
|
237
333
|
`sendLinkPreview` manda solo texto + una tarjeta grande y prolija con la imagen, título y descripción de cualquier URL — igual que un mensaje normal de WhatsApp con link, pero forzando `renderLargerThumbnail` para que se vea mejor. Sirve para links a fotos, artículos, redes sociales, lo que sea.
|
|
238
334
|
|
|
239
335
|
```javascript
|
|
240
|
-
await
|
|
336
|
+
await fer.sendLinkPreview(
|
|
241
337
|
jid,
|
|
242
338
|
'¡Mirá esto! 👀',
|
|
243
339
|
'https://github.com/Fer2809fl/Baileys'
|
|
@@ -247,7 +343,7 @@ await melody.sendLinkPreview(
|
|
|
247
343
|
Si el texto ya trae el link adentro, no hace falta pasarlo aparte:
|
|
248
344
|
|
|
249
345
|
```javascript
|
|
250
|
-
await
|
|
346
|
+
await fer.sendLinkPreview(
|
|
251
347
|
jid,
|
|
252
348
|
'Repo oficial: https://github.com/Fer2809fl/Baileys'
|
|
253
349
|
)
|
|
@@ -256,7 +352,7 @@ await melody.sendLinkPreview(
|
|
|
256
352
|
Esta misma previsualización se activa automáticamente en `sendUrlButton` y en cualquier otro botón si el texto trae un link. Para desactivarla en un envío puntual:
|
|
257
353
|
|
|
258
354
|
```javascript
|
|
259
|
-
await
|
|
355
|
+
await fer.sendUrlButton(jid, texto, '🌐 Ver más', url, { preview: false })
|
|
260
356
|
```
|
|
261
357
|
|
|
262
358
|
---
|
|
@@ -332,6 +428,286 @@ export default handler
|
|
|
332
428
|
|
|
333
429
|
---
|
|
334
430
|
|
|
431
|
+
## 👑 Admins y resolución de JID/LID *(nuevo en v1.10.0)*
|
|
432
|
+
|
|
433
|
+
No hace falta comparar `jid`/`@lid`/número a mano contra `groupMetadata`: usá estas funciones directo desde el socket.
|
|
434
|
+
|
|
435
|
+
```javascript
|
|
436
|
+
// ¿Es admin del grupo? (acepta jid normal o @lid, resuelve solo)
|
|
437
|
+
const esAdmin = await fer.isGroupAdmin(m.chat, m.sender)
|
|
438
|
+
|
|
439
|
+
// Lista de admins ya resueltos a número (nunca @lid)
|
|
440
|
+
const admins = await fer.getGroupAdmins(m.chat)
|
|
441
|
+
// [{ jid: '521418xxxxxxx@s.whatsapp.net', admin: 'superadmin' }, ...]
|
|
442
|
+
|
|
443
|
+
// Resolver un @lid puntual (mención, quoted, etc.) a su número real
|
|
444
|
+
const numeroReal = await fer.resolveParticipantJid(m.chat, mentionedJid)
|
|
445
|
+
|
|
446
|
+
// groupMetadata con cache de 30s (se invalida solo con altas/bajas/promociones reales)
|
|
447
|
+
const meta = await fer.groupMetadataCached(m.chat)
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
```javascript
|
|
451
|
+
// plugins/admin-only.js
|
|
452
|
+
let handler = async (m, { conn }) => {
|
|
453
|
+
if (!(await conn.isGroupAdmin(m.chat, m.sender))) {
|
|
454
|
+
return conn.sendMessage(m.chat, { text: '🔒 Solo admins pueden usar este comando.' })
|
|
455
|
+
}
|
|
456
|
+
// ...
|
|
457
|
+
}
|
|
458
|
+
handler.command = ['ejemplo']
|
|
459
|
+
export default handler
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## 🌐 HTML embebido en WhatsApp *(nuevo en v7.1.0)*
|
|
465
|
+
|
|
466
|
+
WhatsApp expone un renderer HTML interno (diseñado originalmente para Meta AI)
|
|
467
|
+
accesible vía el campo opaco `unifiedResponse.data` de `AIRichResponseMessage`.
|
|
468
|
+
Cuando el JSON embebido contiene un `__typename: "GenAIaeacdsnwHtmlPrimitive"`,
|
|
469
|
+
el cliente levanta un **WebView sandboxed dentro del bocadillo del mensaje** y
|
|
470
|
+
renderiza el HTML+JS indicado en `payload`, con permiso de red limitado a los
|
|
471
|
+
dominios listados en `trusted_sources`.
|
|
472
|
+
|
|
473
|
+
Este fork expone esa capacidad como API de primer nivel:
|
|
474
|
+
|
|
475
|
+
### `sock.sendHtml` — envía un WebView dentro del chat
|
|
476
|
+
|
|
477
|
+
```javascript
|
|
478
|
+
await sock.sendHtml(
|
|
479
|
+
jid,
|
|
480
|
+
html, // string con <style>, <body>, <script>
|
|
481
|
+
trustedSources, // ["api.tuyo.com"] ← dominios permitidos para fetch
|
|
482
|
+
quoted, // mensaje a responder (opcional)
|
|
483
|
+
{ headerText, footer } // opciones (opcional)
|
|
484
|
+
)
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
O construí el mensaje por tu cuenta con `generateHtmlContent` (exportado desde
|
|
488
|
+
`@nyxthor-dev/baileys`) y mandalo con `relayMessage` si querés más control.
|
|
489
|
+
|
|
490
|
+
### Ejemplo mínimo
|
|
491
|
+
|
|
492
|
+
```javascript
|
|
493
|
+
const html = `
|
|
494
|
+
<body style="margin:0;font-family:sans-serif">
|
|
495
|
+
<h1 style="color:#a3e635">¡Hola desde el WebView!</h1>
|
|
496
|
+
<p>Esto se renderiza dentro del bocadillo de WhatsApp.</p>
|
|
497
|
+
</body>
|
|
498
|
+
`;
|
|
499
|
+
await sock.sendHtml(jid, html, [], msg);
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### ⚠️ Limitaciones estructurales (importante)
|
|
503
|
+
|
|
504
|
+
El WebView tiene 4 restricciones que **no se pueden evitar desde el lado del
|
|
505
|
+
HTML**. El patrón recomendado para resolverlas es mover la lógica a un backend
|
|
506
|
+
HTTP (ver `examples/html-dynamic/` para un demo completo):
|
|
507
|
+
|
|
508
|
+
| Limitación | Qué NO hacer | Patrón recomendado |
|
|
509
|
+
|---|---|---|
|
|
510
|
+
| El WebView es efímero: `localStorage` a menudo se borra al cerrar el chat | Confiar en `localStorage` como única persistencia | Mover la persistencia a un backend HTTP en `trusted_sources` |
|
|
511
|
+
| No existe puente HTML → bot (`window.WhatsApp.postMessage` no existe) | Esperar callbacks automáticos al bot | El HTML hace `fetch` a tu API, y tu API llama `sock.sendMessage(...)` |
|
|
512
|
+
| `fetch()` solo anda hacia dominios listados en `trusted_sources` | Hacer `fetch` a dominios arbitrarios | Listar todos los dominios necesarios al llamar `sendHtml` |
|
|
513
|
+
| El HTML no recibe identidad del usuario automáticamente | Generar el mismo HTML para todos los usuarios | Inyectar `window.__INITIAL__ = { jid, token, ... }` al renderizar |
|
|
514
|
+
|
|
515
|
+
### Patrón dinámico con estado persistente
|
|
516
|
+
|
|
517
|
+
```javascript
|
|
518
|
+
// En tu comando del bot:
|
|
519
|
+
const best = await db.scores.get(senderJid); // 1. leer estado
|
|
520
|
+
const token = issueJwt(senderJid, { expiresIn: '5m' }); // 2. firmar identidad
|
|
521
|
+
|
|
522
|
+
let html = readFileSync('game.html', 'utf8');
|
|
523
|
+
const init = JSON.stringify({ jid: senderJid, best, token, apiBase });
|
|
524
|
+
html = html.replace('</body>',
|
|
525
|
+
`<script>window.__INITIAL__ = ${init};</script></body>`);
|
|
526
|
+
|
|
527
|
+
await sock.sendHtml(jid, html, ['api.tuyo.com'], msg, {
|
|
528
|
+
headerText: '🎮 Mini-juego con estado persistente',
|
|
529
|
+
});
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
```javascript
|
|
533
|
+
// Dentro del HTML (game.html):
|
|
534
|
+
async function saveScore(score) {
|
|
535
|
+
await fetch(INIT.apiBase + '/score', {
|
|
536
|
+
method: 'POST',
|
|
537
|
+
headers: { 'Authorization': 'Bearer ' + INIT.token,
|
|
538
|
+
'Content-Type': 'application/json' },
|
|
539
|
+
body: JSON.stringify({ score })
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
```javascript
|
|
545
|
+
// En tu backend (Express):
|
|
546
|
+
app.post('/score', authMiddleware, async (req, res) => {
|
|
547
|
+
const { jid } = verifyJwt(req.headers.authorization); // <- identidad del JWT
|
|
548
|
+
const { score } = req.body;
|
|
549
|
+
await db.query('INSERT INTO scores ... ON CONFLICT ...', [jid, score]);
|
|
550
|
+
res.json({ ok: true });
|
|
551
|
+
});
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
Ver **`examples/html-dynamic/`** para un demo completo y funcional con SQLite.
|
|
555
|
+
|
|
556
|
+
### Anti-patrones (qué NO hacer)
|
|
557
|
+
|
|
558
|
+
- ❌ Usar `forwardOrigin = META_AI` para broadcast masivo — riesgo de ban.
|
|
559
|
+
- ❌ Enviar HTML > 50KB — puede truncarse.
|
|
560
|
+
- ❌ Confiar en `localStorage` para persistencia entre sesiones.
|
|
561
|
+
- ❌ Hacer `fetch` a dominios fuera de `trusted_sources`.
|
|
562
|
+
- ❌ Generar HTML sin identidad de usuario (no sabrás quién interactúa).
|
|
563
|
+
- ❌ Exponer tokens en texto plano dentro del HTML sin expiración corta.
|
|
564
|
+
|
|
565
|
+
### ⚠️ Advertencias
|
|
566
|
+
|
|
567
|
+
- Esta capacidad **no es oficial** y **no está documentada** por Meta. Puede
|
|
568
|
+
romperse en cualquier update del cliente de WhatsApp.
|
|
569
|
+
- El renderer depende de `forwardOrigin = META_AI` + `forwardedAiBotMessageInfo`,
|
|
570
|
+
que es una **impersonación** de un mensaje de Meta AI. Usalo en chats propios
|
|
571
|
+
o privados, no en broadcast.
|
|
572
|
+
- Probá siempre en Android, iOS y WhatsApp Web — los tres WebViews tienen
|
|
573
|
+
comportamientos distintos.
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
## 📊 Mensajes Enriquecidos (Tablas, Código, Links, LaTeX)
|
|
578
|
+
|
|
579
|
+
Estas funciones ya vienen integradas en el fork (heredadas de la fusión con el fork beta) — aquí quedan documentadas con ejemplos reales.
|
|
580
|
+
|
|
581
|
+
```javascript
|
|
582
|
+
// Tabla (formato clásico)
|
|
583
|
+
await sock.sendTable(
|
|
584
|
+
jid,
|
|
585
|
+
'Precios',
|
|
586
|
+
['Producto', 'Precio'],
|
|
587
|
+
[['Plan A', '$10'], ['Plan B', '$20']],
|
|
588
|
+
quotedMsg,
|
|
589
|
+
{ headerText: 'Nuestros planes', footer: 'Precios en USD' }
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
// Tabla V2 (respuesta unificada tipo "AI Rich")
|
|
593
|
+
await sock.sendTableV2(jid, tablaObjeto, quotedMsg, { title: 'Precios' })
|
|
594
|
+
|
|
595
|
+
// Lista simple
|
|
596
|
+
await sock.sendList(jid, 'Tareas', ['Comprar pan', 'Pagar luz'], quotedMsg)
|
|
597
|
+
|
|
598
|
+
// Bloque de código
|
|
599
|
+
await sock.sendCodeBlock(jid, 'console.log("hola")', quotedMsg, {
|
|
600
|
+
language: 'javascript',
|
|
601
|
+
title: 'Ejemplo'
|
|
602
|
+
})
|
|
603
|
+
|
|
604
|
+
// Bloque de código V2 (unified response)
|
|
605
|
+
await sock.sendCodeBlockV2(jid, 'SELECT * FROM users;', quotedMsg, { language: 'sql' })
|
|
606
|
+
|
|
607
|
+
// Texto con links enriquecidos (embeds inline)
|
|
608
|
+
await sock.sendLink(jid, 'Mira esto: ', [
|
|
609
|
+
{ url: 'https://github.com/Fer2809fl/Bail', displayName: 'Repo en GitHub' }
|
|
610
|
+
], quotedMsg)
|
|
611
|
+
|
|
612
|
+
// LaTeX (fórmulas)
|
|
613
|
+
await sock.sendLatex(quotedMsg, { formula: 'E = mc^2' })
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
## 🎠 Carruseles y 🖼️ Álbumes
|
|
617
|
+
|
|
618
|
+
**Carrusel** — se envía como un `interactiveMessage` con `carouselMessage`, cada tarjeta puede llevar imagen/video y sus propios botones nativos:
|
|
619
|
+
|
|
620
|
+
```javascript
|
|
621
|
+
await sock.sendMessage(jid, {
|
|
622
|
+
interactiveMessage: {
|
|
623
|
+
body: { text: 'Elegí un producto' },
|
|
624
|
+
footer: { text: 'Catálogo 2026' },
|
|
625
|
+
carouselMessage: {
|
|
626
|
+
cards: [
|
|
627
|
+
{
|
|
628
|
+
header: { title: 'Producto 1', imageMessage: 'https://.../foto1.jpg' },
|
|
629
|
+
body: { text: 'Descripción del producto 1' },
|
|
630
|
+
nativeFlowMessage: { buttons: [/* botones nativos, ver sección de Botones */] }
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
header: { title: 'Producto 2', videoMessage: 'https://.../video2.mp4' },
|
|
634
|
+
body: { text: 'Descripción del producto 2' }
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
})
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**Álbum** — varias imágenes/videos agrupados en un mismo "paquete" visual (como el álbum nativo de WhatsApp):
|
|
643
|
+
|
|
644
|
+
```javascript
|
|
645
|
+
await sock.sendMessage(jid, {
|
|
646
|
+
album: [
|
|
647
|
+
{ image: { url: './foto1.jpg' }, caption: 'Foto 1' },
|
|
648
|
+
{ image: { url: './foto2.jpg' } },
|
|
649
|
+
{ video: { url: './video1.mp4' } }
|
|
650
|
+
]
|
|
651
|
+
})
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
> Ambas funciones viven en `Socket/dugong.js` (el despachador interno que detecta el tipo de contenido especial que le mandás a `sock.sendMessage`) y ya estaban portadas desde la fusión con el fork beta — lo que faltaba era este ejemplo en el README.
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## 📰 Newsletters / Canales
|
|
659
|
+
|
|
660
|
+
Todo el manejo de canales (newsletters) de WhatsApp ya está integrado en `Socket/newsletter.js`. Resumen de las funciones disponibles en `sock`:
|
|
661
|
+
|
|
662
|
+
```javascript
|
|
663
|
+
// Crear un canal
|
|
664
|
+
const canal = await sock.newsletterCreate('Mi Canal', 'Descripción del canal')
|
|
665
|
+
|
|
666
|
+
// Seguir / dejar de seguir / silenciar / activar notificaciones
|
|
667
|
+
await sock.newsletterAction(jid, 'follow') // seguir
|
|
668
|
+
await sock.newsletterAction(jid, 'unfollow') // dejar de seguir
|
|
669
|
+
await sock.newsletterAction(jid, 'mute') // silenciar
|
|
670
|
+
await sock.newsletterAction(jid, 'unmute') // reactivar notificaciones
|
|
671
|
+
|
|
672
|
+
// Seguir varios canales de una (separados por espacio en un solo string)
|
|
673
|
+
await sock.newsletterMultipleFollow('120363...@newsletter 120363...@newsletter')
|
|
674
|
+
|
|
675
|
+
// Ver todos los canales a los que estás suscrito
|
|
676
|
+
const misCanales = await sock.newsletterFetchAllSubscribe()
|
|
677
|
+
|
|
678
|
+
// Obtener metadata de un canal por su JID o por su código de invitación
|
|
679
|
+
const meta = await sock.newsletterMetadata('invite', 'codigoDeInvitacion')
|
|
680
|
+
// o, a partir de un link https://whatsapp.com/channel/xxxx o wa.me/channel/xxxx:
|
|
681
|
+
const metaPorLink = await sock.cekIDSaluran('https://whatsapp.com/channel/xxxxxxxx')
|
|
682
|
+
|
|
683
|
+
// Editar (nombre, descripción, foto)
|
|
684
|
+
await sock.newsletterUpdateName(jid, 'Nuevo nombre')
|
|
685
|
+
await sock.newsletterUpdateDescription(jid, 'Nueva descripción')
|
|
686
|
+
await sock.newsletterUpdatePicture(jid, fotoBuffer)
|
|
687
|
+
await sock.newsletterRemovePicture(jid)
|
|
688
|
+
|
|
689
|
+
// Administración
|
|
690
|
+
await sock.newsletterSubscribers(jid) // cantidad/lista de suscriptores
|
|
691
|
+
await sock.newsletterAdminCount(jid) // cantidad de admins
|
|
692
|
+
await sock.newsletterChangeOwner(jid, nuevoOwnerJid)
|
|
693
|
+
await sock.newsletterDemote(jid, userJid)
|
|
694
|
+
await sock.newsletterDelete(jid)
|
|
695
|
+
|
|
696
|
+
// Mensajes del canal
|
|
697
|
+
await sock.newsletterFetchMessages(jid, 20) // últimos 20 mensajes
|
|
698
|
+
await sock.newsletterReactMessage(jid, serverId, '❤️')
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
**Enviar un mensaje a un canal** es igual que a cualquier chat, usando el JID del canal (termina en `@newsletter`):
|
|
702
|
+
|
|
703
|
+
```javascript
|
|
704
|
+
await sock.sendMessage(canalJid, { text: 'Novedades de hoy 🎉' })
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
> Nota de mantenimiento (heredada de v7.0.4): WhatsApp movió los endpoints internos de `follow`/`unfollow` a una versión `_v2`; este fork ya usa los IDs de consulta vigentes, así que el seguimiento de canales no debería fallar por IDs vencidos.
|
|
708
|
+
|
|
709
|
+
---
|
|
710
|
+
|
|
335
711
|
## ✨ Características
|
|
336
712
|
|
|
337
713
|
### General
|
|
@@ -339,6 +715,7 @@ export default handler
|
|
|
339
715
|
- 📸 Mensajes multimedia (imágenes, video, audio, documentos)
|
|
340
716
|
- 🔘 **Botones nativos reales, sin imports sueltos** *(v1.9.0)*
|
|
341
717
|
- 🖼️ **Previsualización automática de links en botones y mensajes** *(v1.9.0)*
|
|
718
|
+
- 🌐 **HTML embebido en WhatsApp con `sock.sendHtml`** *(v7.1.0)* — WebView sandboxed dentro del bocadillo, con patrón documentado para sitios dinámicos + BD
|
|
342
719
|
- 👥 Soporte para grupos y chats privados
|
|
343
720
|
|
|
344
721
|
### Técnicas
|
package/lib/Defaults/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { proto } from "../../WAProto/index.js";
|
|
|
2
2
|
import { makeLibSignalRepository } from "../Signal/libsignal.js";
|
|
3
3
|
import { Browsers } from "../Utils/browser-utils.js";
|
|
4
4
|
import logger from "../Utils/logger.js";
|
|
5
|
-
const version = [2, 3000,
|
|
5
|
+
const version = [2, 3000, 1047406223];
|
|
6
6
|
export const UNAUTHORIZED_CODES = [401, 403, 419];
|
|
7
7
|
export const DEFAULT_ORIGIN = "https://web.whatsapp.com";
|
|
8
8
|
export const CALL_VIDEO_PREFIX = "https://call.whatsapp.com/video/";
|
|
@@ -43,6 +43,7 @@ export const PROCESSABLE_HISTORY_TYPES = [
|
|
|
43
43
|
proto.HistorySync.HistorySyncType.NON_BLOCKING_DATA,
|
|
44
44
|
proto.HistorySync.HistorySyncType.INITIAL_STATUS_V3,
|
|
45
45
|
];
|
|
46
|
+
export const HISTORY_SYNC_PAUSED_TIMEOUT_MS = 120000;
|
|
46
47
|
export const DEFAULT_CONNECTION_CONFIG = {
|
|
47
48
|
version: version,
|
|
48
49
|
browser: Browsers.macOS("Chrome"),
|