mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-20 04:29:16 +00:00
feat(provider): 🚀 feat Instance provider
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -168,8 +153,6 @@ class BaileysProvider extends ProviderClass {
|
||||
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
|
||||
*/
|
||||
|
||||
sendRaw = () => this.vendor.sendMessage
|
||||
|
||||
/**
|
||||
* @alpha
|
||||
* @param {string} number
|
||||
@@ -181,12 +164,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)
|
||||
}
|
||||
@@ -302,10 +282,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)
|
||||
}
|
||||
|
||||
@@ -340,12 +318,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('+', '')
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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(``)
|
||||
})
|
||||
|
||||
@@ -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}`,
|
||||
|
||||
@@ -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(``)
|
||||
})
|
||||
|
||||
@@ -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,25 +186,13 @@ 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)
|
||||
}
|
||||
|
||||
/**
|
||||
* Funcion SendRaw envia opciones directamente del proveedor
|
||||
* @param {string} number
|
||||
* @param {string} message
|
||||
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
|
||||
*/
|
||||
|
||||
sendRaw = () => this.vendor.sendMessage
|
||||
|
||||
/**
|
||||
* Enviar mensaje al usuario
|
||||
* @param {*} userId
|
||||
@@ -222,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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -163,13 +155,11 @@ class WebWhatsappProvider extends ProviderClass {
|
||||
* @param {*} text
|
||||
* @returns
|
||||
*/
|
||||
sendImage = async (number, filePath) => {
|
||||
sendImage = async (number, filePath, caption) => {
|
||||
const base64 = readFileSync(filePath, { encoding: 'base64' })
|
||||
const mimeType = mime.lookup(filePath)
|
||||
const media = new MessageMedia(mimeType, base64)
|
||||
return this.vendor.sendMessage(number, media, {
|
||||
caption: 'soy una imagen',
|
||||
})
|
||||
return this.vendor.sendMessage(number, media, { caption })
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,13 +170,11 @@ class WebWhatsappProvider extends ProviderClass {
|
||||
* @returns
|
||||
*/
|
||||
|
||||
sendAudio = async (number, filePath) => {
|
||||
sendAudio = async (number, filePath, caption) => {
|
||||
const base64 = readFileSync(filePath, { encoding: 'base64' })
|
||||
const mimeType = mime.lookup(filePath)
|
||||
const media = new MessageMedia(mimeType, base64)
|
||||
return this.vendor.sendMessage(number, media, {
|
||||
caption: 'soy un audio',
|
||||
})
|
||||
return this.vendor.sendMessage(number, media, { caption })
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -230,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)
|
||||
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)
|
||||
}
|
||||
@@ -257,8 +242,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)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"whatsapp-web.js": "1.19.2"
|
||||
"whatsapp-web.js": "1.19.3"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user