123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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) {
- try {
- await wa.client.destroy();
- } catch (error) {
- console.log(error);
- }
- 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);
- await wa.client.destroy();
- map.delete(wa.clientId);
- });
- }
- f.readdir('.wwebjs_auth', (err, files) => {
- if (files != null) {
- 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}`);
- });
|