Whatsapp QR
- Con esta libreria, puedes configurar respuestas
- automatizadas para preguntas frecuentes, recibir y responder
- mensajes de manera automatizada, y hacer un seguimiento de
- las interacciones con los clientes.
Además, nuestro
- Chatbot se integra fácilmente con otros sistemas y
- herramientas que ya esté utilizando en su negocio.
+ Con esta libreria, puedes configurar respuestas automatizadas para preguntas frecuentes, recibir y
+ responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los
+ clientes.
Además, nuestro Chatbot se integra fácilmente con otros sistemas y herramientas que
+ ya esté utilizando en su negocio.
diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js
index 9361731..7a5de23 100644
--- a/packages/provider/src/baileys/index.js
+++ b/packages/provider/src/baileys/index.js
@@ -7,18 +7,9 @@ const { join } = require('path')
const { createWriteStream, readFileSync } = require('fs')
const { Console } = require('console')
-const {
- default: makeWASocket,
- useMultiFileAuthState,
- Browsers,
- DisconnectReason,
-} = require('@adiwajshing/baileys')
+const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require('@adiwajshing/baileys')
-const {
- baileyGenerateImage,
- baileyCleanNumber,
- baileyIsValidNumber,
-} = require('./utils')
+const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber } = require('./utils')
const { generalDownload } = require('../../common/download')
@@ -46,9 +37,7 @@ class BaileysProvider extends ProviderClass {
*/
initBailey = async () => {
const NAME_DIR_SESSION = `${this.globalVendorArgs.name}_sessions`
- const { state, saveCreds } = await useMultiFileAuthState(
- NAME_DIR_SESSION
- )
+ const { state, saveCreds } = await useMultiFileAuthState(NAME_DIR_SESSION)
this.saveCredsGlobal = saveCreds
try {
@@ -57,7 +46,7 @@ class BaileysProvider extends ProviderClass {
auth: state,
browser: Browsers.macOS('Desktop'),
syncFullHistory: false,
- logger: pino({ level: 'error' }),
+ logger: pino({ level: 'fatal' }),
})
sock.ev.on('connection.update', async (update) => {
@@ -96,10 +85,7 @@ class BaileysProvider extends ProviderClass {
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
- await baileyGenerateImage(
- qr,
- `${this.globalVendorArgs.name}.qr.png`
- )
+ await baileyGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`)
}
})
@@ -131,9 +117,10 @@ class BaileysProvider extends ProviderClass {
const [messageCtx] = messages
let payload = {
...messageCtx,
- body: messageCtx?.message?.conversation,
+ body: messageCtx?.message?.extendedTextMessage?.text ?? messageCtx?.message?.conversation,
from: messageCtx?.key?.remoteJid,
}
+
if (payload.from === 'status@broadcast') return
if (payload?.key?.fromMe) return
@@ -142,9 +129,7 @@ class BaileysProvider extends ProviderClass {
return
}
- const btnCtx =
- payload?.message?.buttonsResponseMessage
- ?.selectedDisplayText
+ const btnCtx = payload?.message?.buttonsResponseMessage?.selectedDisplayText
if (btnCtx) payload.body = btnCtx
@@ -174,12 +159,9 @@ class BaileysProvider extends ProviderClass {
const fileDownloaded = await generalDownload(imageUrl)
const mimeType = mime.lookup(fileDownloaded)
- if (mimeType.includes('image'))
- return this.sendImage(number, fileDownloaded, text)
- if (mimeType.includes('video'))
- return this.sendVideo(number, fileDownloaded, text)
- if (mimeType.includes('audio'))
- return this.sendAudio(number, fileDownloaded, text)
+ if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded, text)
+ if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text)
return this.sendFile(number, fileDownloaded)
}
@@ -294,10 +276,8 @@ class BaileysProvider extends ProviderClass {
sendMessage = async (numberIn, message, { options }) => {
const number = baileyCleanNumber(numberIn)
- if (options?.buttons?.length)
- return this.sendButtons(number, message, options.buttons)
- if (options?.media)
- return this.sendMedia(number, options.media, message)
+ if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
+ if (options?.media) return this.sendMedia(number, options.media, message)
return this.sendText(number, message)
}
@@ -332,12 +312,7 @@ class BaileysProvider extends ProviderClass {
* @example await sendContact("xxxxxxxxxxx@c.us" || "xxxxxxxxxxxxxxxxxx@g.us", "+xxxxxxxxxxx", "Robin Smith", messages)
*/
- sendContact = async (
- remoteJid,
- contactNumber,
- displayName,
- messages = null
- ) => {
+ sendContact = async (remoteJid, contactNumber, displayName, messages = null) => {
const cleanContactNumber = contactNumber.replaceAll(' ', '')
const waid = cleanContactNumber.replace('+', '')
diff --git a/packages/provider/src/meta/index.js b/packages/provider/src/meta/index.js
index b3a106b..2b2e0e0 100644
--- a/packages/provider/src/meta/index.js
+++ b/packages/provider/src/meta/index.js
@@ -56,15 +56,11 @@ class MetaProvider extends ProviderClass {
sendMessageMeta = async (body) => {
try {
- const response = await axios.post(
- `${URL}/${this.numberId}/messages`,
- body,
- {
- headers: {
- Authorization: `Bearer ${this.jwtToken}`,
- },
- }
- )
+ const response = await axios.post(`${URL}/${this.numberId}/messages`, body, {
+ headers: {
+ Authorization: `Bearer ${this.jwtToken}`,
+ },
+ })
return response.data
} catch (error) {
return Promise.resolve(error)
@@ -106,8 +102,7 @@ class MetaProvider extends ProviderClass {
*/
sendMessage = async (number, message, { options }) => {
if (options?.buttons?.length) return console.log('Envio de botones')
- if (options?.media)
- return this.sendMedia(number, message, options.media)
+ if (options?.media) return this.sendMedia(number, message, options.media)
this.sendtext(number, message)
}
diff --git a/packages/provider/src/meta/server.js b/packages/provider/src/meta/server.js
index 3d6ef61..cbd59b0 100644
--- a/packages/provider/src/meta/server.js
+++ b/packages/provider/src/meta/server.js
@@ -81,9 +81,7 @@ class MetaWebHookServer extends EventEmitter {
* @returns
*/
buildHTTPServer = () => {
- this.metaServer
- .use(urlencoded({ extended: true }))
- .get('/webhook', this.verifyToken)
+ this.metaServer.use(urlencoded({ extended: true })).get('/webhook', this.verifyToken)
this.metaServer
.use(urlencoded({ extended: true }))
@@ -99,9 +97,7 @@ class MetaWebHookServer extends EventEmitter {
this.metaServer.listen(this.metaPort, () => {
console.log(``)
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
- console.log(
- `[meta]: POST http://localhost:${this.metaPort}/webhook`
- )
+ console.log(`[meta]: POST http://localhost:${this.metaPort}/webhook`)
console.log(`[meta]: Más información en la documentacion`)
console.log(``)
})
diff --git a/packages/provider/src/twilio/index.js b/packages/provider/src/twilio/index.js
index 7c25bb9..e1a50dc 100644
--- a/packages/provider/src/twilio/index.js
+++ b/packages/provider/src/twilio/index.js
@@ -86,12 +86,8 @@ class TwilioProvider extends ProviderClass {
*/
sendButtons = async () => {
console.log(``)
- console.log(
- `[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`
- )
- console.log(
- `[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`
- )
+ console.log(`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`)
+ console.log(`[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`)
console.log(``)
}
@@ -104,10 +100,8 @@ class TwilioProvider extends ProviderClass {
*/
sendMessage = async (number, message, { options }) => {
number = parseNumber(number)
- if (options?.buttons?.length)
- this.sendButtons(number, message, options.buttons)
- if (options?.media)
- return this.sendMedia(number, message, options.media)
+ if (options?.buttons?.length) this.sendButtons(number, message, options.buttons)
+ if (options?.media) return this.sendMedia(number, message, options.media)
return this.vendor.messages.create({
body: message,
from: `whatsapp:+${this.vendorNumber}`,
diff --git a/packages/provider/src/twilio/server.js b/packages/provider/src/twilio/server.js
index ae09da7..aaf49c2 100644
--- a/packages/provider/src/twilio/server.js
+++ b/packages/provider/src/twilio/server.js
@@ -51,9 +51,7 @@ class TwilioWebHookServer extends EventEmitter {
this.twilioServer.listen(this.twilioPort, () => {
console.log(``)
console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
- console.log(
- `[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`
- )
+ console.log(`[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`)
console.log(`[Twilio]: Más información en la documentacion`)
console.log(``)
})
diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js
index 3e1b630..1369af2 100644
--- a/packages/provider/src/venom/index.js
+++ b/packages/provider/src/venom/index.js
@@ -4,11 +4,7 @@ const { createWriteStream } = require('fs')
const { Console } = require('console')
const mime = require('mime-types')
-const {
- venomCleanNumber,
- venomGenerateImage,
- venomisValidNumber,
-} = require('./utils')
+const { venomCleanNumber, venomGenerateImage, venomisValidNumber } = require('./utils')
const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/venom.log`),
@@ -108,8 +104,7 @@ class VenomProvider extends ProviderClass {
const listEvents = this.busEvents()
for (const { event, func } of listEvents) {
- if (this.vendor[event])
- this.vendor[event]((payload) => func(payload))
+ if (this.vendor[event]) this.vendor[event]((payload) => func(payload))
}
}
@@ -122,16 +117,13 @@ class VenomProvider extends ProviderClass {
* @returns
*/
sendButtons = async (number, message, buttons = []) => {
- const NOTE_VENOM_BUTTON = [
- `Actualmente VENOM tiene problemas con la API`,
- `para el envio de Botones`,
- ].join('\n')
+ const NOTE_VENOM_BUTTON = [`Actualmente VENOM tiene problemas con la API`, `para el envio de Botones`].join(
+ '\n'
+ )
console.log(`[NOTA]: ${NOTE_VENOM_BUTTON}`)
- const buttonToStr = [message]
- .concat(buttons.map((btn) => `${btn.body}`))
- .join(`\n`)
+ const buttonToStr = [message].concat(buttons.map((btn) => `${btn.body}`)).join(`\n`)
return this.vendor.sendText(number, buttonToStr)
// return this.vendor.sendButtons(number, "Title", buttons1, "Description");
}
@@ -194,12 +186,9 @@ class VenomProvider extends ProviderClass {
const fileDownloaded = await generalDownload(mediaUrl)
const mimeType = mime.lookup(fileDownloaded)
- if (mimeType.includes('image'))
- return this.sendImage(number, fileDownloaded, text)
- if (mimeType.includes('video'))
- return this.sendVideo(number, fileDownloaded, text)
- if (mimeType.includes('audio'))
- return this.sendAudio(number, fileDownloaded)
+ if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded, text)
+ if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded)
return this.sendFile(number, fileDownloaded, text)
}
@@ -213,10 +202,8 @@ class VenomProvider extends ProviderClass {
*/
sendMessage = async (userId, message, { options }) => {
const number = venomCleanNumber(userId)
- if (options?.buttons?.length)
- return this.sendButtons(number, message, options.buttons)
- if (options?.media)
- return this.sendMedia(number, options.media, message)
+ if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
+ if (options?.media) return this.sendMedia(number, options.media, message)
return this.vendor.sendText(number, message)
}
}
diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js
index 60a142d..9fef93c 100644
--- a/packages/provider/src/web-whatsapp/index.js
+++ b/packages/provider/src/web-whatsapp/index.js
@@ -2,11 +2,7 @@ const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/bot')
const { Console } = require('console')
const { createWriteStream, readFileSync } = require('fs')
-const {
- wwebCleanNumber,
- wwebGenerateImage,
- wwebIsValidNumber,
-} = require('./utils')
+const { wwebCleanNumber, wwebGenerateImage, wwebIsValidNumber } = require('./utils')
const logger = new Console({
stdout: createWriteStream('./log'),
@@ -32,11 +28,7 @@ class WebWhatsappProvider extends ProviderClass {
}),
puppeteer: {
headless: true,
- args: [
- '--no-sandbox',
- '--disable-setuid-sandbox',
- '--unhandled-rejections=strict',
- ],
+ args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'],
//executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
},
})
@@ -80,10 +72,7 @@ class WebWhatsappProvider extends ProviderClass {
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
- await wwebGenerateImage(
- qr,
- `${this.globalVendorArgs.name}.qr.png`
- )
+ await wwebGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`)
},
},
{
@@ -116,6 +105,9 @@ class WebWhatsappProvider extends ProviderClass {
* @returns
*/
sendButtons = async (number, message, buttons = []) => {
+ console.log(`🚩 ¿No te funciona los botones? Intenta instalar`)
+ console.log(`npm i github:pedroslopez/whatsapp-web.js#fix-buttons-list`)
+
const buttonMessage = new Buttons(message, buttons, '', '')
return this.vendor.sendMessage(number, buttonMessage)
}
@@ -226,12 +218,9 @@ class WebWhatsappProvider extends ProviderClass {
const fileDownloaded = await generalDownload(mediaUrl)
const mimeType = mime.lookup(fileDownloaded)
- if (mimeType.includes('image'))
- return this.sendImage(number, fileDownloaded, text)
- if (mimeType.includes('video'))
- return this.sendVideo(number, fileDownloaded)
- if (mimeType.includes('audio'))
- return this.sendAudio(number, fileDownloaded, text)
+ if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text)
+ if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded)
+ if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded)
return this.sendFile(number, fileDownloaded)
}
@@ -245,8 +234,7 @@ class WebWhatsappProvider extends ProviderClass {
*/
sendMessage = async (userId, message, { options }) => {
const number = wwebCleanNumber(userId)
- if (options?.buttons?.length)
- return this.sendButtons(number, message, options.buttons)
+ if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media)
return this.sendText(number, message)
}