external downlaod

This commit is contained in:
Leifer Mendez
2022-01-15 17:42:13 +01:00
parent ccca7f5612
commit 1533161bbd
9 changed files with 180 additions and 62 deletions

4
.gitignore vendored
View File

@@ -3,4 +3,8 @@
session.json session.json
chats/* chats/*
!chats/.gitkeep !chats/.gitkeep
media/*
!media/.gitkeep
mediaSend/*
!mediaSend/.gitkeep
.env .env

View File

@@ -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}

View File

@@ -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
View File

@@ -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
// }
}); });
/** /**

View File

@@ -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 }

View File

@@ -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}

View File

@@ -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 **');
}); });
} }

View File

@@ -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)){
client.sendMessage(number, media); const media = MessageMedia.fromFilePath(dirMedia);
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,17 +40,16 @@ 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);
const lastRow = worksheet.lastRow; const lastRow = worksheet.lastRow;
const getRowPrevStep = worksheet.getRow(lastRow.number); const getRowPrevStep = worksheet.getRow(lastRow.number);
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