mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-21 21:19:17 +00:00
external downlaod
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -3,4 +3,8 @@
|
|||||||
session.json
|
session.json
|
||||||
chats/*
|
chats/*
|
||||||
!chats/.gitkeep
|
!chats/.gitkeep
|
||||||
|
media/*
|
||||||
|
!media/.gitkeep
|
||||||
|
mediaSend/*
|
||||||
|
!mediaSend/.gitkeep
|
||||||
.env
|
.env
|
||||||
@@ -1,12 +1,90 @@
|
|||||||
const {getData} = require('./mysql')
|
const {getData , getReply} = require('./mysql')
|
||||||
|
|
||||||
const get = (step) => new Promise((resolve, reject) => {
|
const get = (message) => new Promise((resolve, reject) => {
|
||||||
|
/**
|
||||||
|
* Si no estas usando un gesto de base de datos
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(process.env.DATABASE === 'none'){
|
||||||
|
|
||||||
|
const steps = [
|
||||||
|
{
|
||||||
|
keywords:['hola','hi','buen dia'],
|
||||||
|
key:'STEP_1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
keywords:['enviar pdf','pdf','enviarpdf'],
|
||||||
|
key:'STEP_2'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const {key} = steps.find(k => k.keywords.includes(message)) || {key:null}
|
||||||
|
const response = key || null
|
||||||
|
resolve(response)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Si usas MYSQL
|
||||||
|
*/
|
||||||
if(process.env.DATABASE === 'mysql'){
|
if(process.env.DATABASE === 'mysql'){
|
||||||
getData(step,(dt) => {
|
getData(message,(dt) => {
|
||||||
console.log('--->datos--',dt)
|
|
||||||
resolve(dt)
|
resolve(dt)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
module.exports = {get}
|
|
||||||
|
const reply = (step) => new Promise((resolve, reject) => {
|
||||||
|
/**
|
||||||
|
* Si no estas usando un gesto de base de datos
|
||||||
|
*/
|
||||||
|
if(process.env.DATABASE === 'none'){
|
||||||
|
let replyMessage = null;
|
||||||
|
let resData = {replyMessage:'', media:null, trigger:null}
|
||||||
|
switch(step){
|
||||||
|
|
||||||
|
case 'STEP_1':
|
||||||
|
replyMessage = [
|
||||||
|
'✌️ Bienveido a este CHATBOT lo primero \n',
|
||||||
|
'Decirte que mi nombre es Leifer Mendez \n\n',
|
||||||
|
'¿Quieres que te envie mi presentación? \n',
|
||||||
|
'*enviar pdf* o *omitir* \n',
|
||||||
|
].join('');
|
||||||
|
resData = {replyMessage, media:null}
|
||||||
|
resolve(resData);
|
||||||
|
return
|
||||||
|
break;
|
||||||
|
case 'STEP_2':
|
||||||
|
replyMessage = [
|
||||||
|
'Yeah! 😎 \n',
|
||||||
|
'enviando...👌'
|
||||||
|
].join('');
|
||||||
|
resData = {replyMessage, media:'meme-1.png',trigger:'STEP_0'}
|
||||||
|
resolve(resData);
|
||||||
|
return
|
||||||
|
break;
|
||||||
|
case 'STEP_0':
|
||||||
|
replyMessage = [
|
||||||
|
'El flujo ha finalizado \n',
|
||||||
|
'pero puedes ver todo el codigo de este \n',
|
||||||
|
'repositorio en https://github.com/leifermendez/bot-whatsapp.git'
|
||||||
|
].join('');
|
||||||
|
resData = {replyMessage, media: null}
|
||||||
|
resolve(resData);
|
||||||
|
return
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Si usas MYSQL
|
||||||
|
*/
|
||||||
|
if(process.env.DATABASE === 'mysql'){
|
||||||
|
let resData = {replyMessage:'', media:null, trigger:null}
|
||||||
|
getReply(step,(dt) => {
|
||||||
|
resData = {...resData,...dt}
|
||||||
|
resolve(resData)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = {get, reply}
|
||||||
@@ -1,9 +1,26 @@
|
|||||||
const {connection} = require('../config/mysql')
|
const {connection} = require('../config/mysql')
|
||||||
|
|
||||||
const getData = (option_key = '', callback) => connection.query(`SELECT * FROM db_test.keywords WHERE option_key = '${option_key}' LIMIT 1`,(error, results, fields) => {
|
getData = (message = '', callback) => connection.query(
|
||||||
|
`SELECT * FROM db_test.keywords WHERE value LIKE '%${message}%' LIMIT 1`,
|
||||||
|
(error, results
|
||||||
|
) => {
|
||||||
const [response] = results
|
const [response] = results
|
||||||
let parseResponse = response?.value || '';
|
const key = response?.option_key || null
|
||||||
parseResponse = parseResponse.split(',') || []
|
callback(key)
|
||||||
callback(parseResponse)
|
|
||||||
});
|
});
|
||||||
module.exports = {getData}
|
|
||||||
|
|
||||||
|
getReply = (option_key = '', callback) => connection.query(
|
||||||
|
`SELECT * FROM db_test.replies WHERE option_key = '${option_key}' LIMIT 1`,
|
||||||
|
(error, results
|
||||||
|
) => {
|
||||||
|
const [response] = results
|
||||||
|
const value = {
|
||||||
|
replyMessage:response?.value || '',
|
||||||
|
trigger:response?.trigger || '',
|
||||||
|
media:response?.media || ''
|
||||||
|
}
|
||||||
|
callback(value)
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = {getData, getReply}
|
||||||
36
app.js
36
app.js
@@ -46,33 +46,29 @@ const listenMessage = () => client.on('message', async msg => {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const lastStep = await lastTrigger(from) || null;
|
const lastStep = await lastTrigger(from) || null;
|
||||||
|
if (lastStep) {
|
||||||
if (lastStep === 'STEP_2') {
|
const response = await responseMessages(lastStep)
|
||||||
const response = responseMessages(lastStep)
|
await sendMessage(client, from, response.replyMessage);
|
||||||
sendMessage(client, from, response);
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastStep === 'STEP_3') {
|
|
||||||
const response = responseMessages(lastStep)
|
|
||||||
sendMessage(client, from, response);
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Respondemos al primero paso si encuentra palabras clave
|
* Respondemos al primero paso si encuentra palabras clave
|
||||||
*/
|
*/
|
||||||
if (await getMessages('STEP_1', message)) {
|
const step = await getMessages(message);
|
||||||
const response = responseMessages('STEP_1')
|
if (step) {
|
||||||
sendMessage(client, from, response, 'STEP_2');
|
const response = await responseMessages(step)
|
||||||
|
await sendMessage(client, from, response.replyMessage, response.trigger);
|
||||||
|
|
||||||
|
if(!response.delay && response.media){
|
||||||
|
sendMedia(client, from, response.media);
|
||||||
|
}
|
||||||
|
if(response.delay && response.media){
|
||||||
|
setTimeout(() => {
|
||||||
|
sendMedia(client, from, response.media);
|
||||||
|
},response.delay)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (getMessages('STEP_2').includes(message)) {
|
|
||||||
// const response = responseMessages('STEP_2')
|
|
||||||
// sendMessage(client, from, response);
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
const {get} = require('../adapter')
|
const {get, reply} = require('../adapter')
|
||||||
|
const {saveExternalFile} = require('./handle')
|
||||||
|
|
||||||
const getMessages = async (step, message) => {
|
const getMessages = async (message) => {
|
||||||
const data = await get(step)
|
const data = await get(message)
|
||||||
return data.includes(message)
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const responseMessages = async (step) => {
|
||||||
const responseMessages = (step) => {
|
const data = await reply(step)
|
||||||
switch (step) {
|
if(data && data.media){
|
||||||
case 'STEP_1':
|
const file = await saveExternalFile(data.media)
|
||||||
return ['Si como estas', '🤔'].join('')
|
return {...data,...{media:file}}
|
||||||
break;
|
|
||||||
case 'STEP_2':
|
|
||||||
return ['pa como estas', '🤔'].join('')
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return null
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { getMessages, responseMessages }
|
module.exports = { getMessages, responseMessages }
|
||||||
@@ -1,7 +1,28 @@
|
|||||||
|
const http = require('http'); // or 'https' for https:// URLs
|
||||||
|
const https = require('https'); // or 'https' for https:// URLs
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
|
||||||
const cleanNumber = (number) => {
|
const cleanNumber = (number) => {
|
||||||
number = number.replace('@c.us', '');
|
number = number.replace('@c.us', '');
|
||||||
number = `${number}@c.us`;
|
number = `${number}@c.us`;
|
||||||
return number
|
return number
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {cleanNumber}
|
const saveExternalFile = (url) => new Promise((resolve, reject) => {
|
||||||
|
const ext = url.split('.').pop()
|
||||||
|
const checkProtocol = url.split('/').includes('https:');
|
||||||
|
console.log(checkProtocol)
|
||||||
|
const handleHttp = checkProtocol ? https : http;
|
||||||
|
const name = `${Date.now()}.${ext}`;
|
||||||
|
const file = fs.createWriteStream(`./mediaSend/${name}`);
|
||||||
|
const request = handleHttp.get(url, function(response) {
|
||||||
|
const ext = response.headers['content-type'].split('/').pop()
|
||||||
|
response.pipe(file);
|
||||||
|
file.on('finish', function() {
|
||||||
|
file.close(); // close() is async, call cb after close completes.
|
||||||
|
resolve(name)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
module.exports = {cleanNumber, saveExternalFile}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
const mimeDb = require('mime-db')
|
const mimeDb = require('mime-db')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Guardamos archivos multimedia que nuestro cliente nos envie!
|
* Guardamos archivos multimedia que nuestro cliente nos envie!
|
||||||
@@ -6,10 +7,10 @@ const mimeDb = require('mime-db')
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
const saveMedia = () => {
|
const saveMedia = (media) => {
|
||||||
const extensionProcess = mimeDb[media.mimetype]
|
const extensionProcess = mimeDb[media.mimetype]
|
||||||
const ext = extensionProcess.extensions[0]
|
const ext = extensionProcess.extensions[0]
|
||||||
fs.writeFile(`../media/${media.filename}.${ext}`, media.data, { encoding: 'base64' }, function (err) {
|
fs.writeFile(`./media/${Date.now()}.${ext}`, media.data, { encoding: 'base64' }, function (err) {
|
||||||
console.log('** Archivo Media Guardado **');
|
console.log('** Archivo Media Guardado **');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ const moment = require('moment');
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const { MessageMedia } = require('whatsapp-web.js');
|
const { MessageMedia } = require('whatsapp-web.js');
|
||||||
const { cleanNumber } = require('./handle')
|
const { cleanNumber } = require('./handle')
|
||||||
|
const { saveMedia } = require('../controllers/save')
|
||||||
/**
|
/**
|
||||||
* Enviamos archivos multimedia a nuestro cliente
|
* Enviamos archivos multimedia a nuestro cliente
|
||||||
* @param {*} number
|
* @param {*} number
|
||||||
@@ -11,20 +12,24 @@ const { cleanNumber } = require('./handle')
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const sendMedia = (client, number, fileName) => {
|
const sendMedia = (client, number, fileName) => {
|
||||||
|
const dirMedia = `${__dirname}/../mediaSend/${fileName}`;
|
||||||
|
console.log(dirMedia)
|
||||||
number = cleanNumber(number)
|
number = cleanNumber(number)
|
||||||
const media = MessageMedia.fromFilePath(`${__dirname}/../mediaSend/${fileName}`);
|
if(fs.existsSync(dirMedia)){
|
||||||
|
const media = MessageMedia.fromFilePath(dirMedia);
|
||||||
client.sendMessage(number, media);
|
client.sendMessage(number, media);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enviamos un mensaje simple (texto) a nuestro cliente
|
* Enviamos un mensaje simple (texto) a nuestro cliente
|
||||||
* @param {*} number
|
* @param {*} number
|
||||||
*/
|
*/
|
||||||
const sendMessage = (client, number = null, text = null, trigger = null) => {
|
const sendMessage = async (client, number = null, text = null, trigger = null) => {
|
||||||
number = cleanNumber(number)
|
number = cleanNumber(number)
|
||||||
const message = text
|
const message = text
|
||||||
client.sendMessage(number, message);
|
client.sendMessage(number, message);
|
||||||
readChat(number, message, trigger)
|
await readChat(number, message, trigger)
|
||||||
console.log(`⚡⚡⚡ Enviando mensajes....`);
|
console.log(`⚡⚡⚡ Enviando mensajes....`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,8 +40,7 @@ const lastTrigger = (number) => new Promise((resolve, reject) => {
|
|||||||
number = cleanNumber(number)
|
number = cleanNumber(number)
|
||||||
const pathExcel = `${__dirname}/../chats/${number}.xlsx`;
|
const pathExcel = `${__dirname}/../chats/${number}.xlsx`;
|
||||||
const workbook = new ExcelJS.Workbook();
|
const workbook = new ExcelJS.Workbook();
|
||||||
if(fs.existsSync(pathExcel))
|
if (fs.existsSync(pathExcel)) {
|
||||||
{
|
|
||||||
workbook.xlsx.readFile(pathExcel)
|
workbook.xlsx.readFile(pathExcel)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
const worksheet = workbook.getWorksheet(1);
|
const worksheet = workbook.getWorksheet(1);
|
||||||
@@ -45,7 +49,7 @@ const lastTrigger = (number) => new Promise((resolve, reject) => {
|
|||||||
const lastStep = getRowPrevStep.getCell('C').value;
|
const lastStep = getRowPrevStep.getCell('C').value;
|
||||||
resolve(lastStep)
|
resolve(lastStep)
|
||||||
});
|
});
|
||||||
}else{
|
} else {
|
||||||
resolve(null)
|
resolve(null)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -55,7 +59,7 @@ const lastTrigger = (number) => new Promise((resolve, reject) => {
|
|||||||
* @param {*} number
|
* @param {*} number
|
||||||
* @param {*} message
|
* @param {*} message
|
||||||
*/
|
*/
|
||||||
const readChat = async (number, message, trigger = null) => {
|
const readChat = async (number, message, trigger = null) => {
|
||||||
const pathExcel = `${__dirname}/../chats/${number}.xlsx`;
|
const pathExcel = `${__dirname}/../chats/${number}.xlsx`;
|
||||||
const workbook = new ExcelJS.Workbook();
|
const workbook = new ExcelJS.Workbook();
|
||||||
const today = moment().format('DD-MM-YYYY hh:mm')
|
const today = moment().format('DD-MM-YYYY hh:mm')
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
Reference in New Issue
Block a user