@fer2809fl/baileys 1.4.9 → 7.0.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 +21 -674
- package/README.md +556 -523
- package/WAProto/GenerateStatics.sh +3 -4
- package/WAProto/WAProto.proto +1215 -511
- package/WAProto/fix-imports.js +85 -0
- package/WAProto/index.d.ts +4347 -45387
- package/WAProto/index.js +65475 -137445
- package/engine-requirements.js +10 -0
- package/lib/Defaults/index.d.ts +34 -18
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +95 -67
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +2 -5
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +4 -3
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +7 -41
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +4 -4
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +37 -60
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -11
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -57
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +2 -1
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +7 -44
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +3 -2
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +7 -15
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +8 -11
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +2 -1
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +9 -12
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +2 -5
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +3 -2
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +12 -37
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +7 -6
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +27 -42
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-message-key.js +4 -7
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/libsignal.d.ts +5 -3
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +347 -90
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Signal/lid-mapping.d.ts +23 -0
- package/lib/Signal/lid-mapping.d.ts.map +1 -0
- package/lib/Signal/lid-mapping.js +277 -0
- package/lib/Signal/lid-mapping.js.map +1 -0
- package/lib/Socket/Client/index.d.ts +3 -2
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -18
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/types.d.ts +4 -4
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +4 -6
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +3 -3
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +21 -78
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +205 -93
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +162 -43
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +77 -28
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +639 -248
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +340 -0
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +434 -0
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +93 -46
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +260 -102
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +253 -98
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +11 -9
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +192 -83
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +1314 -559
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +190 -75
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +937 -581
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +4 -0
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +62 -0
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +129 -73
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +373 -222
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/smgss.d.ts +119 -0
- package/lib/Socket/smgss.d.ts.map +1 -0
- package/lib/Socket/smgss.js +453 -0
- package/lib/Socket/smgss.js.map +1 -0
- package/lib/Socket/socket.d.ts +59 -270
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +738 -326
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Store/index.d.ts +4 -2
- package/lib/Store/index.d.ts.map +1 -0
- package/lib/Store/index.js +4 -8
- package/lib/Store/index.js.map +1 -0
- package/lib/Store/make-in-memory-store.d.ts +74 -60
- package/lib/Store/make-in-memory-store.d.ts.map +1 -0
- package/lib/Store/make-in-memory-store.js +130 -119
- package/lib/Store/make-in-memory-store.js.map +1 -0
- package/lib/Store/make-ordered-dictionary.d.ts +4 -3
- package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
- package/lib/Store/make-ordered-dictionary.js +5 -6
- package/lib/Store/make-ordered-dictionary.js.map +1 -0
- package/lib/Store/object-repository.d.ts +6 -3
- package/lib/Store/object-repository.d.ts.map +1 -0
- package/lib/Store/object-repository.js +2 -5
- package/lib/Store/object-repository.js.map +1 -0
- package/lib/Types/Auth.d.ts +19 -5
- package/lib/Types/Auth.d.ts.map +1 -0
- package/lib/Types/Auth.js +2 -2
- package/lib/Types/Auth.js.map +1 -0
- package/lib/Types/Bussines.d.ts +25 -0
- package/lib/Types/Bussines.d.ts.map +1 -0
- package/lib/Types/Bussines.js +2 -0
- package/lib/Types/Bussines.js.map +1 -0
- package/lib/Types/Call.d.ts +3 -1
- package/lib/Types/Call.d.ts.map +1 -0
- package/lib/Types/Call.js +2 -2
- package/lib/Types/Call.js.map +1 -0
- package/lib/Types/Chat.d.ts +24 -9
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +8 -4
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +7 -4
- package/lib/Types/Contact.d.ts.map +1 -0
- package/lib/Types/Contact.js +2 -2
- package/lib/Types/Contact.js.map +1 -0
- package/lib/Types/Events.d.ts +90 -33
- package/lib/Types/Events.d.ts.map +1 -0
- package/lib/Types/Events.js +2 -2
- package/lib/Types/Events.js.map +1 -0
- package/lib/Types/GroupMetadata.d.ts +16 -9
- package/lib/Types/GroupMetadata.d.ts.map +1 -0
- package/lib/Types/GroupMetadata.js +2 -2
- package/lib/Types/GroupMetadata.js.map +1 -0
- package/lib/Types/Label.d.ts +12 -0
- package/lib/Types/Label.d.ts.map +1 -0
- package/lib/Types/Label.js +3 -5
- package/lib/Types/Label.js.map +1 -0
- package/lib/Types/LabelAssociation.d.ts +1 -0
- package/lib/Types/LabelAssociation.d.ts.map +1 -0
- package/lib/Types/LabelAssociation.js +3 -5
- package/lib/Types/LabelAssociation.js.map +1 -0
- package/lib/Types/Message.d.ts +176 -148
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +15 -7
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Mex.d.ts +154 -0
- package/lib/Types/Mex.d.ts.map +1 -0
- package/lib/Types/Mex.js +39 -0
- package/lib/Types/Mex.js.map +1 -0
- package/lib/Types/Product.d.ts +2 -1
- package/lib/Types/Product.d.ts.map +1 -0
- package/lib/Types/Product.js +2 -2
- package/lib/Types/Product.js.map +1 -0
- package/lib/Types/Signal.d.ts +32 -2
- package/lib/Types/Signal.d.ts.map +1 -0
- package/lib/Types/Signal.js +2 -2
- package/lib/Types/Signal.js.map +1 -0
- package/lib/Types/Socket.d.ts +46 -20
- package/lib/Types/Socket.d.ts.map +1 -0
- package/lib/Types/Socket.js +3 -2
- package/lib/Types/Socket.js.map +1 -0
- package/lib/Types/State.d.ts +79 -2
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +56 -2
- package/lib/Types/State.js.map +1 -0
- package/lib/Types/USync.d.ts +3 -2
- package/lib/Types/USync.d.ts.map +1 -0
- package/lib/Types/USync.js +2 -2
- package/lib/Types/USync.js.map +1 -0
- package/lib/Types/index.d.ts +16 -14
- package/lib/Types/index.d.ts.map +1 -0
- package/lib/Types/index.js +15 -31
- package/lib/Types/index.js.map +1 -0
- package/lib/Utils/auth-utils.d.ts +10 -4
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +242 -151
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts +4 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -0
- package/lib/Utils/browser-utils.js +29 -0
- package/lib/Utils/browser-utils.js.map +1 -0
- package/lib/Utils/business.d.ts +3 -2
- package/lib/Utils/business.d.ts.map +1 -0
- package/lib/Utils/business.js +66 -69
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/button-handler.d.ts +28 -0
- package/lib/Utils/button-handler.d.ts.map +1 -0
- package/lib/Utils/button-handler.js +79 -90
- package/lib/Utils/button-handler.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +42 -12
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +380 -238
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
- package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
- package/lib/Utils/companion-reg-client-utils.js +35 -0
- package/lib/Utils/companion-reg-client-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +11 -14
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +41 -116
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +36 -5
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +173 -63
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +8 -7
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +174 -70
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +20 -17
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +159 -207
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +16 -11
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +93 -53
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/identity-change-handler.d.ts +44 -0
- package/lib/Utils/identity-change-handler.d.ts.map +1 -0
- package/lib/Utils/identity-change-handler.js +50 -0
- package/lib/Utils/identity-change-handler.js.map +1 -0
- package/lib/Utils/index.d.ts +30 -18
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +30 -34
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/interactive.d.ts +60 -0
- package/lib/Utils/interactive.d.ts.map +1 -0
- package/lib/Utils/interactive.js +87 -117
- package/lib/Utils/interactive.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +4 -4
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +17 -58
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +8 -6
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -10
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +8 -12
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +3 -46
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +2 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +24 -34
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/message-composer.d.ts +93 -0
- package/lib/Utils/message-composer.d.ts.map +1 -0
- package/lib/Utils/message-composer.js +311 -0
- package/lib/Utils/message-composer.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +115 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +265 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +82 -40
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +674 -677
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages-newsletter.d.ts +74 -0
- package/lib/Utils/messages-newsletter.d.ts.map +1 -0
- package/lib/Utils/messages-newsletter.js +128 -0
- package/lib/Utils/messages-newsletter.js.map +1 -0
- package/lib/Utils/messages.d.ts +38 -14
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +835 -602
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +9 -8
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +149 -98
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/offline-node-processor.d.ts +17 -0
- package/lib/Utils/offline-node-processor.d.ts.map +1 -0
- package/lib/Utils/offline-node-processor.js +40 -0
- package/lib/Utils/offline-node-processor.js.map +1 -0
- package/lib/Utils/pre-key-manager.d.ts +28 -0
- package/lib/Utils/pre-key-manager.d.ts.map +1 -0
- package/lib/Utils/pre-key-manager.js +106 -0
- package/lib/Utils/pre-key-manager.js.map +1 -0
- package/lib/Utils/process-message.d.ts +30 -12
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +438 -230
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/reporting-utils.d.ts +11 -0
- package/lib/Utils/reporting-utils.d.ts.map +1 -0
- package/lib/Utils/reporting-utils.js +258 -0
- package/lib/Utils/reporting-utils.js.map +1 -0
- package/lib/Utils/shortcake-crypto.d.ts +36 -0
- package/lib/Utils/shortcake-crypto.d.ts.map +1 -0
- package/lib/Utils/shortcake-crypto.js +71 -0
- package/lib/Utils/shortcake-crypto.js.map +1 -0
- package/lib/Utils/shortcake.d.ts +36 -0
- package/lib/Utils/shortcake.d.ts.map +1 -0
- package/lib/Utils/shortcake.js +162 -0
- package/lib/Utils/shortcake.js.map +1 -0
- package/lib/Utils/signal.d.ts +20 -6
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +112 -64
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/stanza-ack.d.ts +11 -0
- package/lib/Utils/stanza-ack.d.ts.map +1 -0
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/stanza-ack.js.map +1 -0
- package/lib/Utils/sync-action-utils.d.ts +19 -0
- package/lib/Utils/sync-action-utils.d.ts.map +1 -0
- package/lib/Utils/sync-action-utils.js +49 -0
- package/lib/Utils/sync-action-utils.js.map +1 -0
- package/lib/Utils/tc-token-utils.d.ts +37 -0
- package/lib/Utils/tc-token-utils.d.ts.map +1 -0
- package/lib/Utils/tc-token-utils.js +164 -0
- package/lib/Utils/tc-token-utils.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +40 -64
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/use-single-file-auth-state.d.ts +6 -0
- package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-single-file-auth-state.js +111 -0
- package/lib/Utils/use-single-file-auth-state.js.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts +14 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.js +107 -0
- package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +5 -3
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +82 -101
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +1 -0
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +10 -12
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +2 -1
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +49 -52
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/encode.d.ts +2 -1
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +19 -49
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +5 -4
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +46 -43
- package/lib/WABinary/generic-utils.js.map +1 -0
- package/lib/WABinary/index.d.ts +6 -5
- package/lib/WABinary/index.d.ts.map +1 -0
- package/lib/WABinary/index.js +6 -21
- package/lib/WABinary/index.js.map +1 -0
- package/lib/WABinary/jid-utils.d.ts +32 -10
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +103 -59
- package/lib/WABinary/jid-utils.js.map +1 -0
- package/lib/WABinary/types.d.ts +2 -1
- package/lib/WABinary/types.d.ts.map +1 -0
- package/lib/WABinary/types.js +2 -2
- package/lib/WABinary/types.js.map +1 -0
- package/lib/WAM/BinaryInfo.d.ts +2 -1
- package/lib/WAM/BinaryInfo.d.ts.map +1 -0
- package/lib/WAM/BinaryInfo.js +2 -5
- package/lib/WAM/BinaryInfo.js.map +1 -0
- package/lib/WAM/constants.d.ts +5 -3
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +19071 -11568
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +2 -1
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +17 -22
- package/lib/WAM/encode.js.map +1 -0
- package/lib/WAM/index.d.ts +4 -3
- package/lib/WAM/index.d.ts.map +1 -0
- package/lib/WAM/index.js +4 -19
- package/lib/WAM/index.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +8 -11
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +6 -4
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +6 -20
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +6 -4
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +44 -35
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +10 -5
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +10 -5
- package/lib/WAUSync/USyncUser.js.map +1 -0
- package/lib/WAUSync/index.d.ts +4 -3
- package/lib/WAUSync/index.d.ts.map +1 -0
- package/lib/WAUSync/index.js +4 -19
- package/lib/WAUSync/index.js.map +1 -0
- package/lib/index.d.ts +12 -15
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +15 -48
- package/lib/index.js.map +1 -0
- package/package.json +44 -64
- package/WAProto/index.ts.ts +0 -53473
- package/WAProto/n +0 -1
- package/lib/Baileys.jpeg +0 -0
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/n +0 -1
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Signal/n +0 -1
- package/lib/Socket/Client/n +0 -1
- package/lib/Socket/n +0 -1
- package/lib/Socket/setup.js +0 -480
- package/lib/Socket/setup.ts +0 -622
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Socket/usync.js +0 -70
- package/lib/Store/n +0 -1
- package/lib/Types/Newsletter.d.ts +0 -79
- package/lib/Types/Newsletter.js +0 -18
- package/lib/Types/n +0 -1
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/baileys-event-stream.js +0 -63
- package/lib/Utils/error-handler.js +0 -37
- package/lib/Utils/n +0 -1
- package/lib/WABinary/jid-utils.js.bak +0 -83
- package/lib/WABinary/n +0 -1
- package/lib/WAM/n +0 -1
- package/lib/WAUSync/Protocols/n +0 -1
- package/lib/WAUSync/n +0 -1
- package/lib/n +0 -1
package/README.md
CHANGED
|
@@ -1,661 +1,694 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# ⚡ ASTA-BOTS
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
### API de WhatsApp Web para Node.js
|
|
5
|
+
### Librería de WhatsApp Web para bots, en TypeScript
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*Conéctate a WhatsApp Web directamente desde Node.js sin navegadores ni Selenium*
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+

