main.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. const { WhasAppClient } = require('./whatsapp-client.js');
  2. const { MessageMedia } = require('whatsapp-web.js');
  3. const express = require('express');
  4. const qrcode = require('qrcode-terminal');
  5. const axios = require('axios');
  6. const https = require('https');
  7. const fs = require('fs');
  8. const map = new Map();
  9. const duplicateMap = new Map();
  10. function createWa(be, res) {
  11. const wa = new WhasAppClient(be);
  12. wa.client.on('qr', async qr => {
  13. console.log(`be:${wa.clientId}:qr:${qr}`);
  14. if (res == null) {
  15. try {
  16. await wa.client.destroy();
  17. } catch (error) {
  18. console.log(error);
  19. }
  20. return;
  21. }
  22. if (!wa.isGenerateQr) {
  23. if (res != null) res.json({ status: '00', be: wa.clientId, qr: qr });
  24. }
  25. wa.isGenerateQr = true;
  26. // generate qr terminal
  27. qrcode.generate(qr, { small: true });
  28. // kirim ke abi untuk update qr
  29. axios.post('https://nexilis.io/dashboardv2/logics/insert_whatsapp_qrcode', {
  30. be: wa.clientId,
  31. qrcode: qr
  32. })
  33. .then(function (response) {
  34. console.log(`response: ${response.data}`);
  35. })
  36. .catch(function (error) {
  37. console.log(error);
  38. });
  39. });
  40. wa.client.on('ready', () => {
  41. console.log(`be:${wa.clientId}:Client is ready!`);
  42. map.set(wa.clientId, wa.client);
  43. if (!wa.isGenerateQr) {
  44. if (res != null) res.json({ status: '00', be: wa.clientId });
  45. }
  46. });
  47. wa.client.on('disconnected', async (reason) => {
  48. console.log(`be:${wa.clientId}:Client was logged out`, reason);
  49. await wa.client.destroy();
  50. map.delete(wa.clientId);
  51. });
  52. }
  53. fs.readdir('.wwebjs_auth', (err, files) => {
  54. if (files != null) {
  55. files.forEach(file => {
  56. console.log(`Read session: ${file}`);
  57. const be = file.split('-')[1];
  58. createWa(be);
  59. });
  60. }
  61. });
  62. const app = express();
  63. app.use(express.json({ limit: '50mb' }));
  64. app.get("/api/qr/:be", (req, res) => {
  65. try {
  66. console.log(`params:${req.params.be}`);
  67. const be = req.params.be;
  68. const client = map.get(be);
  69. if (client != null) {
  70. res.json({ status: '00', be: be });
  71. return;
  72. }
  73. const duplicate = duplicateMap.get(be);
  74. if (duplicate != null) {
  75. res.json({ status: '02', be: be, description: 'Duplicate request' });
  76. return;
  77. }
  78. duplicateMap.set(be, be);
  79. createWa(be, res);
  80. } catch (error) {
  81. console.log(`error:${error}`);
  82. }
  83. });
  84. app.post("/api/send/:be", async (req, res) => {
  85. try {
  86. console.log(`params:${req.params.be}, body:${JSON.stringify(req.body)}`);
  87. const be = req.params.be;
  88. const client = map.get(be);
  89. if (client == null) {
  90. res.json({ status: '01', be: be, description: 'Unauthorize access' });
  91. return;
  92. }
  93. const to = req.body.to;
  94. const message = req.body.message;
  95. if (Object.hasOwn(message, 'media')) {
  96. const fileName = req.body.message.fileName;
  97. const media = req.body.message.media;
  98. const data = req.body.message.data;
  99. const caption = req.body.message.caption;
  100. let messageMedia = new MessageMedia(media, data, fileName);
  101. await client.sendMessage(`${to}@c.us`, messageMedia, { caption: caption });
  102. res.json({ status: '00', be: be });
  103. return;
  104. }
  105. await client.sendMessage(`${to}@c.us`, message);
  106. res.json({ status: '00', be: be });
  107. } catch (error) {
  108. console.log(`error:${error}`);
  109. }
  110. });
  111. const port = process.env.PORT || 9009;
  112. const options = {
  113. key: fs.readFileSync('./server.key'),
  114. cert: fs.readFileSync('./server.crt'),
  115. rejectUnauthorized: false,
  116. requestCert: true,
  117. agent: false
  118. };
  119. https.createServer(options, app).listen(port, () => {
  120. console.log(`Server running on port ${port}`);
  121. });