main.js 3.7 KB

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