|
|
14
11
|
|
|
15
12
|
</div>
|
|
16
13
|
|
|
17
|
-
|
|
14
|
+
<br/>
|
|
15
|
+
|
|
16
|
+
> [!NOTE]
|
|
17
|
+
> ASTA-BOTS no requiere Selenium, Puppeteer ni ningún navegador para funcionar. Se conecta directamente a WhatsApp Web mediante un **WebSocket**, lo que la hace mucho más liviana en consumo de RAM y CPU en comparación con soluciones basadas en navegador.
|
|
18
|
+
|
|
19
|
+
## Índice
|
|
20
|
+
|
|
21
|
+
- [¿Qué es ASTA-BOTS?](#qué-es-asta-bots)
|
|
22
|
+
- [Características](#características)
|
|
23
|
+
- [Instalación](#instalación)
|
|
24
|
+
- [Inicio rápido](#inicio-rápido)
|
|
25
|
+
- [Vinculación de la cuenta](#vinculación-de-la-cuenta)
|
|
26
|
+
- [Guardado de credenciales](#guardado-de-credenciales)
|
|
27
|
+
- [Métodos de mensajería](#métodos-de-mensajería)
|
|
28
|
+
- [`sendMessage`](#sendmessage-el-método-principal)
|
|
29
|
+
- [Mensajes de texto](#mensajes-de-texto)
|
|
30
|
+
- [Mensajes multimedia](#mensajes-multimedia)
|
|
31
|
+
- [Procesar medios sin enviarlos](#procesar-medios-sin-enviarlos)
|
|
32
|
+
- [Ubicación y contactos](#ubicación-y-contactos)
|
|
33
|
+
- [Encuestas, reacciones y respuestas a botones](#encuestas-reacciones-y-respuestas-a-botones)
|
|
34
|
+
- [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel)
|
|
35
|
+
- [Mensajes crudos (smgss): pagos, productos, álbumes, eventos y más](#mensajes-crudos-smgss-pagos-productos-álbumes-eventos-y-más)
|
|
36
|
+
- [Mensajes "raw" (proto armado a mano)](#mensajes-raw-proto-armado-a-mano)
|
|
37
|
+
- [Editar, eliminar, reenviar y fijar](#editar-eliminar-reenviar-y-fijar)
|
|
38
|
+
- [Mensajes enriquecidos](#mensajes-enriquecidos)
|
|
39
|
+
- [Marcar un mensaje como generado por IA](#marcar-un-mensaje-como-generado-por-ia)
|
|
40
|
+
- [Estados (historias)](#estados-historias)
|
|
41
|
+
- [Recibos, lectura y presencia](#recibos-lectura-y-presencia)
|
|
42
|
+
- [Grupos, comunidades y canales](#grupos-comunidades-y-canales)
|
|
43
|
+
- [Perfil, privacidad y negocios](#perfil-privacidad-y-negocios)
|
|
44
|
+
- [Store (caché en memoria)](#store-caché-en-memoria)
|
|
45
|
+
- [Utilidades ASTA-BOTS](#utilidades-asta-bots)
|
|
46
|
+
- [`resolveJid`: resolución automática de JID](#resolvejid-resolución-automática-de-jid)
|
|
47
|
+
- [Sistema de botones de conveniencia](#sistema-de-botones-de-conveniencia)
|
|
48
|
+
- [Código de vinculación de marca](#código-de-vinculación-de-marca)
|
|
49
|
+
- [Aviso legal](#aviso-legal)
|
|
50
|
+
- [Créditos](#créditos)
|
|
51
|
+
|
|
52
|
+
## ¿Qué es ASTA-BOTS?
|
|
53
|
+
|
|
54
|
+
**ASTA-BOTS** es una librería para conectarse a WhatsApp Web de forma directa, sin depender de un navegador ni de librerías de automatización como Selenium o Puppeteer. Toda la comunicación con WhatsApp ocurre a través de un **WebSocket**, tal como lo hace la propia versión web de WhatsApp, lo que se traduce en una librería rápida y liviana en recursos.
|
|
55
|
+
|
|
56
|
+
Es un fork de **Baileys**, y conserva casi toda su base: el protocolo, el cifrado, la arquitectura del socket y el manejo de credenciales. Además, incorpora algunos métodos para enviar mensajes con contenido enriquecido (tablas, listas, código y LaTeX), botones/listas/carousel nativos de WhatsApp, un dispatcher para contenido avanzado (pagos, productos, álbumes, eventos), y utilidades propias de **ASTA-BOTS** para resolución automática de JID y botones de conveniencia — más detalle en las secciones correspondientes.
|
|
57
|
+
|
|
58
|
+
Este README está enfocado principalmente en explicar **cómo enviar cada tipo de mensaje**, ya que es lo que más se necesita a la hora de integrar la librería en un proyecto real.
|
|
59
|
+
|
|
60
|
+
## Características
|
|
61
|
+
|
|
62
|
+
- 🔌 Conexión directa por WebSocket, sin navegador de por medio.
|
|
63
|
+
- 💬 Envío de todo tipo de mensajes: texto, imágenes, video, audio, notas de voz, documentos, stickers, ubicación, contactos, encuestas y más.
|
|
64
|
+
- 🔘 Botones, listas de selección, templates y carousel (interactive/native_flow), con el nodo `biz` necesario para que WhatsApp los acepte y renderice.
|
|
65
|
+
- ⚡ **Resolución automática de JID** (`resolveJid`): detecta el destinatario de un comando por citado, mención o argumento, sin pasar el número a mano.
|
|
66
|
+
- ⚡ **Helpers de botones listos para usar** (`sendQuickReplyButtons`, `sendUrlButton`, `sendListMenu`, etc.) y un detector de respuestas de botón (`setupButtonHandler`) para enrutarlas directo a tus comandos.
|
|
67
|
+
- 💳 Contenido avanzado vía `smgss`: pedidos de pago, cards de producto, álbumes, eventos, resultados de encuesta e historias por grupo.
|
|
68
|
+
- 🖼️ Procesamiento de medios (`resize`, `convert`, `toSticker`, `compress`, `metadata`) sobre cualquier `Buffer`, sin necesidad de enviarlo.
|
|
69
|
+
- 🛠️ Salida de emergencia `raw: true` para mandar un mensaje armado a mano cuando ningún builder alcanza.
|
|
70
|
+
- 🧩 Métodos para enviar mensajes enriquecidos: tablas, listas, código y LaTeX.
|
|
71
|
+
- 🤖 Marca de "generado por IA" en mensajes de chats individuales.
|
|
72
|
+
- 📸 Publicación de estados (historias) con notificación por menciones, tanto a contactos individuales como a grupos.
|
|
73
|
+
- 👥 Administración completa de grupos, comunidades y canales de difusión.
|
|
74
|
+
- 🔐 2 métodos de vinculación: código QR o código de emparejamiento (con código de marca **`ASTABOTS`** por defecto).
|
|
75
|
+
- 🗂️ 3 formas de guardar credenciales: por archivos múltiples, un solo archivo o SQLite.
|
|
76
|
+
|
|
77
|
+
## Instalación
|
|
78
|
+
|
|
79
|
+
Instalación directa desde GitHub:
|
|
18
80
|
|
|
19
|
-
|
|
81
|
+
```bash
|
|
82
|
+
npm install github:TU-USUARIO/asta-bots
|
|
83
|
+
```
|
|
20
84
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `sendUrlButton` — Botón que abre un enlace en el navegador
|
|
25
|
-
- `sendQuickReplyButtons` — Botones de respuesta rápida
|
|
26
|
-
- `sendCallButton` — Botón para iniciar una llamada telefónica
|
|
27
|
-
- `sendListMenu` — Menú desplegable con secciones y filas
|
|
28
|
-
- `sendInteractiveMessage` — Combinación de botones mixtos (URL + Copiar + Rápido)
|
|
85
|
+
> Cambia `TU-USUARIO/asta-bots` por la ruta de tu propio repositorio de ASTA-BOTS en GitHub.
|
|
86
|
+
>
|
|
87
|
+
> **Requisito:** Node.js **20** o superior.
|
|
29
88
|
|
|
30
|
-
|
|
31
|
-
- **Error en macOS** — Se reparó un bug crítico que impedía iniciar sesión correctamente en dispositivos Mac. El proceso de pairing/QR ahora funciona de forma estable en macOS.
|
|
89
|
+
Una vez instalada, importala en tu proyecto:
|
|
32
90
|
|
|
33
|
-
|
|
91
|
+
```ts
|
|
92
|
+
import makeWASocket from 'baileys'
|
|
93
|
+
```
|
|
34
94
|
|
|
35
|
-
##
|
|
95
|
+
## Inicio rápido
|
|
36
96
|
|
|
37
|
-
|
|
97
|
+
Para conectar una cuenta de WhatsApp a ASTA-BOTS hacen falta dos cosas: **cómo se guardan las credenciales de la sesión** y **cómo se vincula el dispositivo** (que puede ser con código QR o con código de emparejamiento).
|
|
38
98
|
|
|
39
|
-
|
|
40
|
-
> Úsala de forma responsable — nada de spam ni actividades maliciosas.
|
|
99
|
+
### Vinculación de la cuenta
|
|
41
100
|
|
|
42
|
-
|
|
101
|
+
ASTA-BOTS soporta los **2 métodos de vinculación** que ofrece WhatsApp:
|
|
43
102
|
|
|
44
|
-
|
|
103
|
+
#### 1. Con código QR
|
|
45
104
|
|
|
46
|
-
|
|
105
|
+
```ts
|
|
106
|
+
import makeWASocket, { useMultiFileAuthState } from 'baileys'
|
|
47
107
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
npm install @fer2809fl/baileys
|
|
51
|
-
yarn add @fer2809fl/baileys
|
|
52
|
-
```
|
|
108
|
+
async function iniciar() {
|
|
109
|
+
const { state, saveCreds } = await useMultiFileAuthState('sesion')
|
|
53
110
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
```
|
|
111
|
+
const sock = makeWASocket({
|
|
112
|
+
auth: state,
|
|
113
|
+
printQRInTerminal: true
|
|
114
|
+
})
|
|
59
115
|
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
npm install @whiskeysockets/baileys
|
|
63
|
-
yarn add @whiskeysockets/baileys
|
|
64
|
-
```
|
|
116
|
+
sock.ev.on('creds.update', saveCreds)
|
|
65
117
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"dependencies": {
|
|
70
|
-
"@fer2809fl/baileys": "^1.8.9"
|
|
71
|
-
}
|
|
118
|
+
sock.ev.on('connection.update', (update) => {
|
|
119
|
+
console.log(update)
|
|
120
|
+
})
|
|
72
121
|
}
|
|
122
|
+
|
|
123
|
+
iniciar()
|
|
73
124
|
```
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
125
|
+
|
|
126
|
+
Al iniciar, se imprime un código QR en la terminal que hay que escanear desde WhatsApp (Dispositivos vinculados → Vincular un dispositivo).
|
|
127
|
+
|
|
128
|
+
#### 2. Con código de emparejamiento
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const sock = makeWASocket({
|
|
132
|
+
auth: state,
|
|
133
|
+
printQRInTerminal: false
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
if (!sock.authState?.creds?.registered) {
|
|
137
|
+
const codigo = await sock.requestPairingCode('5215512345678') // número con código de país, sin +
|
|
138
|
+
console.log('Tu código de emparejamiento es:', codigo)
|
|
79
139
|
}
|
|
80
140
|
```
|
|
81
141
|
|
|
82
|
-
|
|
142
|
+
En este caso, en vez de escanear un QR, WhatsApp te muestra en el celular un código de 8 caracteres que hay que ingresar desde la opción "Vincular con número de teléfono".
|
|
83
143
|
|
|
84
|
-
|
|
144
|
+
### Guardado de credenciales
|
|
85
145
|
|
|
86
|
-
|
|
87
|
-
```javascript
|
|
88
|
-
const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
|
|
146
|
+
Una vez vinculada la cuenta, ASTA-BOTS necesita persistir las credenciales para no tener que volver a escanear el QR o pedir el código cada vez. Hay **3 formas** de hacerlo, todas exportadas por la librería:
|
|
89
147
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
printQRInTerminal: true
|
|
96
|
-
})
|
|
148
|
+
| Método | Cómo guarda los datos | Cuándo conviene |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| `useMultiFileAuthState('carpeta')` | Un archivo por cada clave, dentro de una carpeta | Uso por defecto, ideal para desarrollo y bots simples |
|
|
151
|
+
| `useSingleFileAuthState('archivo.json')` | Todo en un único archivo JSON | Cuando querés portar la sesión fácilmente como un solo archivo |
|
|
152
|
+
| `useSqliteAuthState({ dbPath: 'sesion.db' })` | En una base de datos SQLite (requiere `better-sqlite3`) | Bots con mucho volumen de claves o que necesitan acceso concurrente |
|
|
97
153
|
|
|
98
|
-
|
|
99
|
-
if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
|
|
100
|
-
if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
|
|
101
|
-
})
|
|
154
|
+
Ejemplo con SQLite:
|
|
102
155
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (!m.message) return
|
|
156
|
+
```ts
|
|
157
|
+
import makeWASocket, { useSqliteAuthState } from 'baileys'
|
|
106
158
|
|
|
107
|
-
|
|
108
|
-
text: '¡Hola! Soy un bot de Delta!'
|
|
109
|
-
})
|
|
110
|
-
})
|
|
159
|
+
const { state, saveCreds } = await useSqliteAuthState({ dbPath: 'sesion.db' })
|
|
111
160
|
|
|
112
|
-
|
|
113
|
-
|
|
161
|
+
const sock = makeWASocket({ auth: state })
|
|
162
|
+
sock.ev.on('creds.update', saveCreds)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Métodos de mensajería
|
|
166
|
+
|
|
167
|
+
Todos los métodos de envío viven dentro del objeto `sock` que devuelve `makeWASocket()`. La firma general es siempre parecida: reciben el **JID** (identificador del chat) y el contenido del mensaje.
|
|
168
|
+
|
|
169
|
+
Formatos de JID más comunes:
|
|
170
|
+
|
|
171
|
+
| Tipo de chat | Formato de JID |
|
|
172
|
+
|---|---|
|
|
173
|
+
| Contacto individual | `5215512345678@s.whatsapp.net` |
|
|
174
|
+
| Grupo | `1234567890@g.us` |
|
|
175
|
+
| Canal de difusión (newsletter) | `1234567890@newsletter` |
|
|
176
|
+
| Estado (historia) | `status@broadcast` |
|
|
177
|
+
| Identificador LID | `123456789@lid` |
|
|
178
|
+
|
|
179
|
+
> **¿Qué es un LID?** Es un identificador que WhatsApp usa como capa de privacidad: en ciertos contextos (por ejemplo, dentro de comunidades) un contacto no se identifica con su número de teléfono (`@s.whatsapp.net`) sino con un `@lid`, un ID que no revela el número real. ASTA-BOTS mantiene internamente una tabla de equivalencias entre el LID y el número de teléfono real (`LIDMappingStore`) para poder cifrar y enviar los mensajes correctamente sin que tengas que hacer nada manualmente. Si necesitás revisarlo, `isLidUser(jid)` te dice si un JID es de tipo LID.
|
|
114
180
|
|
|
115
|
-
|
|
181
|
+
### `sendMessage` — el método principal
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
await sock.sendMessage(jid, contenido, opciones)
|
|
116
185
|
```
|
|
117
186
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
187
|
+
- **`jid`** *(string)*: destinatario del mensaje (contacto, grupo, canal o `status@broadcast` para estados).
|
|
188
|
+
- **`contenido`** *(`AnyMessageContent`)*: define qué tipo de mensaje se envía (texto, imagen, video, encuesta, botones, etc. — ver detalle abajo).
|
|
189
|
+
- **`opciones`** *(`MiscMessageGenerationOptions`, opcional)*: permite, entre otras cosas:
|
|
190
|
+
- `quoted`: el mensaje al que se responde (citar).
|
|
191
|
+
- `messageId`: forzar un ID de mensaje propio.
|
|
192
|
+
- `ephemeralExpiration`: duración de los mensajes efímeros.
|
|
193
|
+
- `mediaUploadTimeoutMs`: tiempo máximo para subir archivos.
|
|
122
194
|
|
|
123
|
-
|
|
124
|
-
const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
|
|
125
|
-
|
|
126
|
-
const melody = makeWASocket({
|
|
127
|
-
auth: state,
|
|
128
|
-
printQRInTerminal: true
|
|
129
|
-
})
|
|
195
|
+
Todos los métodos de envío devuelven una promesa que se resuelve con el mensaje ya construido y enviado (`WAMessage`), el cual podés guardar para citarlo, editarlo o eliminarlo más adelante.
|
|
130
196
|
|
|
131
|
-
|
|
132
|
-
if (connection === 'close') {
|
|
133
|
-
const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
|
|
134
|
-
if (shouldReconnect) startBot()
|
|
135
|
-
}
|
|
136
|
-
if (connection === 'open') console.log('✅ ¡Conectado!')
|
|
137
|
-
})
|
|
197
|
+
El resto de los métodos de esta sección (`sendTable`, `sendList`, `sendCodeBlock`, etc.) son en realidad **atajos**: por debajo construyen el `contenido` correcto y llaman a `relayMessage` por vos, para que no tengas que armar la estructura del mensaje a mano.
|
|
138
198
|
|
|
139
|
-
|
|
140
|
-
const m = messages[0]
|
|
141
|
-
if (!m.message) return
|
|
199
|
+
> Si el `contenido` incluye botones, lista, template o carousel, `sendMessage` agrega automáticamente el nodo `biz` que WhatsApp exige para aceptarlos y renderizarlos — no hace falta que hagas nada extra para eso.
|
|
142
200
|
|
|
143
|
-
|
|
144
|
-
text: '¡Hola! Soy un bot de Delta!'
|
|
145
|
-
})
|
|
146
|
-
})
|
|
201
|
+
### Mensajes de texto
|
|
147
202
|
|
|
148
|
-
|
|
149
|
-
}
|
|
203
|
+
```ts
|
|
204
|
+
await sock.sendMessage(jid, { text: 'Hola, esto es ASTA-BOTS 👋' })
|
|
205
|
+
```
|
|
150
206
|
|
|
151
|
-
|
|
207
|
+
Con vista previa de enlace desactivada:
|
|
208
|
+
|
|
209
|
+
```ts
|
|
210
|
+
await sock.sendMessage(jid, { text: 'Mirá esto: https://ejemplo.com', linkPreview: null })
|
|
152
211
|
```
|
|
153
212
|
|
|
154
|
-
|
|
213
|
+
Citando un mensaje:
|
|
155
214
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
- 🚀 Optimizado para mayor velocidad y estabilidad
|
|
160
|
-
- 📸 Mensajes multimedia (imágenes, video, audio, documentos)
|
|
161
|
-
- 🤖 Comandos personalizados fáciles de implementar
|
|
162
|
-
- 👥 Soporte para grupos y chats privados
|
|
163
|
-
- 🔘 **Mensajes interactivos con botones, listas y más** *(nuevo en v1.8.9)*
|
|
164
|
-
|
|
165
|
-
### Técnicas
|
|
166
|
-
- ⚡ Sin Selenium — Conexión directa vía WebSocket
|
|
167
|
-
- 💾 Super eficiente — Bajo consumo de RAM
|
|
168
|
-
- 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
|
|
169
|
-
- 🔷 Totalmente tipado — TypeScript y JavaScript
|
|
170
|
-
- 🔄 Reconexión automática ante desconexiones
|
|
171
|
-
- 🔐 Sesiones persistentes guardadas localmente
|
|
172
|
-
- 🌐 API completa de WhatsApp Web
|
|
173
|
-
- 🍎 **Compatible con macOS** — Error de pairing reparado *(fix en v1.8.9)*
|
|
215
|
+
```ts
|
|
216
|
+
await sock.sendMessage(jid, { text: 'Respondiendo a tu mensaje' }, { quoted: mensajeOriginal })
|
|
217
|
+
```
|
|
174
218
|
|
|
175
|
-
|
|
219
|
+
### Mensajes multimedia
|
|
220
|
+
|
|
221
|
+
| Tipo | Campo | Ejemplo |
|
|
222
|
+
|---|---|---|
|
|
223
|
+
| Imagen | `image` | `{ image: { url: './foto.jpg' }, caption: 'Mirá esto' }` |
|
|
224
|
+
| Video | `video` | `{ video: { url: './video.mp4' }, caption: 'Un video', gifPlayback: false }` |
|
|
225
|
+
| Nota de voz | `audio` + `ptt: true` | `{ audio: { url: './audio.mp3' }, ptt: true }` |
|
|
226
|
+
| Audio normal | `audio` | `{ audio: { url: './cancion.mp3' }, mimetype: 'audio/mp4' }` |
|
|
227
|
+
| Video nota (círculo) | `video` + `ptv: true` | `{ video: { url: './nota.mp4' }, ptv: true }` |
|
|
228
|
+
| Sticker | `sticker` | `{ sticker: { url: './sticker.webp' } }` |
|
|
229
|
+
| Documento | `document` | `{ document: { url: './archivo.pdf' }, mimetype: 'application/pdf', fileName: 'informe.pdf' }` |
|
|
230
|
+
| Paquete de stickers | `stickerPack` | `{ stickerPack: { name: 'Mi pack', cover: {...}, stickers: [...] } }` |
|
|
231
|
+
| Álbum (varias fotos/videos) | `album` | `{ album: { images: [...], videos: [...] } }` |
|
|
232
|
+
|
|
233
|
+
Ejemplo completo:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
await sock.sendMessage(jid, {
|
|
237
|
+
image: { url: './foto.jpg' },
|
|
238
|
+
caption: 'Foto enviada desde ASTA-BOTS'
|
|
239
|
+
})
|
|
240
|
+
```
|
|
176
241
|
|
|
177
|
-
|
|
242
|
+
> `WAMediaUpload` acepta una URL (`{ url: '...' }`), un `Buffer` o un `Stream`, tanto para archivos locales como remotos.
|
|
178
243
|
|
|
179
|
-
|
|
244
|
+
### Procesar medios sin enviarlos
|
|
180
245
|
|
|
181
|
-
|
|
246
|
+
Además de enviar, el socket expone helpers para procesar imágenes y video directamente sobre un `Buffer`, sin que eso implique mandar ningún mensaje:
|
|
182
247
|
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
const {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
sendCallButton,
|
|
190
|
-
sendListMenu,
|
|
191
|
-
sendInteractiveMessage
|
|
192
|
-
} = require('@fer2809fl/baileys')
|
|
248
|
+
```ts
|
|
249
|
+
const redimensionada = await sock.resize(buffer, 512, 512, { quality: 80 })
|
|
250
|
+
const convertida = await sock.convert(buffer, { to: 'webp' })
|
|
251
|
+
const sticker = await sock.toSticker(buffer, { quality: 80 })
|
|
252
|
+
const comprimida = await sock.compress(buffer, { quality: 50 })
|
|
253
|
+
const info = await sock.metadata(buffer) // { size, mimetype, width, height, duration, ... }
|
|
193
254
|
```
|
|
194
255
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
256
|
+
Usan `sharp` (si está instalado) y caen a `ffmpeg`/`ffprobe` para lo que `sharp` no soporta (video). No afectan la velocidad de la conexión ni del envío de mensajes — son solo utilidades de conveniencia para procesar archivos.
|
|
257
|
+
|
|
258
|
+
### Ubicación y contactos
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
// Ubicación
|
|
262
|
+
await sock.sendMessage(jid, {
|
|
263
|
+
location: { degreesLatitude: 19.4326, degreesLongitude: -99.1332, name: 'CDMX' }
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
// Contacto (vCard)
|
|
267
|
+
await sock.sendMessage(jid, {
|
|
268
|
+
contacts: {
|
|
269
|
+
displayName: 'Soporte',
|
|
270
|
+
contacts: [{ vcard: 'BEGIN:VCARD\nVERSION:3.0\nFN:Soporte\nTEL:+521234567890\nEND:VCARD' }]
|
|
271
|
+
}
|
|
272
|
+
})
|
|
205
273
|
```
|
|
206
274
|
|
|
207
|
-
|
|
275
|
+
### Encuestas, reacciones y respuestas a botones
|
|
208
276
|
|
|
209
|
-
|
|
210
|
-
|
|
277
|
+
```ts
|
|
278
|
+
// Encuesta
|
|
279
|
+
await sock.sendMessage(jid, {
|
|
280
|
+
poll: { name: '¿Cuál prefieres?', values: ['Opción A', 'Opción B'], selectableCount: 1 }
|
|
281
|
+
})
|
|
211
282
|
|
|
212
|
-
|
|
213
|
-
await
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
'npm install asta-bot', // texto que se copiará
|
|
218
|
-
'📋 Copiar Comando' // etiqueta del botón
|
|
219
|
-
)
|
|
283
|
+
// Reacción a un mensaje
|
|
284
|
+
await sock.sendMessage(jid, { react: { text: '🔥', key: mensaje.key } })
|
|
285
|
+
|
|
286
|
+
// Respuesta a un botón / lista (uso interno al procesar interacciones)
|
|
287
|
+
await sock.sendMessage(jid, { buttonReply: { displayText: 'Sí', id: 'btn_si', index: 0 }, type: 'plain' })
|
|
220
288
|
```
|
|
221
289
|
|
|
222
|
-
|
|
290
|
+
### Botones, listas, templates y carousel
|
|
223
291
|
|
|
224
|
-
|
|
225
|
-
Abre un enlace en el navegador al tocar el botón.
|
|
292
|
+
ASTA-BOTS puede armar botones nativos (`native_flow`), listas de selección, templates legados y carousel directamente desde `sock.sendMessage`, sin tener que construir el protobuf a mano. En todos los casos se agrega automáticamente el nodo `biz` necesario para que WhatsApp los acepte.
|
|
226
293
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
294
|
+
**Botones** — soporta respuesta rápida (`id`), enlace (`url`), llamada (`call`), copiar texto (`copy`), una mini-lista embebida (`sections`), un flow crudo (`name` + `paramsJson`), o un botón ya armado con `nativeFlowInfo` (por ejemplo, reenviado de otro lado) — en ese caso se respeta tal cual viene:
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
await sock.sendMessage(jid, {
|
|
298
|
+
text: 'Elegí una opción',
|
|
299
|
+
footer: 'Powered by ASTA-BOTS',
|
|
300
|
+
buttons: [
|
|
301
|
+
{ text: 'Visitar sitio', url: 'https://ejemplo.com' },
|
|
302
|
+
{ text: 'Llamar', call: '+50488888888' },
|
|
303
|
+
{ text: 'Copiar código', copy: 'ABC123' },
|
|
304
|
+
{ text: 'Responder', id: 'opt_1' }
|
|
305
|
+
]
|
|
306
|
+
})
|
|
235
307
|
```
|
|
236
308
|
|
|
237
|
-
|
|
309
|
+
> `buttons`/`sections`/`templateButtons`/`nativeFlow`/`cards` se evalúan **antes** que `text` en el armado interno del mensaje, así que combinar `text` (el cuerpo) junto con cualquiera de estos tipos funciona sin que el texto se coma al resto del contenido.
|
|
310
|
+
|
|
311
|
+
**Lista de selección única:**
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
await sock.sendMessage(jid, {
|
|
315
|
+
description: 'Elegí un producto del catálogo',
|
|
316
|
+
title: 'Catálogo',
|
|
317
|
+
buttonText: 'Ver opciones',
|
|
318
|
+
footer: 'ASTA-BOTS',
|
|
319
|
+
sections: [
|
|
320
|
+
{
|
|
321
|
+
title: 'Sección 1',
|
|
322
|
+
rows: [
|
|
323
|
+
{ title: 'Producto A', rowId: 'a' },
|
|
324
|
+
{ title: 'Producto B', rowId: 'b' }
|
|
325
|
+
]
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
})
|
|
329
|
+
```
|
|
238
330
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
{ id: 'owner', text: '👑 Owner' }
|
|
251
|
-
]
|
|
252
|
-
)
|
|
331
|
+
**Template buttons** (formato legado — solo se renderiza en WhatsApp Web, Desktop e iOS):
|
|
332
|
+
|
|
333
|
+
```ts
|
|
334
|
+
await sock.sendMessage(jid, {
|
|
335
|
+
text: 'Confirmá tu pedido',
|
|
336
|
+
templateButtons: [
|
|
337
|
+
{ text: 'Sí', id: 'yes' },
|
|
338
|
+
{ text: 'Visitar', url: 'https://ejemplo.com' },
|
|
339
|
+
{ text: 'Llamar', call: '+50488888888' }
|
|
340
|
+
]
|
|
341
|
+
})
|
|
253
342
|
```
|
|
254
343
|
|
|
255
|
-
|
|
344
|
+
**Interactive message genérico** (`nativeFlow`), con header de imagen/video/documento:
|
|
345
|
+
|
|
346
|
+
```ts
|
|
347
|
+
await sock.sendMessage(jid, {
|
|
348
|
+
image: { url: 'https://ejemplo.com/foto.jpg' },
|
|
349
|
+
caption: 'Mirá esto',
|
|
350
|
+
title: 'Título',
|
|
351
|
+
subtitle: 'Subtítulo',
|
|
352
|
+
footer: 'ASTA-BOTS',
|
|
353
|
+
nativeFlow: [
|
|
354
|
+
{ text: 'Ver más', url: 'https://ejemplo.com' }
|
|
355
|
+
]
|
|
356
|
+
})
|
|
357
|
+
```
|
|
256
358
|
|
|
257
|
-
|
|
258
|
-
Inicia una llamada al número indicado al tocar el botón.
|
|
359
|
+
**Carousel** (varias cards, cada una con su propio header y botones):
|
|
259
360
|
|
|
260
|
-
```
|
|
261
|
-
await
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
'
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
)
|
|
361
|
+
```ts
|
|
362
|
+
await sock.sendMessage(jid, {
|
|
363
|
+
cards: [
|
|
364
|
+
{ image: { url: 'https://ejemplo.com/1.jpg' }, caption: 'Carta 1', nativeFlow: [{ text: 'Comprar', id: 'buy_1' }] },
|
|
365
|
+
{ image: { url: 'https://ejemplo.com/2.jpg' }, caption: 'Carta 2', nativeFlow: [{ text: 'Comprar', id: 'buy_2' }] }
|
|
366
|
+
]
|
|
367
|
+
})
|
|
268
368
|
```
|
|
269
369
|
|
|
270
|
-
|
|
370
|
+
### Mensajes crudos (smgss): pagos, productos, álbumes, eventos y más
|
|
371
|
+
|
|
372
|
+
Para contenido que no tiene un atajo declarativo simple, ASTA-BOTS incluye un dispatcher (`smgss`) que reconoce el contenido a partir de su forma y lo arma internamente. Se usa igual que cualquier otro contenido, pasándolo directo a `sock.sendMessage(jid, contenido)`:
|
|
373
|
+
|
|
374
|
+
| Contenido | Qué hace |
|
|
375
|
+
|---|---|
|
|
376
|
+
| `{ requestPaymentMessage: {...} }` | Pedido de pago, con nota de texto o sticker adjunto opcional. |
|
|
377
|
+
| `{ productMessage: {...} }` | Card de un producto individual (imagen, precio, descripción). |
|
|
378
|
+
| `{ interactiveButtons: [...] }` | Botones declarativos con header de imagen/video/documento/ubicación/producto. |
|
|
379
|
+
| `{ interactiveMessage: {...} }` | Interactive message armado a mano (media header + botones nativos propios). |
|
|
380
|
+
| `{ interactiveMessage: { carouselMessage: {...} } }` | Carousel armado a mano, con cards en formato de proto crudo. |
|
|
381
|
+
| `{ albumMessage: [...] }` o `{ album: [...] }` | Álbum: manda el contenedor y después cada foto/video asociado. |
|
|
382
|
+
| `{ eventMessage: {...} }` | Evento de WhatsApp (nombre, descripción, fecha, ubicación, link para unirse). |
|
|
383
|
+
| `{ pollResultMessage: {...} }` | Snapshot de resultados de una encuesta. |
|
|
384
|
+
| `{ groupStatusMessage: {...} }` | Historia visible solo para un grupo puntual (distinto al estado normal). |
|
|
385
|
+
|
|
386
|
+
Ejemplo de pedido de pago:
|
|
387
|
+
|
|
388
|
+
```ts
|
|
389
|
+
await sock.sendMessage(jid, {
|
|
390
|
+
requestPaymentMessage: {
|
|
391
|
+
amount: 50000, // en la unidad mínima de la moneda (ej. centavos)
|
|
392
|
+
currency: 'USD',
|
|
393
|
+
from: '0@s.whatsapp.net',
|
|
394
|
+
note: 'Pago por el servicio de este mes'
|
|
395
|
+
}
|
|
396
|
+
})
|
|
397
|
+
```
|
|
271
398
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
{
|
|
283
|
-
title: '📱 COMANDOS BÁSICOS',
|
|
284
|
-
rows: [
|
|
285
|
-
{ id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
|
|
286
|
-
{ id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' },
|
|
287
|
-
{ id: '#owner', title: '👑 Owner', description: 'Info del creador' }
|
|
288
|
-
]
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
title: '🎮 COMANDOS DE GRUPO',
|
|
292
|
-
rows: [
|
|
293
|
-
{ id: '#add', title: '➕ Agregar', description: 'Agregar usuario al grupo' },
|
|
294
|
-
{ id: '#kick', title: '👢 Expulsar', description: 'Expulsar usuario del grupo' },
|
|
295
|
-
{ id: '#promote', title: '⭐ Promover', description: 'Dar admin a un usuario' }
|
|
296
|
-
]
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
title: '🔧 CONFIGURACIÓN',
|
|
300
|
-
rows: [
|
|
301
|
-
{ id: '#sinprefix', title: '⚙️ Sin Prefijo', description: 'Activar/desactivar prefijo' },
|
|
302
|
-
{ id: '#antilink', title: '🔗 Anti Link', description: 'Bloquear enlaces' }
|
|
303
|
-
]
|
|
304
|
-
}
|
|
305
|
-
]
|
|
306
|
-
)
|
|
399
|
+
Ejemplo de álbum:
|
|
400
|
+
|
|
401
|
+
```ts
|
|
402
|
+
await sock.sendMessage(jid, {
|
|
403
|
+
album: [
|
|
404
|
+
{ image: { url: './foto1.jpg' } },
|
|
405
|
+
{ image: { url: './foto2.jpg' } },
|
|
406
|
+
{ video: { url: './video1.mp4' } }
|
|
407
|
+
]
|
|
408
|
+
})
|
|
307
409
|
```
|
|
308
410
|
|
|
309
|
-
|
|
411
|
+
### Mensajes "raw" (proto armado a mano)
|
|
310
412
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
'🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
|
|
319
|
-
[
|
|
320
|
-
{ type: 'url', text: '🌐 GitHub', value: 'https://github.com/Fer2809fl/Asta_bot' },
|
|
321
|
-
{ type: 'copy', text: '📋 Comando Inicio', value: 'npm start' },
|
|
322
|
-
{ type: 'quick', text: '📋 Ver Menú', value: 'menu' }
|
|
323
|
-
]
|
|
324
|
-
)
|
|
413
|
+
Para casos que ningún builder cubre todavía, se puede pasar el contenido del mensaje ya armado como protobuf, agregando `raw: true`. ASTA-BOTS no lo interpreta ni lo transforma — lo manda tal cual:
|
|
414
|
+
|
|
415
|
+
```ts
|
|
416
|
+
await sock.sendMessage(jid, {
|
|
417
|
+
raw: true,
|
|
418
|
+
extendedTextMessage: { text: 'Mensaje armado a mano' }
|
|
419
|
+
})
|
|
325
420
|
```
|
|
326
421
|
|
|
327
|
-
|
|
422
|
+
Es una salida de emergencia para power users; para el 99% de los casos alcanza con los métodos normales de `sendMessage`.
|
|
328
423
|
|
|
329
|
-
###
|
|
330
|
-
|
|
331
|
-
Aquí un plugin listo para usar en tu bot con todos los tipos de botones:
|
|
332
|
-
|
|
333
|
-
```javascript
|
|
334
|
-
// plugins/botones.js
|
|
335
|
-
import {
|
|
336
|
-
sendCopyButton,
|
|
337
|
-
sendUrlButton,
|
|
338
|
-
sendQuickReplyButtons,
|
|
339
|
-
sendCallButton,
|
|
340
|
-
sendListMenu,
|
|
341
|
-
sendInteractiveMessage
|
|
342
|
-
} from '@fer2809fl/baileys'
|
|
343
|
-
|
|
344
|
-
let handler = async (m, { conn, usedPrefix }) => {
|
|
345
|
-
|
|
346
|
-
// #boton1 — Botón Copiar
|
|
347
|
-
if (m.text === `${usedPrefix}boton1`) {
|
|
348
|
-
await sendCopyButton(conn, m.chat,
|
|
349
|
-
'📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
|
|
350
|
-
'npm install asta-bot',
|
|
351
|
-
'📋 Copiar Comando'
|
|
352
|
-
)
|
|
353
|
-
}
|
|
424
|
+
### Editar, eliminar, reenviar y fijar
|
|
354
425
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
'🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
|
|
359
|
-
'https://github.com/Fer2809fl/Asta_bot',
|
|
360
|
-
'🌐 Ver GitHub'
|
|
361
|
-
)
|
|
362
|
-
}
|
|
426
|
+
```ts
|
|
427
|
+
// Editar un mensaje ya enviado
|
|
428
|
+
await sock.sendMessage(jid, { text: 'Texto corregido', edit: mensajeAnterior.key })
|
|
363
429
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
await sendQuickReplyButtons(conn, m.chat,
|
|
367
|
-
'🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
|
|
368
|
-
[
|
|
369
|
-
{ id: 'menu', text: '📋 Ver Menú' },
|
|
370
|
-
{ id: 'info', text: 'ℹ️ Información' },
|
|
371
|
-
{ id: 'owner', text: '👑 Owner' }
|
|
372
|
-
]
|
|
373
|
-
)
|
|
374
|
-
}
|
|
430
|
+
// Eliminar (para todos)
|
|
431
|
+
await sock.sendMessage(jid, { delete: mensaje.key })
|
|
375
432
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
await sendCallButton(conn, m.chat,
|
|
379
|
-
'📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
|
|
380
|
-
'+5214183357841',
|
|
381
|
-
'📞 Llamar Ahora'
|
|
382
|
-
)
|
|
383
|
-
}
|
|
433
|
+
// Reenviar un mensaje
|
|
434
|
+
await sock.sendMessage(jid, { forward: mensajeOriginal })
|
|
384
435
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
'📋 *SELECCIONA UNA OPCIÓN*',
|
|
389
|
-
'Menú Principal',
|
|
390
|
-
[
|
|
391
|
-
{
|
|
392
|
-
title: '📱 COMANDOS BÁSICOS',
|
|
393
|
-
rows: [
|
|
394
|
-
{ id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
|
|
395
|
-
{ id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' },
|
|
396
|
-
{ id: '#owner', title: '👑 Owner', description: 'Info del creador' }
|
|
397
|
-
]
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
title: '🎮 COMANDOS DE GRUPO',
|
|
401
|
-
rows: [
|
|
402
|
-
{ id: '#add', title: '➕ Agregar', description: 'Agregar usuario al grupo' },
|
|
403
|
-
{ id: '#kick', title: '👢 Expulsar', description: 'Expulsar usuario del grupo' },
|
|
404
|
-
{ id: '#promote', title: '⭐ Promover', description: 'Dar admin a un usuario' }
|
|
405
|
-
]
|
|
406
|
-
},
|
|
407
|
-
{
|
|
408
|
-
title: '🔧 CONFIGURACIÓN',
|
|
409
|
-
rows: [
|
|
410
|
-
{ id: '#sinprefix', title: '⚙️ Sin Prefijo', description: 'Activar/desactivar prefijo' },
|
|
411
|
-
{ id: '#antilink', title: '🔗 Anti Link', description: 'Bloquear enlaces' }
|
|
412
|
-
]
|
|
413
|
-
}
|
|
414
|
-
]
|
|
415
|
-
)
|
|
416
|
-
}
|
|
436
|
+
// Fijar un mensaje en el chat (24h, 7 días o 30 días)
|
|
437
|
+
await sock.sendMessage(jid, { pin: mensaje.key, type: 1, time: 86400 })
|
|
438
|
+
```
|
|
417
439
|
|
|
418
|
-
|
|
419
|
-
else if (m.text === `${usedPrefix}boton6`) {
|
|
420
|
-
await sendInteractiveMessage(conn, m.chat,
|
|
421
|
-
'🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
|
|
422
|
-
[
|
|
423
|
-
{ type: 'url', text: '🌐 GitHub', value: 'https://github.com/Fer2809fl/Asta_bot' },
|
|
424
|
-
{ type: 'copy', text: '📋 Comando Inicio', value: 'npm start' },
|
|
425
|
-
{ type: 'quick', text: '📋 Ver Menú', value: 'menu' }
|
|
426
|
-
]
|
|
427
|
-
)
|
|
428
|
-
}
|
|
440
|
+
### Mensajes enriquecidos
|
|
429
441
|
|
|
430
|
-
|
|
431
|
-
else if (m.text === `${usedPrefix}botones`) {
|
|
432
|
-
await conn.reply(m.chat,
|
|
433
|
-
`🧪 *COMANDOS DE PRUEBA - BOTONES INTERACTIVOS*\n\n` +
|
|
434
|
-
`┌✦ *BOTÓN COPIAR*\n` +
|
|
435
|
-
`│ ${usedPrefix}boton1 - Botón que copia texto\n│\n` +
|
|
436
|
-
`├✦ *BOTÓN URL*\n` +
|
|
437
|
-
`│ ${usedPrefix}boton2 - Botón que abre enlace\n│\n` +
|
|
438
|
-
`├✦ *BOTONES RÁPIDOS*\n` +
|
|
439
|
-
`│ ${usedPrefix}boton3 - Botones de respuesta\n│\n` +
|
|
440
|
-
`├✦ *BOTÓN LLAMADA*\n` +
|
|
441
|
-
`│ ${usedPrefix}boton4 - Botón para llamar\n│\n` +
|
|
442
|
-
`├✦ *LISTA DESPLEGABLE*\n` +
|
|
443
|
-
`│ ${usedPrefix}boton5 - Menú con opciones\n│\n` +
|
|
444
|
-
`└✦ *MÚLTIPLES BOTONES*\n` +
|
|
445
|
-
` ${usedPrefix}boton6 - Combinación de botones\n\n` +
|
|
446
|
-
`✨ *Prueba cada uno y mira cómo funcionan!*`, m)
|
|
447
|
-
}
|
|
448
|
-
}
|
|
442
|
+
Estos métodos permiten enviar contenido "enriquecido" reutilizando el mismo formato interno que WhatsApp usa para las respuestas de Meta AI (tablas, código con resaltado de sintaxis, LaTeX, etc.), sin tener que armar el protobuf a mano.
|
|
449
443
|
|
|
450
|
-
|
|
451
|
-
handler.help = ['boton1', 'boton2', 'boton3', 'boton4', 'boton5', 'boton6', 'botones']
|
|
452
|
-
handler.tags = ['test']
|
|
444
|
+
**`sendTable`** — envía una tabla con encabezados y filas:
|
|
453
445
|
|
|
454
|
-
|
|
446
|
+
```ts
|
|
447
|
+
await sock.sendTable(
|
|
448
|
+
jid,
|
|
449
|
+
'Precios',
|
|
450
|
+
['Producto', 'Precio'],
|
|
451
|
+
[['Café', '$50'], ['Té', '$40']],
|
|
452
|
+
undefined,
|
|
453
|
+
{ footer: 'Precios sujetos a cambio' }
|
|
454
|
+
)
|
|
455
455
|
```
|
|
456
456
|
|
|
457
|
-
|
|
457
|
+
**`sendList`** — envía una lista simple de elementos:
|
|
458
458
|
|
|
459
|
-
|
|
459
|
+
```ts
|
|
460
|
+
await sock.sendList(jid, 'Tareas pendientes', ['Comprar pan', 'Enviar reporte', 'Llamar al cliente'])
|
|
461
|
+
```
|
|
460
462
|
|
|
461
|
-
|
|
463
|
+
> No confundir con la lista de selección de WhatsApp (`sections`) explicada en [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel) — `sendList` arma un mensaje enriquecido de solo lectura, no una lista interactiva con opciones seleccionables.
|
|
462
464
|
|
|
463
|
-
|
|
464
|
-
// JavaScript
|
|
465
|
-
const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
|
|
465
|
+
**`sendCodeBlock`** — envía código con resaltado de sintaxis (soporta `javascript`, `typescript`, `python`, entre otros):
|
|
466
466
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
melody.ev.on('creds.update', saveCreds)
|
|
467
|
+
```ts
|
|
468
|
+
await sock.sendCodeBlock(jid, 'console.log("Hola mundo")', undefined, { language: 'javascript', title: 'Ejemplo' })
|
|
470
469
|
```
|
|
471
470
|
|
|
472
|
-
|
|
473
|
-
// TypeScript
|
|
474
|
-
import makeWASocket, { useMultiFileAuthState } from '@fer2809fl/baileys'
|
|
471
|
+
**`sendLatex`** — envía una o más expresiones matemáticas en formato LaTeX:
|
|
475
472
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
473
|
+
```ts
|
|
474
|
+
await sock.sendLatex(jid, undefined, {
|
|
475
|
+
text: 'La fórmula cuadrática es:',
|
|
476
|
+
expressions: [{ latexExpression: 'x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}' }]
|
|
477
|
+
})
|
|
479
478
|
```
|
|
480
479
|
|
|
481
|
-
|
|
480
|
+
**`sendRichMessage`** — envía una combinación libre de sub-mensajes (texto, tabla, código, LaTeX, imágenes) en un solo mensaje:
|
|
482
481
|
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
|
|
482
|
+
```ts
|
|
483
|
+
await sock.sendRichMessage(jid, [
|
|
484
|
+
{ messageType: RichSubMessageType.TEXT, messageText: 'Resultado del análisis:' },
|
|
485
|
+
{ messageType: RichSubMessageType.TABLE, tableMetadata: { title: 'Datos', rows: [...] } }
|
|
486
|
+
])
|
|
487
|
+
```
|
|
486
488
|
|
|
487
|
-
|
|
488
|
-
await melody.sendMessage(jid, {
|
|
489
|
-
image: { url: './images/mymelody.jpg' },
|
|
490
|
-
caption: '¡Mira mi nueva foto!'
|
|
491
|
-
})
|
|
489
|
+
**`captureUnifiedResponse`** / **`sendUnifiedResponse`** — permiten capturar la respuesta enriquecida de un mensaje recibido y reenviarla o reutilizarla tal cual:
|
|
492
490
|
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
}
|
|
491
|
+
```ts
|
|
492
|
+
const capturado = sock.captureUnifiedResponse(mensajeRecibido.message)
|
|
493
|
+
if (capturado) {
|
|
494
|
+
await sock.sendUnifiedResponse(otroJid, undefined, capturado)
|
|
495
|
+
}
|
|
496
|
+
```
|
|
498
497
|
|
|
499
|
-
|
|
500
|
-
await melody.sendMessage(jid, {
|
|
501
|
-
audio: { url: './audio/nota.mp3' },
|
|
502
|
-
mimetype: 'audio/mp4',
|
|
503
|
-
ptt: true
|
|
504
|
-
})
|
|
498
|
+
**`updateMediaMessage`** — re-sube un archivo multimedia cuyo enlace venció, para poder reenviarlo:
|
|
505
499
|
|
|
506
|
-
|
|
507
|
-
await
|
|
508
|
-
|
|
509
|
-
})
|
|
500
|
+
```ts
|
|
501
|
+
await sock.updateMediaMessage(mensajeConMediaVencido)
|
|
502
|
+
```
|
|
510
503
|
|
|
511
|
-
|
|
512
|
-
await melody.sendMessage(jid, {
|
|
513
|
-
document: { url: './archivo.pdf' },
|
|
514
|
-
mimetype: 'application/pdf',
|
|
515
|
-
fileName: 'archivo.pdf'
|
|
516
|
-
})
|
|
504
|
+
### Marcar un mensaje como generado por IA
|
|
517
505
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
})
|
|
506
|
+
Cualquier mensaje regular (texto, imagen, video, etc.) puede llevar la etiqueta/icono de "generado por IA" que WhatsApp muestra junto al mensaje, agregando la propiedad `ai: true` al contenido:
|
|
507
|
+
|
|
508
|
+
```ts
|
|
509
|
+
await sock.sendMessage(jid, { text: 'Esta respuesta la generó un modelo de IA', ai: true })
|
|
522
510
|
```
|
|
523
511
|
|
|
524
|
-
|
|
512
|
+
> ⚠️ Esta marca **solo funciona en chats individuales** (no en grupos). Si se intenta usar `ai: true` en un grupo, ASTA-BOTS lanza un error indicando que el icono de IA solo está permitido en chats privados.
|
|
525
513
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
const prefix = '!'
|
|
537
|
-
if (!body.startsWith(prefix)) return
|
|
538
|
-
|
|
539
|
-
const [cmd, ...args] = body.slice(prefix.length).trim().split(' ')
|
|
540
|
-
|
|
541
|
-
switch (cmd.toLowerCase()) {
|
|
542
|
-
case 'hola':
|
|
543
|
-
await melody.sendMessage(m.key.remoteJid, {
|
|
544
|
-
text: '¡Hola! Soy Delta, ¿en qué puedo ayudarte?'
|
|
545
|
-
})
|
|
546
|
-
break
|
|
547
|
-
case 'ping':
|
|
548
|
-
await melody.sendMessage(m.key.remoteJid, { text: '🏓 Pong!' })
|
|
549
|
-
break
|
|
550
|
-
default:
|
|
551
|
-
await melody.sendMessage(m.key.remoteJid, {
|
|
552
|
-
text: `Comando desconocido: ${cmd}`
|
|
553
|
-
})
|
|
554
|
-
}
|
|
555
|
-
})
|
|
514
|
+
### Estados (historias)
|
|
515
|
+
|
|
516
|
+
`sendStatusWhatsApp` publica un estado (historia) en tu cuenta. A diferencia de `sendMessage`, este método está pensado para trabajar junto con **menciones**: el segundo parámetro es un arreglo de JIDs (contactos o grupos) a los que se les notifica que fueron mencionados en el estado.
|
|
517
|
+
|
|
518
|
+
```ts
|
|
519
|
+
await sock.sendStatusWhatsApp(
|
|
520
|
+
{ text: 'Nuevo estado 🚀', backgroundColor: '#25D366' },
|
|
521
|
+
[contactoJid, grupoJid] // se les notifica el estado como mención
|
|
522
|
+
)
|
|
556
523
|
```
|
|
557
524
|
|
|
558
|
-
|
|
525
|
+
- Si se pasa un JID de **contacto individual**, recibe la notificación de mención de estado como corresponde a un chat privado.
|
|
526
|
+
- Si se pasa un JID de **grupo**, el grupo entero recibe una única notificación de mención de estado a nivel de grupo (no se le manda una notificación repetida a cada miembro por separado).
|
|
527
|
+
- Si no se pasa ningún JID, el estado no se publica ya que requiere pasar las menciones necesarias.
|
|
528
|
+
- Para contenido multimedia (imagen, video, audio) en el estado, se pueden combinar los mismos campos que en `sendMessage` (`image`, `video`, `audio`), y ASTA-BOTS ajusta automáticamente el color de fondo y la fuente cuando corresponde.
|
|
559
529
|
|
|
560
|
-
|
|
530
|
+
### Recibos, lectura y presencia
|
|
561
531
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
532
|
+
|
|
533
|
+
```ts
|
|
534
|
+
// Marcar mensajes como leídos (doble check azul)
|
|
535
|
+
await sock.readMessages([mensaje.key])
|
|
536
|
+
|
|
537
|
+
// Enviar un recibo manualmente
|
|
538
|
+
await sock.sendReceipt(jid, participante, [id], 'read')
|
|
539
|
+
|
|
540
|
+
// Actualizar presencia (escribiendo, grabando audio, en línea)
|
|
541
|
+
await sock.sendPresenceUpdate('composing', jid) // 'available' | 'unavailable' | 'composing' | 'recording' | 'paused'
|
|
542
|
+
|
|
543
|
+
// Suscribirse a la presencia de un contacto
|
|
544
|
+
await sock.presenceSubscribe(jid)
|
|
572
545
|
```
|
|
573
546
|
|
|
574
|
-
|
|
547
|
+
## Grupos, comunidades y canales
|
|
575
548
|
|
|
576
|
-
|
|
549
|
+
ASTA-BOTS conserva toda la funcionalidad estándar de Baileys para administrar grupos, comunidades (grupos con subgrupos) y canales de difusión (newsletters):
|
|
577
550
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
551
|
+
```ts
|
|
552
|
+
await sock.groupCreate('Mi grupo', [jid1, jid2])
|
|
553
|
+
await sock.groupParticipantsUpdate(jid, [participante], 'add') // 'add' | 'remove' | 'promote' | 'demote'
|
|
554
|
+
await sock.groupInviteCode(jid)
|
|
555
|
+
|
|
556
|
+
await sock.communityCreate('Mi comunidad', 'Descripción')
|
|
557
|
+
|
|
558
|
+
await sock.newsletterCreate('Mi canal', 'Descripción del canal')
|
|
586
559
|
```
|
|
587
560
|
|
|
588
|
-
|
|
589
|
-
```javascript
|
|
590
|
-
const { downloadMediaMessage } = require('@fer2809fl/baileys')
|
|
561
|
+
## Perfil, privacidad y negocios
|
|
591
562
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
563
|
+
```ts
|
|
564
|
+
await sock.updateProfileName('Mi Bot')
|
|
565
|
+
await sock.updateProfileStatus('Disponible 24/7')
|
|
566
|
+
await sock.updateProfilePicture(jid, { url: './avatar.jpg' })
|
|
595
567
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
})
|
|
568
|
+
await sock.updateBlockStatus(jid, 'block') // o 'unblock'
|
|
569
|
+
|
|
570
|
+
// API de negocios (catálogo, pedidos)
|
|
571
|
+
await sock.getCatalog({ jid })
|
|
572
|
+
await sock.productCreate({ ... })
|
|
600
573
|
```
|
|
601
574
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
575
|
+
## Store (caché en memoria)
|
|
576
|
+
|
|
577
|
+
El **Store** es un caché en memoria de chats, contactos, mensajes y metadata de grupos, que se va llenando solo a medida que van llegando eventos (`sock.ev`). El Baileys oficial más reciente **eliminó este módulo** de la librería; en ASTA-BOTS se mantiene disponible porque resuelve un problema muy común al hacer un bot: no depender de volver a pedirle todo a WhatsApp (mensaje anterior, foto de perfil, metadata de un grupo) cada vez que se necesita.
|
|
578
|
+
|
|
579
|
+
### ¿Cuándo conviene usarlo?
|
|
580
|
+
|
|
581
|
+
- Si tu bot necesita **buscar mensajes anteriores** (por ejemplo, para citar o reenviar algo que no tenés a mano).
|
|
582
|
+
- Si querés **listar los chats o contactos** sin tener que reconstruirlos manualmente desde los eventos.
|
|
583
|
+
- Si hacés muchas consultas de `groupMetadata` o `profilePictureUrl` y no querés golpear la API de WhatsApp cada vez.
|
|
584
|
+
|
|
585
|
+
Si tu bot es simple y solo responde a mensajes entrantes sin necesitar historial, podés omitirlo sin problema; el store consume RAM porque guarda todo en memoria.
|
|
586
|
+
|
|
587
|
+
### Uso
|
|
588
|
+
|
|
589
|
+
```ts
|
|
590
|
+
import makeWASocket, { makeInMemoryStore, useMultiFileAuthState } from 'baileys'
|
|
591
|
+
|
|
592
|
+
const store = makeInMemoryStore({})
|
|
593
|
+
store.readFromFile('./store.json') // opcional: cargar datos guardados de una corrida anterior
|
|
594
|
+
|
|
595
|
+
const { state, saveCreds } = await useMultiFileAuthState('sesion')
|
|
596
|
+
const sock = makeWASocket({ auth: state })
|
|
597
|
+
|
|
598
|
+
store.bind(sock.ev) // conecta el store a todos los eventos del socket
|
|
599
|
+
|
|
600
|
+
sock.ev.on('creds.update', saveCreds)
|
|
601
|
+
|
|
602
|
+
// Guardar el store a disco cada cierto tiempo
|
|
603
|
+
setInterval(() => {
|
|
604
|
+
store.writeToFile('./store.json')
|
|
605
|
+
}, 10_000)
|
|
606
|
+
|
|
607
|
+
// Ejemplos de consulta
|
|
608
|
+
const chats = store.chats.all()
|
|
609
|
+
const contacto = store.contacts['5215512345678@s.whatsapp.net']
|
|
610
|
+
const mensaje = await store.loadMessage(jid, mensajeId)
|
|
607
611
|
```
|
|
608
612
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
613
|
+
## Utilidades ASTA-BOTS
|
|
614
|
+
|
|
615
|
+
Estas utilidades son propias de **ASTA-BOTS** y no existen en el Baileys original: nacieron para resolver lo más repetitivo al armar un bot de comandos.
|
|
616
|
+
|
|
617
|
+
### `resolveJid`: resolución automática de JID
|
|
618
|
+
|
|
619
|
+
Detecta el JID objetivo de un comando sin que tengas que pasarlo a mano, siguiendo esta prioridad: **mensaje citado → primera mención → argumento numérico → remitente**.
|
|
620
|
+
|
|
621
|
+
```ts
|
|
622
|
+
import { resolveJid } from 'baileys'
|
|
623
|
+
|
|
624
|
+
// .ban (respondiendo a alguien) → toma el citado
|
|
625
|
+
// .ban @usuario → toma la mención
|
|
626
|
+
// .ban 5216141234567 → toma el argumento
|
|
627
|
+
// .ban → cae al remitente
|
|
628
|
+
const targetJid = resolveJid(m, args[0])
|
|
615
629
|
```
|
|
616
630
|
|
|
617
|
-
|
|
631
|
+
### Sistema de botones de conveniencia
|
|
618
632
|
|
|
619
|
-
|
|
633
|
+
Además del soporte nativo de `sock.sendMessage` (ver [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel)), ASTA-BOTS trae funciones listas para usar cuando querés algo rápido sin armar el objeto del mensaje:
|
|
620
634
|
|
|
635
|
+
```ts
|
|
636
|
+
import { sendQuickReplyButtons, setupButtonHandler } from 'baileys'
|
|
637
|
+
|
|
638
|
+
// Engancha el detector de respuestas de botón una sola vez, al iniciar
|
|
639
|
+
setupButtonHandler(sock, plugins, db)
|
|
640
|
+
|
|
641
|
+
await sendQuickReplyButtons(sock, jid, '¿Qué querés hacer?', [
|
|
642
|
+
{ text: '📋 Menú', id: 'menu' },
|
|
643
|
+
{ text: '⚙️ Ajustes', id: 'settings' }
|
|
644
|
+
])
|
|
621
645
|
```
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
646
|
+
|
|
647
|
+
| Función | Qué hace |
|
|
648
|
+
|---|---|
|
|
649
|
+
| `sendCopyButton` | Botón que copia texto al portapapeles |
|
|
650
|
+
| `sendUrlButton` | Botón de enlace |
|
|
651
|
+
| `sendQuickReplyButtons` | Botones de respuesta rápida |
|
|
652
|
+
| `sendCallButton` | Botón de llamada |
|
|
653
|
+
| `sendListMenu` | Lista desplegable con secciones |
|
|
654
|
+
| `sendInteractiveMessage` | Combinación de varios tipos de botón |
|
|
655
|
+
| `handleButtonResponse` | Detecta y ejecuta el comando de un botón presionado |
|
|
656
|
+
| `setupButtonHandler` | Engancha el detector de botones al socket sin pisar tu handler de mensajes |
|
|
657
|
+
|
|
658
|
+
Todas caen a texto plano automáticamente si WhatsApp rechaza el mensaje interactivo.
|
|
659
|
+
|
|
660
|
+
### Código de vinculación de marca
|
|
661
|
+
|
|
662
|
+
Al pedir un código de emparejamiento sin especificar uno propio, ASTA-BOTS usa por defecto el código de marca **`ASTABOTS`** (8 caracteres, cumple el requisito de WhatsApp):
|
|
663
|
+
|
|
664
|
+
```ts
|
|
665
|
+
const code = await sock.requestPairingCode('5216141234567')
|
|
666
|
+
// code === 'ASTABOTS'
|
|
667
|
+
|
|
668
|
+
// o con tu propio código de 8 caracteres:
|
|
669
|
+
const code2 = await sock.requestPairingCode('5216141234567', 'MIPROPIO')
|
|
636
670
|
```
|
|
637
671
|
|
|
638
|
-
|
|
672
|
+
## Aviso legal
|
|
639
673
|
|
|
640
|
-
|
|
674
|
+
Este proyecto no está afiliado, asociado, autorizado ni respaldado de ninguna forma por WhatsApp Inc. ni por Meta. "WhatsApp" y las marcas relacionadas son propiedad de sus respectivos dueños.
|
|
641
675
|
|
|
642
|
-
|
|
643
|
-
|---------|---------|
|
|
644
|
-
| **1.8.9** | ✅ Botones interactivos (`sendCopyButton`, `sendUrlButton`, `sendQuickReplyButtons`, `sendCallButton`, `sendListMenu`, `sendInteractiveMessage`) — 🐛 Fix error de pairing en macOS |
|
|
645
|
-
| 1.4.5 | Versión estable anterior |
|
|
676
|
+
El uso de esta librería es responsabilidad exclusiva de quien la implementa. Se recomienda no usarla para spam, mensajería masiva no solicitada ni cualquier práctica que viole los Términos de Servicio de WhatsApp.
|
|
646
677
|
|
|
647
|
-
|
|
678
|
+
## Créditos
|
|
648
679
|
|
|
649
|
-
|
|
680
|
+
**ASTA-BOTS** es un fork de **[Baileys](https://github.com/WhiskeySockets/Baileys)**, la librería original mantenida por la comunidad de **WhiskeySockets**. Gran parte de la base de este proyecto —el manejo del protocolo de WhatsApp Web, el cifrado, la arquitectura del socket y la mayoría del código— proviene de ese trabajo original.
|
|
650
681
|
|
|
651
|
-
-
|
|
652
|
-
-
|
|
653
|
-
|
|
682
|
+
- Repositorio oficial: https://github.com/WhiskeySockets/Baileys
|
|
683
|
+
- Licencia: MIT
|
|
684
|
+
|
|
685
|
+
Si esta librería te resulta útil, considerá también dar reconocimiento y apoyo al proyecto original que es de this-xys/bails. 🙌
|
|
654
686
|
|
|
655
687
|
---
|
|
656
688
|
|
|
657
|
-
<div align="center">
|
|
689
|
+
<div align="center">Hecho con 💙 por <b>ASTA-BOTS</b></div>
|
|
658
690
|
|
|
659
|
-
|
|
691
|
+
## créditos
|
|
692
|
+
|
|
693
|
+
this-xys/bails
|
|
660
694
|
|
|
661
|
-
</div>
|