mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-20 20:49:15 +00:00
Compare commits
12 Commits
rev-global
...
update
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9ed8e514e | ||
|
|
f36ddd3014 | ||
|
|
3fadaaaf13 | ||
|
|
dfa569f29d | ||
|
|
601508f379 | ||
|
|
e7ad205268 | ||
|
|
f62ba0a076 | ||
|
|
a9efa0aa58 | ||
|
|
3276c21bc3 | ||
|
|
1114f25a71 | ||
|
|
f13a34ff75 | ||
|
|
d45ea85e7d |
@@ -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
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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
76
app.js
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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
6876
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
56
package.json
56
package.json
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user