mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-20 20:49:15 +00:00
Compare commits
9 Commits
fix/starte
...
next-relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06acec2bf2 | ||
|
|
c868f73462 | ||
|
|
93a990e229 | ||
|
|
00c587fbf2 | ||
|
|
e6fefb4049 | ||
|
|
2d5ac2664b | ||
|
|
4e0fcbd834 | ||
|
|
e37fd0da36 | ||
|
|
23b2e8e439 |
@@ -35,7 +35,7 @@ const startInteractive = async () => {
|
|||||||
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
|
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
|
||||||
{ title: 'Twilio', value: 'twilio' },
|
{ title: 'Twilio', value: 'twilio' },
|
||||||
{ title: 'Venom (gratis)', value: 'venom' },
|
{ title: 'Venom (gratis)', value: 'venom' },
|
||||||
{ title: 'Baileys (gratis)', value: 'bailey', disabled: true },
|
{ title: 'Baileys (gratis)', value: 'bailey' },
|
||||||
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true },
|
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true },
|
||||||
],
|
],
|
||||||
max: 1,
|
max: 1,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
"./mock": "./lib/mock/index.cjs",
|
"./mock": "./lib/mock/index.cjs",
|
||||||
"./twilio": "./lib/twilio/index.cjs",
|
"./twilio": "./lib/twilio/index.cjs",
|
||||||
"./web-whatsapp": "./lib/web-whatsapp/index.cjs",
|
"./web-whatsapp": "./lib/web-whatsapp/index.cjs",
|
||||||
"./venom": "./lib/venom/index.cjs"
|
"./venom": "./lib/venom/index.cjs",
|
||||||
|
"./baileys": "./lib/baileys/index.cjs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,4 +39,13 @@ module.exports = [
|
|||||||
},
|
},
|
||||||
plugins: [commonjs()],
|
plugins: [commonjs()],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
input: join(__dirname, 'src', 'baileys', 'index.js'),
|
||||||
|
output: {
|
||||||
|
banner: banner['banner.output'].join(''),
|
||||||
|
file: join(__dirname, 'lib', 'baileys', 'index.cjs'),
|
||||||
|
format: 'cjs',
|
||||||
|
},
|
||||||
|
plugins: [commonjs()],
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
171
packages/provider/src/baileys/index.js
Normal file
171
packages/provider/src/baileys/index.js
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
const { ProviderClass } = require('@bot-whatsapp/bot')
|
||||||
|
const pino = require('pino')
|
||||||
|
const {
|
||||||
|
default: makeWASocket,
|
||||||
|
useMultiFileAuthState,
|
||||||
|
} = require('@adiwajshing/baileys')
|
||||||
|
const {
|
||||||
|
baileyGenerateImage,
|
||||||
|
baileyCleanNumber,
|
||||||
|
baileyIsValidNumber,
|
||||||
|
} = require('./utils')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ⚙️ BaileysProvider: Es una clase tipo adaptor
|
||||||
|
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
|
||||||
|
* https://github.com/adiwajshing/Baileys
|
||||||
|
*/
|
||||||
|
class BaileysProvider extends ProviderClass {
|
||||||
|
vendor
|
||||||
|
constructor() {
|
||||||
|
super()
|
||||||
|
this.initBailey().then(() => this.initBusEvents())
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iniciar todo Bailey
|
||||||
|
*/
|
||||||
|
async initBailey() {
|
||||||
|
const { state, saveCreds } = await useMultiFileAuthState('sessions')
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.vendor = makeWASocket({
|
||||||
|
printQRInTerminal: false,
|
||||||
|
auth: state,
|
||||||
|
logger: pino({ level: 'error' }),
|
||||||
|
})
|
||||||
|
|
||||||
|
this.vendor.ev.on(
|
||||||
|
'connection.update',
|
||||||
|
async ({ qr, connection, lastDisconnect }) => {
|
||||||
|
if (qr) baileyGenerateImage(qr)
|
||||||
|
if (connection === 'open') this.emit('ready', true)
|
||||||
|
if (lastDisconnect?.error) {
|
||||||
|
saveCreds()
|
||||||
|
this.initBailey()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} catch (e) {
|
||||||
|
this.emit('error', e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapeamos los eventos nativos a los que la clase Provider espera
|
||||||
|
* para tener un standar de eventos
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
busEvents = () => [
|
||||||
|
{
|
||||||
|
event: 'connection.update',
|
||||||
|
func: async ({ qr, connection, lastDisconnect }) => {
|
||||||
|
if (qr) {
|
||||||
|
this.emit('require_action', {
|
||||||
|
instructions: [
|
||||||
|
`Debes escanear el QR Code para iniciar session reivsa qr.png`,
|
||||||
|
`Recuerda que el QR se actualiza cada minuto `,
|
||||||
|
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
baileyGenerateImage(qr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastDisconnect?.error) {
|
||||||
|
this.emit('require_action', {
|
||||||
|
instructions: [
|
||||||
|
`Algo sucedio reinicia el bot o revisa tu whatsapp`,
|
||||||
|
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connection === 'open') this.emit('ready', true)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
event: 'messages.upsert',
|
||||||
|
func: ({ messages }) => {
|
||||||
|
const [messageCtx] = messages
|
||||||
|
let payload = {
|
||||||
|
...messageCtx,
|
||||||
|
body: messageCtx?.message?.conversation,
|
||||||
|
from: messageCtx?.key?.remoteJid,
|
||||||
|
}
|
||||||
|
if (payload.from === 'status@broadcast') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!baileyIsValidNumber(payload.from)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
payload.from = baileyCleanNumber(payload.from, true)
|
||||||
|
this.emit('message', payload)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
initBusEvents = () => {
|
||||||
|
const listEvents = this.busEvents()
|
||||||
|
|
||||||
|
for (const { event, func } of listEvents) {
|
||||||
|
this.vendor.ev.on(event, func)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @alpha
|
||||||
|
* @param {string} number
|
||||||
|
* @param {string} message
|
||||||
|
* @example await sendMessage('+XXXXXXXXXXX', 'https://dominio.com/imagen.jpg' | 'img/imagen.jpg')
|
||||||
|
*/
|
||||||
|
|
||||||
|
sendMedia = async (number, imageUrl) => {
|
||||||
|
await this.vendor.sendMessage(number, {
|
||||||
|
image: { url: imageUrl },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @alpha
|
||||||
|
* @param {string} number
|
||||||
|
* @param {string} message
|
||||||
|
* @param {boolean} voiceNote optional
|
||||||
|
* @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3')
|
||||||
|
*/
|
||||||
|
|
||||||
|
sendAudio = async (number, audioUrl, voiceNote = false) => {
|
||||||
|
const numberClean = number.replace('+', '')
|
||||||
|
await this.vendor.sendMessage(`${numberClean}@c.us`, {
|
||||||
|
audio: { url: audioUrl },
|
||||||
|
ptt: voiceNote,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} number
|
||||||
|
* @param {string} message
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
sendText = async (number, message) => {
|
||||||
|
return this.vendor.sendMessage(number, { text: message })
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* TODO: Necesita terminar de implementar el sendMedia y sendButton guiarse:
|
||||||
|
* https://github.com/leifermendez/bot-whatsapp/blob/4e0fcbd8347f8a430adb43351b5415098a5d10df/packages/provider/src/web-whatsapp/index.js#L165
|
||||||
|
* @param {string} number
|
||||||
|
* @param {string} message
|
||||||
|
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
|
||||||
|
*/
|
||||||
|
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)
|
||||||
|
return this.sendText(number, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = BaileysProvider
|
||||||
21
packages/provider/src/baileys/utils.js
Normal file
21
packages/provider/src/baileys/utils.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
const { createWriteStream } = require('fs')
|
||||||
|
const qr = require('qr-image')
|
||||||
|
|
||||||
|
const baileyCleanNumber = (number, full = false) => {
|
||||||
|
number = number.replace('@s.whatsapp.net', '')
|
||||||
|
number = !full ? `${number}@s.whatsapp.net` : `${number}`
|
||||||
|
return number
|
||||||
|
}
|
||||||
|
|
||||||
|
const baileyGenerateImage = (base64) => {
|
||||||
|
let qr_svg = qr.image(base64, { type: 'png', margin: 4 })
|
||||||
|
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.png`))
|
||||||
|
}
|
||||||
|
|
||||||
|
const baileyIsValidNumber = (rawNumber) => {
|
||||||
|
const regexGroup = /\@g.us\b/gm
|
||||||
|
const exist = rawNumber.match(regexGroup)
|
||||||
|
return !exist
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { baileyCleanNumber, baileyGenerateImage, baileyIsValidNumber }
|
||||||
@@ -4,7 +4,7 @@ const {
|
|||||||
venomCleanNumber,
|
venomCleanNumber,
|
||||||
venomGenerateImage,
|
venomGenerateImage,
|
||||||
venomisValidNumber,
|
venomisValidNumber,
|
||||||
} = require('./utils/utils')
|
} = require('./utils')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ⚙️ VenomProvider: Es una clase tipo adaptor
|
* ⚙️ VenomProvider: Es una clase tipo adaptor
|
||||||
@@ -13,7 +13,6 @@ const {
|
|||||||
*/
|
*/
|
||||||
class VenomProvider extends ProviderClass {
|
class VenomProvider extends ProviderClass {
|
||||||
vendor
|
vendor
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super()
|
super()
|
||||||
this.init().then(() => this.initBusEvents())
|
this.init().then(() => this.initBusEvents())
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ const { ProviderClass } = require('@bot-whatsapp/bot')
|
|||||||
const { Console } = require('console')
|
const { Console } = require('console')
|
||||||
const { createWriteStream } = require('fs')
|
const { createWriteStream } = require('fs')
|
||||||
const {
|
const {
|
||||||
cleanNumber,
|
wwebCleanNumber,
|
||||||
generateImage,
|
wwebDownloadMedia,
|
||||||
isValidNumber,
|
wwebGenerateImage,
|
||||||
downloadMedia,
|
wwebIsValidNumber,
|
||||||
} = require('./utils')
|
} = require('./utils')
|
||||||
|
|
||||||
const logger = new Console({
|
const logger = new Console({
|
||||||
@@ -65,7 +65,7 @@ class WebWhatsappProvider extends ProviderClass {
|
|||||||
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
|
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
generateImage(qr)
|
wwebGenerateImage(qr)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -79,10 +79,10 @@ class WebWhatsappProvider extends ProviderClass {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isValidNumber(payload.from)) {
|
if (!wwebIsValidNumber(payload.from)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
payload.from = cleanNumber(payload.from, true)
|
payload.from = wwebCleanNumber(payload.from, true)
|
||||||
this.emit('message', payload)
|
this.emit('message', payload)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -98,7 +98,7 @@ class WebWhatsappProvider extends ProviderClass {
|
|||||||
*/
|
*/
|
||||||
sendMedia = async (number, mediaInput = null) => {
|
sendMedia = async (number, mediaInput = null) => {
|
||||||
if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
|
if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
|
||||||
const fileDownloaded = await downloadMedia(mediaInput)
|
const fileDownloaded = await wwebDownloadMedia(mediaInput)
|
||||||
const media = MessageMedia.fromFilePath(fileDownloaded)
|
const media = MessageMedia.fromFilePath(fileDownloaded)
|
||||||
return this.vendor.sendMessage(number, media, {
|
return this.vendor.sendMessage(number, media, {
|
||||||
sendAudioAsVoice: true,
|
sendAudioAsVoice: true,
|
||||||
@@ -163,7 +163,7 @@ class WebWhatsappProvider extends ProviderClass {
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
sendMessage = async (userId, message, { options }) => {
|
sendMessage = async (userId, message, { options }) => {
|
||||||
const number = cleanNumber(userId)
|
const number = wwebCleanNumber(userId)
|
||||||
if (options?.buttons?.length)
|
if (options?.buttons?.length)
|
||||||
return this.sendButtons(number, message, options.buttons)
|
return this.sendButtons(number, message, options.buttons)
|
||||||
if (options?.media) return this.sendMedia(number, options.media)
|
if (options?.media) return this.sendMedia(number, options.media)
|
||||||
|
|||||||
@@ -4,18 +4,18 @@ const { tmpdir } = require('os')
|
|||||||
const http = require('http')
|
const http = require('http')
|
||||||
const https = require('https')
|
const https = require('https')
|
||||||
|
|
||||||
const cleanNumber = (number, full = false) => {
|
const wwebCleanNumber = (number, full = false) => {
|
||||||
number = number.replace('@c.us', '')
|
number = number.replace('@c.us', '')
|
||||||
number = !full ? `${number}@c.us` : `${number}`
|
number = !full ? `${number}@c.us` : `${number}`
|
||||||
return number
|
return number
|
||||||
}
|
}
|
||||||
|
|
||||||
const generateImage = (base64) => {
|
const wwebGenerateImage = (base64) => {
|
||||||
let qr_svg = qr.image(base64, { type: 'png', margin: 4 })
|
let qr_svg = qr.image(base64, { type: 'png', margin: 4 })
|
||||||
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.svg`))
|
qr_svg.pipe(createWriteStream(`${process.cwd()}/qr.png`))
|
||||||
}
|
}
|
||||||
|
|
||||||
const isValidNumber = (rawNumber) => {
|
const wwebIsValidNumber = (rawNumber) => {
|
||||||
const regexGroup = /\@g.us\b/gm
|
const regexGroup = /\@g.us\b/gm
|
||||||
const exist = rawNumber.match(regexGroup)
|
const exist = rawNumber.match(regexGroup)
|
||||||
return !exist
|
return !exist
|
||||||
@@ -27,7 +27,7 @@ const isValidNumber = (rawNumber) => {
|
|||||||
* @param {*} url
|
* @param {*} url
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
const downloadMedia = (url) => {
|
const wwebDownloadMedia = (url) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const ext = url.split('.').pop()
|
const ext = url.split('.').pop()
|
||||||
const checkProtocol = url.includes('https:')
|
const checkProtocol = url.includes('https:')
|
||||||
@@ -50,4 +50,9 @@ const downloadMedia = (url) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { cleanNumber, generateImage, isValidNumber, downloadMedia }
|
module.exports = {
|
||||||
|
wwebCleanNumber,
|
||||||
|
wwebGenerateImage,
|
||||||
|
wwebIsValidNumber,
|
||||||
|
wwebDownloadMedia,
|
||||||
|
}
|
||||||
|
|||||||
12
starters/apps/base-bailey-memory/README.md
Normal file
12
starters/apps/base-bailey-memory/README.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
### BASE APP
|
||||||
|
|
||||||
|
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos Bolsos etc..
|
||||||
|
|
||||||
|
------
|
||||||
|
- [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
- [Twitter](https://twitter.com/leifermendez)
|
||||||
|
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
- [Telegram](https://t.me/leifermendez)
|
||||||
82
starters/apps/base-bailey-memory/app.js
Normal file
82
starters/apps/base-bailey-memory/app.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo hijo
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer('Hola, bienvenido a mi tienda')
|
||||||
|
.addAnswer('Como puedo ayudarte?')
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
console.log(ctx['_data']['notifyName'])
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MockAdapter()
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
const adapterProvider = createProvider(BaileysProvider)
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
20
starters/apps/base-bailey-memory/package.json
Normal file
20
starters/apps/base-bailey-memory/package.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-bailey-memory",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-bailey-memory",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"@adiwajshing/baileys": "^4.4.0",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
12
starters/apps/base-bailey-mongo/README.md
Normal file
12
starters/apps/base-bailey-mongo/README.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
### BASE APP
|
||||||
|
|
||||||
|
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos Bolsos etc..
|
||||||
|
|
||||||
|
------
|
||||||
|
- [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
- [Twitter](https://twitter.com/leifermendez)
|
||||||
|
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
- [Telegram](https://t.me/leifermendez)
|
||||||
82
starters/apps/base-bailey-mongo/app.js
Normal file
82
starters/apps/base-bailey-mongo/app.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo hijo
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer('Hola, bienvenido a mi tienda')
|
||||||
|
.addAnswer('Como puedo ayudarte?')
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
console.log(ctx['_data']['notifyName'])
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MockAdapter()
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
const adapterProvider = createProvider(BaileysProvider)
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
20
starters/apps/base-bailey-mongo/package.json
Normal file
20
starters/apps/base-bailey-mongo/package.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-bailey-mongo",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-bailey-mongo",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"@adiwajshing/baileys": "^4.4.0",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
12
starters/apps/base-bailey-mysql/README.md
Normal file
12
starters/apps/base-bailey-mysql/README.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
### BASE APP
|
||||||
|
|
||||||
|
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
|
||||||
|
- Bienvenido a mi tienda
|
||||||
|
- Como puedo ayudarte?
|
||||||
|
- Tengo: Zapatos Bolsos etc..
|
||||||
|
|
||||||
|
------
|
||||||
|
- [Discord](https://link.codigoencasa.com/DISCORD)
|
||||||
|
- [Twitter](https://twitter.com/leifermendez)
|
||||||
|
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
|
||||||
|
- [Telegram](https://t.me/leifermendez)
|
||||||
82
starters/apps/base-bailey-mysql/app.js
Normal file
82
starters/apps/base-bailey-mysql/app.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
const {
|
||||||
|
createBot,
|
||||||
|
createProvider,
|
||||||
|
createFlow,
|
||||||
|
addKeyword,
|
||||||
|
addChild,
|
||||||
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo hijo
|
||||||
|
*/
|
||||||
|
|
||||||
|
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
||||||
|
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
||||||
|
.addAnswer('y mas bolsos... bla bla')
|
||||||
|
|
||||||
|
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
||||||
|
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
||||||
|
.addAnswer('y algunas otras cosas.')
|
||||||
|
|
||||||
|
const flowZapatos = addKeyword(['zapatos', 'ZAPATOS'])
|
||||||
|
.addAnswer('🤯 Veo que elegiste zapatos')
|
||||||
|
.addAnswer('Tengo muchos zapatos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*zapatos2*', 'para mas información'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowZapatos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowBolsos = addKeyword(['bolsos', 'BOLSOS'])
|
||||||
|
.addAnswer('🙌 Veo que elegiste bolsos')
|
||||||
|
.addAnswer('Tengo muchos bolsos...bla bla')
|
||||||
|
.addAnswer(
|
||||||
|
['Manda:', '*2*', 'o', '*bolsos2*', 'para mas información.'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos2)]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declarando flujo principal
|
||||||
|
*/
|
||||||
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
|
.addAnswer('Hola, bienvenido a mi tienda')
|
||||||
|
.addAnswer('Como puedo ayudarte?')
|
||||||
|
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
|
||||||
|
.addAnswer(
|
||||||
|
['Para continuar escribe:', '*Zapatos*', 'o', '*Bolsos*'],
|
||||||
|
{ capture: true },
|
||||||
|
(ctx) => {
|
||||||
|
console.log('Aqui puedes ver más info del usuario...')
|
||||||
|
console.log('Puedes enviar un mail, hook, etc..')
|
||||||
|
console.log(ctx)
|
||||||
|
console.log(ctx['_data']['notifyName'])
|
||||||
|
},
|
||||||
|
[...addChild(flowBolsos), ...addChild(flowZapatos)]
|
||||||
|
)
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MockAdapter()
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
const adapterProvider = createProvider(BaileysProvider)
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
20
starters/apps/base-bailey-mysql/package.json
Normal file
20
starters/apps/base-bailey-mysql/package.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "bot-whatsapp-base-bailey-mysql",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"pre-copy": "cd .. && yarn run copy.lib base-bailey-mysql",
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"dependencies": {
|
||||||
|
"@adiwajshing/baileys": "^4.4.0",
|
||||||
|
"@bot-whatsapp/bot": "latest",
|
||||||
|
"@bot-whatsapp/cli": "latest",
|
||||||
|
"@bot-whatsapp/database": "latest",
|
||||||
|
"@bot-whatsapp/provider": "latest"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user