Compare commits

...

12 Commits

Author SHA1 Message Date
Leifer
e9ed8e514e update changelog 2022-10-20 14:06:13 +02:00
Leifer
f36ddd3014 update 2022-10-20 13:51:43 +02:00
Leifer Mendez
3fadaaaf13 Merge pull request #82 from Gonzalito87/patch-7
Update de librerias
2022-08-09 20:57:57 +02:00
Leifer Mendez
dfa569f29d Merge pull request #83 from aurik3/dev-pull
coreccion nanoid y send.js
2022-08-09 20:57:41 +02:00
Leifer Mendez
601508f379 Merge branch 'main' into dev-pull 2022-08-09 20:57:29 +02:00
aurik3
e7ad205268 coreccion nanoid y send.js
se corrigen errores en el codigo
2022-08-09 13:43:28 -05:00
Gonzalito87
f62ba0a076 Update de librerias 2022-08-08 15:19:13 -03:00
Leifer Mendez
a9efa0aa58 Merge pull request #71 from ulisesvina/main
Arreglado: comprobación de parámetros en funciones y problemas de inconsistencia.
2022-08-08 14:47:33 +02:00
Leifer Mendez
3276c21bc3 Merge pull request #75 from aurik3/dev-pull
Update Julio 2022
2022-07-22 12:57:14 +02:00
aurik3
1114f25a71 Update Julio 2022
Se añade localAuth para mantener la session despues de escanear el codigo y se hace un code fix al api rest

Co-Authored-By: Leifer Mendez <15802366+leifermendez@users.noreply.github.com>
2022-07-19 18:15:12 -05:00
Ulises Viña
f13a34ff75 Update send.js 2022-07-05 20:59:06 -05:00
Leifer Mendez
d45ea85e7d Merge pull request #57 from leifermendez/rev-global
rex
2022-04-27 21:33:51 +02:00
11 changed files with 6396 additions and 703 deletions

View File

@@ -11,4 +11,8 @@
- easy deploy heroku - easy deploy heroku
- add support for ubuntu/linux - add support for ubuntu/linux
https://stackoverflow.com/questions/51855169/dialogflow-403-iam-permission-dialogflow-sessions-detectintent https://stackoverflow.com/questions/51855169/dialogflow-403-iam-permission-dialogflow-sessions-detectintent
#### Actualización 20 Oct 2022
- npm update
- use node crypto instead of nanoid

View File

@@ -1,6 +1,6 @@
const dialogflow = require('@google-cloud/dialogflow'); const dialogflow = require('@google-cloud/dialogflow');
const fs = require('fs') const fs = require('fs')
const nanoid = require('nanoid') const crypto = require('crypto');
/** /**
* Debes de tener tu archivo con el nombre "chatbot-account.json" en la raíz del proyecto * Debes de tener tu archivo con el nombre "chatbot-account.json" en la raíz del proyecto
*/ */
@@ -32,7 +32,7 @@ const checkFileCredentials = () => {
// Detect intent method // Detect intent method
const detectIntent = async (queryText) => { const detectIntent = async (queryText) => {
let media = null; let media = null;
const sessionId = KEEP_DIALOG_FLOW ? 1 : nanoid(); const sessionId = KEEP_DIALOG_FLOW ? 1 : crypto.randomUUID();
const sessionPath = sessionClient.projectAgentSessionPath(PROJECID, sessionId); const sessionPath = sessionClient.projectAgentSessionPath(PROJECID, sessionId);
const languageCode = process.env.LANGUAGE const languageCode = process.env.LANGUAGE
const request = { const request = {

View File

@@ -21,6 +21,7 @@ getReply = (option_key = '', callback) => connection.query(
replyMessage:response?.replyMessage || '', replyMessage:response?.replyMessage || '',
trigger:response?.trigger || '', trigger:response?.trigger || '',
media:response?.media || '' media:response?.media || ''
} }
callback(value) callback(value)
}); });

76
app.js
View File

