const { WhasAppClient } = require('./whatsapp-client.js'); const { MessageMedia } = require('whatsapp-web.js'); const express = require('express'); const qrcode = require('qrcode-terminal'); const axios = require('axios'); const f = require('fs'); const map = new Map(); const duplicateMap = new Map(); function createWa(be, res) { const wa = new WhasAppClient(be); wa.client.on('qr', async qr => { console.log(`be:${wa.clientId}:qr:${qr}`); if (res == null) { wa.client.destroy(); return; } if (!wa.isGenerateQr) { if (res != null) res.json({ status: '00', be: wa.clientId, qr: qr }); } wa.isGenerateQr = true; // generate qr terminal qrcode.generate(qr, { small: true }); // kirim ke abi untuk update qr axios.post('https://nexilis.io/dashboardv2/logics/insert_whatsapp_qrcode', { be: wa.clientId, qrcode: qr }) .then(function (response) { console.log(`response: ${response.data}`); }) .catch(function (error) { console.log(error); }); }); wa.client.on('ready', () => { console.log(`be:${wa.clientId}:Client is ready!`); map.set(wa.clientId, wa.client); if (!wa.isGenerateQr) { if (res != null) res.json({ status: '00', be: wa.clientId }); } }); wa.client.on('disconnected', async (reason) => { console.log(`be:${wa.clientId}:Client was logged out`, reason); wa.client.destroy(); map.delete(wa.clientId); }); } f.readdir('.wwebjs_auth', (err, files) => { files.forEach(file => { console.log(`Read session: ${file}`); const be = file.split('-')[1]; createWa(be); }); }); const app = express(); app.use(express.json({ limit: '50mb' })); app.get("/api/qr/:be", (req, res) => { try { console.log(`params:${req.params.be}`); const be = req.params.be; const client = map.get(be); if (client != null) { res.json({ status: '00', be: be }); return; } const duplicate = duplicateMap.get(be); if (duplicate != null) { res.json({ status: '02', be: be, description: 'Duplicate request' }); return; } duplicateMap.set(be, be); createWa(be, res); } catch (error) { console.log(`error:${error}`); } }); app.post("/api/send/:be", async (req, res) => { try { console.log(`params:${req.params.be}, body:${JSON.stringify(req.body)}`); const be = req.params.be; const client = map.get(be); if (client == null) { res.json({ status: '01', be: be, description: 'Unauthorize access' }); return; } const to = req.body.to; const message = req.body.message; if (Object.hasOwn(message, 'media')) { const fileName = req.body.message.fileName; const media = req.body.message.media; const data = req.body.message.data; const caption = req.body.message.caption; let messageMedia = new MessageMedia(media, data, fileName); await client.sendMessage(`${to}@c.us`, messageMedia, { caption: caption }); res.json({ status: '00', be: be }); return; } await client.sendMessage(`${to}@c.us`, message); res.json({ status: '00', be: be }); } catch (error) { console.log(`error:${error}`); } }); const https = require('https'); const fs = require('fs'); const port = process.env.PORT || 9009; const options = { key: fs.readFileSync('./server.key'), cert: fs.readFileSync('./server.crt'), rejectUnauthorized: false, requestCert: true, agent: false }; https.createServer(options, app).listen(port, () => { console.log(`Server running on port ${port}`); });