commit
c085755de5
8 changed files with 8430 additions and 0 deletions
@ -0,0 +1,20 @@ |
|||||||
|
FROM node:22 |
||||||
|
|
||||||
|
RUN apt update && apt install curl gnupg -y \ |
||||||
|
&& curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ |
||||||
|
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ |
||||||
|
&& apt update \ |
||||||
|
&& apt install google-chrome-stable -y --no-install-recommends \ |
||||||
|
&& rm -rf /var/lib/apt/lists/* |
||||||
|
|
||||||
|
RUN mkdir -p /home/node/app && mkdir -p /home/node/app/assets/images |
||||||
|
WORKDIR /home/node/app |
||||||
|
COPY package*.json ./ |
||||||
|
COPY botmon.js config.js utils.js ./ |
||||||
|
|
||||||
|
RUN npm install |
||||||
|
RUN chown -R node:node /home/node/app |
||||||
|
|
||||||
|
EXPOSE 5000 |
||||||
|
|
||||||
|
CMD [ "node", "botmon.js" ] |
@ -0,0 +1,159 @@ |
|||||||
|
const express = require('express'); |
||||||
|
const venom = require('venom-bot'); |
||||||
|
const app = express(); |
||||||
|
|
||||||
|
let botClient; |
||||||
|
|
||||||
|
app.use(express.json({ limit: '10mb' })); |
||||||
|
|
||||||
|
const { session_name, port, browser_args } = require('./config.js'); |
||||||
|
const { send_message, send_image, get_all_chats, base64ToFile } = require('./utils.js'); |
||||||
|
|
||||||
|
venom |
||||||
|
.create( |
||||||
|
//session
|
||||||
|
session_name, //Pass the name of the client you want to start the bot
|
||||||
|
//catchQR
|
||||||
|
(base64Qrimg, asciiQR, attempts, urlCode) => { |
||||||
|
console.log('Number of attempts to read the qrcode: ', attempts); |
||||||
|
console.log('Terminal qrcode: ', asciiQR); |
||||||
|
console.log('base64 image string qrcode: ', base64Qrimg); |
||||||
|
console.log('urlCode (data-ref): ', urlCode); |
||||||
|
}, |
||||||
|
// statusFind
|
||||||
|
(statusSession, session) => { |
||||||
|
console.log('Status Session: ', statusSession); //return isLogged || notLogged || browserClose || qrReadSuccess || qrReadFail || autocloseCalled || desconnectedMobile || deleteToken || chatsAvailable || deviceNotConnected || serverWssNotConnected || noOpenBrowser || initBrowser || openBrowser || connectBrowserWs || initWhatsapp || erroPageWhatsapp || successPageWhatsapp || waitForLogin || waitChat || successChat
|
||||||
|
//Create session wss return "serverClose" case server for close
|
||||||
|
console.log('Session name: ', session); |
||||||
|
}, |
||||||
|
// options
|
||||||
|
{ |
||||||
|
browserPathExecutable: '/usr/bin/google-chrome-stable', // browser executable path
|
||||||
|
folderNameToken: 'tokens', //folder name when saving tokens
|
||||||
|
mkdirFolderToken: '', //folder directory tokens, just inside the venom folder, example: { mkdirFolderToken: '/node_modules', } //will save the tokens folder in the node_modules directory
|
||||||
|
headless: 'new', // you should no longer use boolean false or true, now use false, true or 'new' learn more https://developer.chrome.com/articles/new-headless/
|
||||||
|
devtools: false, // Open devtools by default
|
||||||
|
debug: false, // Opens a debug session
|
||||||
|
logQR: true, // Logs QR automatically in terminal
|
||||||
|
browserWS: '', // If u want to use browserWSEndpoint
|
||||||
|
browserArgs: ['--no-sandbox', browser_args], // Original parameters ---Parameters to be added into the chrome browser instance
|
||||||
|
addBrowserArgs: [], // Add broserArgs without overwriting the project's original
|
||||||
|
puppeteerOptions: {}, // Will be passed to puppeteer.launch
|
||||||
|
disableSpins: true, // Will disable Spinnies animation, useful for containers (docker) for a better log
|
||||||
|
disableWelcome: true, // Will disable the welcoming message which appears in the beginning
|
||||||
|
updatesLog: true, // Logs info updates automatically in terminal
|
||||||
|
autoClose: 60000, // Automatically closes the venom-bot only when scanning the QR code (default 60 seconds, if you want to turn it off, assign 0 or false)
|
||||||
|
createPathFileToken: false, // creates a folder when inserting an object in the client's browser, to work it is necessary to pass the parameters in the function create browserSessionToken
|
||||||
|
addProxy: [''], // Add proxy server exemple : [e1.p.webshare.io:01, e1.p.webshare.io:01]
|
||||||
|
userProxy: '', // Proxy login username
|
||||||
|
userPass: '' // Proxy password
|
||||||
|
}, |
||||||
|
|
||||||
|
// BrowserInstance
|
||||||
|
(browser, waPage) => { |
||||||
|
console.log('Browser PID:', browser.process().pid); |
||||||
|
waPage.screenshot({ path: 'screenshot.png' }); |
||||||
|
} |
||||||
|
) |
||||||
|
.then((client) => { |
||||||
|
botClient = client |
||||||
|
start(client); |
||||||
|
}) |
||||||
|
.catch((erro) => { |
||||||
|
console.log(erro); |
||||||
|
}); |
||||||
|
|
||||||
|
function start(client) { |
||||||
|
client.onMessage((message) => { |
||||||
|
if (message.body === 'Hi' && message.isGroupMsg === false) { |
||||||
|
client |
||||||
|
.sendText(message.from, 'Welcome!') |
||||||
|
.then((result) => { |
||||||
|
console.log('Result: ', result); //return object success
|
||||||
|
}) |
||||||
|
.catch((erro) => { |
||||||
|
console.error('Error when sending: ', erro); //return object error
|
||||||
|
}); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
app.get('/', (req, res) => { |
||||||
|
res.send('Hello World!'); |
||||||
|
}); |
||||||
|
|
||||||
|
app.get('/botmon/get-all-chats', (req, res) => {
|
||||||
|
var result = get_all_chats(botClient); |
||||||
|
|
||||||
|
console.log('================ /botmon/get-all-chats'); |
||||||
|
|
||||||
|
result.then(function(data) { |
||||||
|
if (data.code === 200) { |
||||||
|
return res.status(200).json({status: 'success', result: data.result}); |
||||||
|
} else { |
||||||
|
return res.status(500).json({status: 'error', result: data.result}); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
app.post('/botmon/send-message', (req, res) => { |
||||||
|
const { to, message } = req.body; |
||||||
|
|
||||||
|
console.log('================ /botmon/send-message'); |
||||||
|
|
||||||
|
if (!botClient) { |
||||||
|
return res.status(500).json({ error: 'Bot is not initialized' }); |
||||||
|
} |
||||||
|
|
||||||
|
console.log('to', to); |
||||||
|
console.log('message', message); |
||||||
|
|
||||||
|
var result = send_message(botClient, to, message); |
||||||
|
|
||||||
|
result.then(function(data) { |
||||||
|
if (data.code === 200) { |
||||||
|
return res.status(200).json({status: 'success', result: data.result}); |
||||||
|
} else { |
||||||
|
return res.status(500).json({status: 'error', result: data.result}); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
app.post('/botmon/send-image', (req, res) => { |
||||||
|
const { to, name, caption, image_data } = req.body; |
||||||
|
|
||||||
|
console.log('================ /botmon/send-image'); |
||||||
|
|
||||||
|
if (!botClient) { |
||||||
|
return res.status(500).json({ error: 'Bot is not initialized' }); |
||||||
|
} |
||||||
|
|
||||||
|
const now = new Date(); |
||||||
|
const formattedDate = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}`; |
||||||
|
const formattedTime = `${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`; |
||||||
|
const path = 'assets/images/' + name + '-' + formattedDate + formattedTime + '.png'; |
||||||
|
|
||||||
|
console.log('to', to); |
||||||
|
console.log('name', name); |
||||||
|
console.log('caption', caption); |
||||||
|
|
||||||
|
const base64_image = "data:image/png;base64," + image_data |
||||||
|
if (base64ToFile(base64_image, path) === false) { |
||||||
|
return res.status(500).json({ error: 'Error writing image to file'}); |
||||||
|
}
|
||||||
|
|
||||||
|
var result = send_image(botClient, to, base64_image, name, caption); |
||||||
|
|
||||||
|
result.then(function(data) { |
||||||
|
if (data.code === 200) { |
||||||
|
return res.status(200).json({status: 'success', result: data.result}); |
||||||
|
} else { |
||||||
|
return res.status(500).json({status: 'error', result: data.result}); |
||||||
|
} |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
// Start the Express server
|
||||||
|
app.listen(port, () => { |
||||||
|
console.log(`Server running at http://localhost:${port}/`); |
||||||
|
}); |
@ -0,0 +1,9 @@ |
|||||||
|
const session_name = process.env.session_name; |
||||||
|
const port = process.env.port; |
||||||
|
const browser_args = process.env.browser_args; |
||||||
|
|
||||||
|
// const session_name = 'monitoringSession';
|
||||||
|
// const port = 6969;
|
||||||
|
// const browser_args = '--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36';
|
||||||
|
|
||||||
|
module.exports = { session_name, port, browser_args } |
@ -0,0 +1,6 @@ |
|||||||
|
{ |
||||||
|
"dependencies": { |
||||||
|
"express": "^4.19.2", |
||||||
|
"venom-bot": "^5.1.0" |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 8.9 KiB |
@ -0,0 +1,71 @@ |
|||||||
|
const fs = require('fs'); |
||||||
|
|
||||||
|
async function send_message(client, to, message) { |
||||||
|
let res; |
||||||
|
|
||||||
|
await client |
||||||
|
.sendText(to, message) |
||||||
|
.then((result) => { |
||||||
|
console.log('success sending message'); |
||||||
|
res = {result: result, code: 200}; |
||||||
|
}) |
||||||
|
.catch((erro) => {
|
||||||
|
console.error('error while sending message') |
||||||
|
res = {result: erro, code: 500}; |
||||||
|
}); |
||||||
|
|
||||||
|
return res |
||||||
|
} |
||||||
|
|
||||||
|
async function send_image(client, to, base64_image, name, caption = '') { |
||||||
|
let res |
||||||
|
|
||||||
|
await client |
||||||
|
.sendImageFromBase64(to, base64_image, name, caption) |
||||||
|
.then((result) => { |
||||||
|
console.log('success sending image'); |
||||||
|
res = {result: result, code: 200}; |
||||||
|
}) |
||||||
|
.catch((erro) => { |
||||||
|
console.error('error while sending image'); |
||||||
|
res = {result: erro, code: 500}; |
||||||
|
}); |
||||||
|
|
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
async function get_all_chats(client) { |
||||||
|
let res; |
||||||
|
|
||||||
|
await client |
||||||
|
.getAllChats() |
||||||
|
.then((result) => { |
||||||
|
res = {result: result, code: 200}; |
||||||
|
}) |
||||||
|
.catch((erro) => { |
||||||
|
res = {result: erro, code: 500}; |
||||||
|
}); |
||||||
|
|
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
function base64ToFile(base64, filePath) { |
||||||
|
// Remove the Base64 prefix if it exists
|
||||||
|
const base64Data = base64.replace(/^data:image\/\w+;base64,/, ''); |
||||||
|
|
||||||
|
// Decode the Base64 string
|
||||||
|
const binaryData = Buffer.from(base64Data, 'base64'); |
||||||
|
|
||||||
|
// Write the binary data to a file
|
||||||
|
fs.writeFile(filePath, binaryData, (err) => { |
||||||
|
if (err) { |
||||||
|
console.error('Error writing file:', err); |
||||||
|
return false |
||||||
|
} else { |
||||||
|
console.log('File saved successfully:', filePath); |
||||||
|
return true |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { send_message, send_image, get_all_chats, base64ToFile } |
Loading…
Reference in new issue