@@ -6,7 +6,7 @@ const fs = require('fs');
const express = require('express'); const express = require('express');
const cors = require('cors') const cors = require('cors')
const qrcode = require('qrcode-terminal'); const qrcode = require('qrcode-terminal');
const { Client } = require('whatsapp-web.js'); const { Client,LocalAuth } = require('whatsapp-web.js');
const mysqlConnection = require('./config/mysql') const mysqlConnection = require('./config/mysql')
const { middlewareClient } = require('./middleware/client') const { middlewareClient } = require('./middleware/client')
const { generateImage, cleanNumber, checkEnvFile, createClient, isValidNumber } = require('./controllers/handle') const { generateImage, cleanNumber, checkEnvFile, createClient, isValidNumber } = require('./controllers/handle')
@@ -21,10 +21,7 @@ const MULTI_DEVICE = process.env.MULTI_DEVICE || 'true';
const server = require('http').Server(app) const server = require('http').Server(app)
const port = process.env.PORT || 3000 const port = process.env.PORT || 3000
const SESSION_FILE_PATH = './session.json';
var client; var client;
var sessionData;
app.use('/', require('./routes/web')) app.use('/', require('./routes/web'))
/** /**
@@ -127,77 +124,38 @@ const listenMessage = () => client.on('message', async msg => {
} }
}); });
/**
* Revisamos si tenemos credenciales guardadas para inciar sessio
* este paso evita volver a escanear el QRCODE
*/
const withSession = () => {
console.log(`Validando session con Whatsapp...`)
sessionData = require(SESSION_FILE_PATH);
client = new Client(createClient(sessionData,true));
client.on('ready', () => {
connectionReady() client = new Client({
listenMessage() authStrategy: new LocalAuth(),
puppeteer: { headless: true }
}); });
client.on('auth_failure', () => connectionLost()) client.on('qr', qr => generateImage(qr, () => {
client.initialize();
}
/**
* Generamos un QRCODE para iniciar sesion
*/
const withOutSession = () => {
console.log('No tenemos session guardada');
console.log([
'🙌 El core de whatsapp se esta actualizando',
'🙌 para proximamente dar paso al multi-device',
'🙌 falta poco si quieres estar al pendiente unete',
'🙌 http://t.me/leifermendez',
'🙌 Si estas usando el modo multi-device se generan 2 QR Code escanealos',
'🙌 Ten paciencia se esta generando el QR CODE',
'________________________',
].join('\n'));
client = new Client(createClient());
client.on('qr', qr => generateImage(qr, () => {
qrcode.generate(qr, { small: true }); qrcode.generate(qr, { small: true });
console.log(`Ver QR http://localhost:${port}/qr`) console.log(`Ver QR http://localhost:${port}/qr`)
socketEvents.sendQR(qr) socketEvents.sendQR(qr)
})) }))
client.on('ready', (a) => { client.on('ready', (a) => {
connectionReady() connectionReady()
listenMessage() listenMessage()
// socketEvents.sendStatus(client) // socketEvents.sendStatus(client)
}); });
client.on('auth_failure', (e) => { client.on('auth_failure', (e) => {
// console.log(e) // console.log(e)
// connectionLost() // connectionLost()
}); });
client.on('authenticated', (session) => { client.on('authenticated', () => {
sessionData = session; console.log('AUTHENTICATED');
if(sessionData){ });
fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), function (err) {
if (err) {
console.log(`Ocurrio un error con el archivo: `, err);
}
});
}
});
client.initialize(); client.initialize();
}
/**
* Revisamos si existe archivo con credenciales!
*/
(fs.existsSync(SESSION_FILE_PATH) && MULTI_DEVICE === 'false') ? withSession() : withOutSession();
/** /**
* Verificamos si tienes un gesto de db * Verificamos si tienes un gesto de db

View File

@@ -1,9 +1,9 @@
const mysql = require('mysql'); const mysql = require('mysql');
const connection = mysql.createConnection({ const connection = mysql.createConnection({
host : process.env.SQL_HOST || 'localhost', host : process.env.SQL_HOST || 'localhost',
user : process.env.SQL_USER || 'me', user : process.env.SQL_USER || 'root',
password : process.env.SQL_PASS || '', password : process.env.SQL_PASS || '',
database : process.env.SQL_DATABASE || 'my_db' database : process.env.SQL_DATABASE || 'pruebas'
}); });
const connect = () => connection.connect(function(err) { const connect = () => connection.connect(function(err) {

View File

@@ -64,32 +64,14 @@ const checkEnvFile = () => {
* @param {*} session * @param {*} session
* @param {*} cb * @param {*} cb
*/ */
const createClient = (session = {}, login = false) => { const createClient = () => {
console.log(`Mode: ${(MULTI_DEVICE === 'false') ? 'No Multi-device' : 'Si Multi-device'} `) client = new Client({
const objectLegacy = (login) ? { authStrategy: new LocalAuth(
authStrategy: new LegacySessionAuth({ {dataPath: './sessions/',
session clientId: 'bot'}),
}) puppeteer: { headless: false }
} : {session};
});
if(MULTI_DEVICE == 'false') {
return {...objectLegacy,
restartOnAuthFail: true,
puppeteer: {
args: [
'--no-sandbox'
],
}
}
}else{
return {
puppeteer: {
headless: true,
args: ['--no-sandbox']
},
clientId: 'client-one'
}
}
} }
const isValidNumber = (rawNumber) => { const isValidNumber = (rawNumber) => {

View File

@@ -15,12 +15,17 @@ const { saveMessage } = require('../adapter')
* @param {*} fileName * @param {*} fileName
*/ */
const sendMedia = (client, number, fileName) => { const sendMedia = (client, number = null, fileName = null) => {
number = cleanNumber(number) if(!client) return cosnole.error("El objeto cliente no está definido.");
const file = `${DIR_MEDIA}/${fileName}`; try {
if (fs.existsSync(file)) { number = cleanNumber(number || 0)
const media = MessageMedia.fromFilePath(file); const file = `${DIR_MEDIA}/${fileName}`;
client.sendMessage(number, media, { sendAudioAsVoice: true }); if (fs.existsSync(file)) {
const media = MessageMedia.fromFilePath(file);
client.sendMessage(number, media, { sendAudioAsVoice: true });
}
} catch(e) {
throw e;
} }
} }
@@ -30,15 +35,21 @@ const sendMedia = (client, number, fileName) => {
* @param {*} fileName * @param {*} fileName
*/ */
const sendMediaVoiceNote = (client, number, fileName) => { const sendMediaVoiceNote = (client, number = null, fileName = null) => {
number = cleanNumber(number) if(!client) return cosnole.error("El objeto cliente no está definido.");
const file = `${DIR_MEDIA}/${fileName}`; try {
if (fs.existsSync(file)) { number = cleanNumber(number || 0)
const media = MessageMedia.fromFilePath(file); const file = `${DIR_MEDIA}/${fileName}`;
client.sendMessage(number, media ,{ sendAudioAsVoice: true }); if (fs.existsSync(file)) {
} const media = MessageMedia.fromFilePath(file);
client.sendMessage(number, media ,{ sendAudioAsVoice: true });
}
}catch(e) {
throw e;
} }
}
/** /**
* Enviamos un mensaje simple (texto) a nuestro cliente * Enviamos un mensaje simple (texto) a nuestro cliente
* @param {*} number * @param {*} number
@@ -99,4 +110,4 @@ const readChat = async (number, message, trigger = null) => {
console.log('Saved') console.log('Saved')
} }
module.exports = { sendMessage, sendMedia, lastTrigger, sendMessageButton, readChat, sendMediaVoiceNote } module.exports = { sendMessage, sendMedia, lastTrigger, sendMessageButton, readChat, sendMediaVoiceNote }

View File

@@ -2,6 +2,7 @@ const fs = require('fs')
const { sendMessage } = require('../controllers/send') const { sendMessage } = require('../controllers/send')
const sendMessagePost = (req, res) => { const sendMessagePost = (req, res) => {
console.log('asdasdasdasdasd')
const { message, number } = req.body const { message, number } = req.body
const client = req.clientWs || null; const client = req.clientWs || null;
sendMessage(client, number, message) sendMessage(client, number, message)

6876
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +1,58 @@
{ {
"name": "test-ws-bot", "name": "bot-whatsapp",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "Bot de wahtsapp open source para MVP o pequeños negocios",
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"start": "node ./app.js", "start": "node ./app.js",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"keywords": [], "keywords": [
"author": "", "whatsapp",
"bot-whatsapp",
"node-bot-whatsapp"
],
"contributors": [
{
"email": "leifer33@gmail.com",
"name": "Leifer Mendez",
"url": "https://leifermendez.github.io"
},
{
"name": "aurik3",
"email": "aurik3@aurik3.com",
"url": "https://github.com/aurik3"
}
],
"repository": {
"type": "git",
"url": "https://github.com/leifermendez/bot-whatsapp"
},
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@google-cloud/dialogflow": "^4.7.0", "@google-cloud/dialogflow": "^5.2.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^11.0.0", "dotenv": "^16.0.1",
"exceljs": "^4.3.0", "exceljs": "^4.3.0",
"express": "^4.17.2", "express": "^4.18.1",
"file-type": "^16.5.3", "file-type": "^17.1.6",
"mime-db": "^1.51.0", "mime-db": "^1.52.0",
"moment": "^2.29.2", "moment": "^2.29.4",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"nanoid": "^3.3.2",
"qr-image": "^3.2.0", "qr-image": "^3.2.0",
"qrcode-terminal": "^0.12.0", "qrcode-terminal": "^0.12.0",
"socket.io": "^4.4.1", "socket.io": "^4.5.1",
"stormdb": "^0.5.2", "stormdb": "^0.6.0",
"whatsapp-web.js": "^1.16.6", "whatsapp-web.js": "^1.17.1",
"xlsx": "^0.16.9" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"pm2": "^5.1.2", "pm2": "^5.2.0",
"prettier": "2.5.1" "prettier": "2.7.1"
}, },
"engines": { "engines": {
"node": "14.x" "node": "16.x"
} }
} }

View File

@@ -1,6 +1,6 @@
const express = require('express') const express = require('express')
const router = express.Router(); const router = express.Router();
const { sendMessagePost } = require('../controllers/web') const { sendMessagePost } = require('../controllers/web')|
router.post('/send', sendMessagePost) router.post('/send', sendMessagePost)