uwa209

Server.js

Aug 6th, 2022
177
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.73 KB | None | 0 0
  1.  
  2. const {
  3. WAConnection,
  4. MessageType,
  5. MessageOptions,
  6. Presence,
  7. Mimetype,
  8. WALocationMessage,
  9. WA_MESSAGE_STUB_TYPES,
  10. ReconnectMode,
  11. ProxyAgent,
  12. waChatKey,
  13. } = require("@adiwajshing/baileys");
  14. const http = require("http");
  15. const https = require("https");
  16. var qrcode = require('qrcode');
  17. const fs = require("fs");
  18. const { body, validationResult } = require('express-validator');
  19. const express = require('express');
  20. const app = express();
  21. const server = http.createServer(app);
  22. const { Server } = require("socket.io");
  23. //const socketIO = require('socket.io');
  24. const { phoneNumberFormatter } = require('./helper/formatter');
  25. const io = new Server(server);
  26. //const io = socketIO(server);
  27. // koneksi database
  28. const mysql = require('mysql');
  29. const request = require('request');
  30. const { json } = require("express");
  31. app.use(express.json());
  32. app.use(express.urlencoded({ extended: true }));
  33. const cron = require('node-cron');
  34.  
  35.  
  36. app.get('*', function(req, res) {
  37. res.redirect('http://localhost/wagw-mpedia-v4'); //ganti dengan url domain Anda
  38. });
  39.  
  40. //konfigurasi koneksi
  41. const db = mysql.createConnection({
  42. host: 'localhost',
  43. user: 'root',
  44. password: '',
  45. database: 'wav4'
  46. });
  47.  
  48. //connect ke database
  49. db.connect((err) =>{
  50. if(err) throw err;
  51. console.log('Mysql Connected...');
  52. });
  53.  
  54. // sesuaikan dengan domain yang digunakan
  55. const configs = {
  56. port: 8000, // custom port to access server
  57. url_callback : 'http://localhost/wagw-mpedia-v4/helper/callback.php'
  58. };
  59. // cronjob
  60.  
  61. cron.schedule('5 * * * *', function() {
  62. console.log('cronjob berjalan')
  63. // console.log('ada init')
  64. const savedSessions = getSessionsFile();
  65.  
  66.  
  67. savedSessions.forEach(sess => {
  68. if(sess.ready == true){
  69. console.log(sess.id)
  70. createSession(sess.id);
  71. }
  72. });
  73. });
  74. const sessions = [];
  75. const SESSIONS_FILE = './whatsapp-sessions.json';
  76. const mkZap = async (id) => {
  77.  
  78. const conn = new WAConnection()
  79. conn.version = [2, 2119, 6];
  80. await conn.loadAuthInfo(`./whatsapp-session-${id}.json`)
  81. if (conn.state == 'open'){
  82. return conn;
  83. } else {
  84.  
  85. await conn.connect()
  86. return conn
  87. }
  88.  
  89. }
  90. const createSessionsFileIfNotExists = function () {
  91. if (!fs.existsSync(SESSIONS_FILE)) {
  92. try {
  93. fs.writeFileSync(SESSIONS_FILE, JSON.stringify([]));
  94. console.log('Sessions file created successfully.');
  95. } catch (err) {
  96. console.log('Failed to create sessions file: ', err);
  97. }
  98. }
  99. }
  100. createSessionsFileIfNotExists();
  101. const setSessionsFile = function (sessions) {
  102. fs.writeFile(SESSIONS_FILE, JSON.stringify(sessions), function (err) {
  103. if (err) {
  104. console.log(err);
  105. }
  106. });
  107. }
  108. const getSessionsFile = function () {
  109.  
  110. return JSON.parse(fs.readFileSync(SESSIONS_FILE));
  111. }
  112. const createSession = function (id) {
  113.  
  114. const conn = new WAConnection();
  115. conn.version = [2, 2119, 6];
  116. conn.setMaxListeners(0);
  117. console.log('Creating session: ' + id);
  118. const SESSION_FILE_PATH = `./whatsapp-session-${id}.json`;
  119. let sessionCfg;
  120. if (fs.existsSync(SESSION_FILE_PATH)) {
  121. sessionCfg = require(SESSION_FILE_PATH);
  122. conn.loadAuthInfo(`./whatsapp-session-${id}.json`)
  123. if(conn.state == 'open'){
  124. io.emit('message', { id: id, text: 'Whatsapp is ready!' });
  125. io.emit('authenticated', { id: id, data : conn.user})
  126. return conn;
  127. } else if( conn.state == 'connecting') {
  128. return;
  129. }
  130. }
  131.  
  132. conn.on('qr', (qr) => {
  133. console.log('QR RECEIVED', qr);
  134. qrcode.toDataURL(qr, (err, url) => {
  135. io.emit('qr', { id: id, src: url });
  136. io.emit('message', { id: id, text: 'QR Code received, scan please!' });
  137. });
  138. conn.removeAllListeners('qr');
  139. });
  140.  
  141. conn.connect();
  142. // conn.on('initial-data-received',function(){
  143. // console.log('aaaaaaaaaaa')
  144. // })
  145. conn.on('open', (result) => {
  146. const session = conn.base64EncodedAuthInfo()
  147. fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), function (err) {
  148. if (err) {
  149. console.error(err);
  150. } else {
  151. console.log('berhasil buat');
  152. }
  153. });
  154. console.log(session);
  155. io.emit('ready', { id: id });
  156. io.emit('message', { id: id, text: 'Whatsapp is ready!' });
  157. io.emit('authenticated', { id: id, data : conn.user})
  158. const savedSessions = getSessionsFile();
  159. const sessionIndex = savedSessions.findIndex(sess => sess.id == id);
  160. savedSessions[sessionIndex].ready = true;
  161. setSessionsFile(savedSessions);
  162.  
  163.  
  164. });
  165. // conn.on('initial-data-received',function(){
  166. // console.log('sfdsf');
  167. // })
  168. conn.on('close', ({ reason }) => {
  169. if (reason == 'invalid_session') {
  170. const nomors = phoneNumberFormatter(conn.user.jid);
  171. const nomor = nomors.replace(/\D/g, '');
  172. console.log(nomor)
  173. if (fs.existsSync(`./whatsapp-session-${nomor}.json`)) {
  174. fs.unlinkSync(`./whatsapp-session-${nomor}.json`);
  175.  
  176. io.emit('close', { id: nomor, text: 'Connection Lost..' });
  177. const savedSessions = getSessionsFile();
  178. const sessionIndex = savedSessions.findIndex(sess => sess.id == nomor);
  179. savedSessions[sessionIndex].ready = false;
  180. //setSessionsFile(savedSessions);
  181. setSessionsFile(savedSessions);
  182. }
  183. }
  184. })
  185. // Menambahkan session ke file
  186. // Tambahkan client ke sessions
  187. sessions.push({
  188. id: id,
  189. });
  190. // Menambahkan session ke file
  191. const savedSessions = getSessionsFile();
  192. const sessionIndex = savedSessions.findIndex(sess => sess.id == id);
  193.  
  194. if (sessionIndex == -1) {
  195. savedSessions.push({
  196. id: id,
  197. ready: false,
  198. });
  199. setSessionsFile(savedSessions);
  200. }
  201.  
  202. conn.on('initial-data-received', async () => {
  203. console.log('initialize');
  204. request({ url: configs.url_callback, method: "POST", json: {"id" : conn.user.jid ,"data" : conn.contacts} })
  205. })
  206.  
  207. // chat masuk
  208. conn.on('chat-update', async chat => {
  209. if(chat.messages && chat.count){
  210. const m = chat.messages.all()[0] // pull the new message from the update
  211. let sender = m.key.remoteJid
  212. const messageContent = m.message
  213. const messageType = Object.keys(messageContent)[0]
  214. if(messageType == 'conversation' ){
  215. var text = m.message.conversation
  216. } else if(messageType == 'extendedTextMessage' ){
  217. var text = m.message.extendedTextMessage.text
  218. } else if(messageType == 'imageMessage'){
  219. var text = m.message.imageMessage.caption
  220. }
  221. const numb = phoneNumberFormatter(conn.user.jid);
  222. const mynumb = numb.replace(/\D/g, '');
  223. //hook
  224. let sqlhook = `SELECT link_webhook FROM device WHERE nomor = ${mynumb} `;
  225. db.query(sqlhook, function (err, result) {
  226. if (err) throw err;
  227. const webhookurl = result[0].link_webhook;
  228. const pesan = {
  229. sender: phoneNumberFormatter(sender),
  230. msg: text
  231. }
  232. kirimwebhook(sender, text, m,conn,webhookurl);
  233. });
  234. // end hook
  235. //autoreply
  236. let sqlautoreply = `SELECT * FROM autoreply WHERE keyword = "${text}" AND nomor = "${mynumb}"`;
  237. db.query(sqlautoreply, function (err, result) {
  238. if (err) throw err;
  239. result.forEach(data => {
  240. if(data.media == ''){
  241. conn.sendMessage(sender, data.response, MessageType.text);
  242. } else {
  243. var media = `${data.media}`;
  244. const ress = data.response
  245. const array = media.split(".");
  246. const ext = array[array.length - 1];
  247. if(ext == 'jpg' || ext == 'png'){
  248. let options = { mimetype: 'image/jpeg' , caption: ress, filename: "file.jpeg" };
  249. conn.sendMessage(sender, {url: media}, MessageType.image, options);
  250. } else if (ext == 'pdf'){
  251. const getlink = media.split("/");
  252. const namefile = getlink[getlink.length - 1]
  253. const link = `./pages/uploads/${namefile}`
  254. conn.sendMessage(sender, { url: link }, MessageType.document, { mimetype: Mimetype['pdf'],filename : namefile })
  255. }
  256. }
  257. });
  258. });
  259. }
  260. })
  261. }
  262. //init
  263. const init = function (socket) {
  264. const savedSessions = getSessionsFile();
  265. savedSessions.forEach(sess => {
  266. if(sess.ready == true){
  267. console.log(sess.id)
  268. createSession(sess.id);
  269. }
  270. });
  271. }
  272.  
  273. init();
  274. // koneksi socket
  275. io.on('connection', function (socket) {
  276. init(socket);
  277. // membuat session
  278. socket.on('create-session', function (data) {
  279. console.log(data)
  280. console.log('Create session: ' + data.id);
  281. createSession(data.id);
  282. });
  283. //
  284. // ini baris untuk logout
  285. socket.on('logout',async function (data) {
  286. if (fs.existsSync(`./whatsapp-session-${data.id}.json`)) {
  287. socket.emit('isdelete', { id : data.id, text :'<h2 class="text-center text-info mt-4">Logout Success, Lets Scan Again<h2>' })
  288. fs.unlinkSync(`./whatsapp-session-${data.id}.json`);
  289. const savedSessions = getSessionsFile();
  290. const sessionIndex = savedSessions.findIndex(sess => sess.id == data.id);
  291. savedSessions[sessionIndex].ready = false;
  292. //setSessionsFile(savedSessions);
  293. setSessionsFile(savedSessions);
  294. } else {
  295. socket.emit('isdelete', { id : data.id, text : '<h2 class="text-center text-danger mt-4">You are have not Login yet!<h2>'})
  296. }
  297. })
  298. //
  299. });
  300.  
  301. // Send message
  302. app.post('/send-message', async (req, res) => {
  303. const sender = req.body.sender;
  304. if (fs.existsSync(`whatsapp-session-${sender}.json`)) {
  305. const client = await mkZap(sender);
  306.  
  307. // var number = phoneNumberFormatter(req.body.number);
  308. const message = req.body.message;
  309. if (req.body.number.length > 15) {
  310. var number = req.body.number;
  311. } else {
  312. var number = phoneNumberFormatter(req.body.number);
  313. var numberExists = await client.isOnWhatsApp(number);
  314. if (!numberExists) {
  315. return res.status(422).json({
  316. status: false,
  317. message: 'The number is not registered'
  318. });
  319. }
  320. }
  321.  
  322. if(client.state == 'open'){
  323. client.sendMessage(number, message, MessageType.text).then(response => {
  324. res.status(200).json({
  325. status: true,
  326. response: response
  327. });
  328. }).catch(err => {
  329. res.status(500).json({
  330. status: false,
  331. response: err
  332. });
  333. });
  334. } else {
  335. res.status(500).json({
  336. status: false,
  337. response: 'Please scan the QR before use this API'
  338. });
  339. }
  340. } else {
  341. res.writeHead(401, {
  342. 'Content-Type': 'application/json'
  343. });
  344. res.end(JSON.stringify({
  345. status: false,
  346. message: 'Please scan the QR before use the API 2'
  347. }));
  348. }
  349. });
  350.  
  351. // send media
  352. app.post('/send-media', async (req, res) => {
  353. const sender = req.body.sender;
  354. if (fs.existsSync(`whatsapp-session-${sender}.json`)) {
  355. const client = await mkZap(sender);
  356. const url = req.body.url;
  357. const filetype = req.body.filetype;
  358. const filename = req.body.filename;
  359. const caption = req.body.caption;
  360. // var number = phoneNumberFormatter(req.body.number);
  361. // const message = req.body.message;
  362. if (req.body.number.length > 18) {
  363. var number = req.body.number;
  364. } else {
  365. var number = phoneNumberFormatter(req.body.number);
  366. var numberExists = await client.isOnWhatsApp(number);
  367. if (!numberExists) {
  368. return res.status(422).json({
  369. status: false,
  370. message: 'The number is not registered'
  371. });
  372. }
  373. }
  374.  
  375.  
  376. if(client.state == 'open'){
  377. if (filetype == 'jpg' || filetype == 'png') {
  378. console.log(filetype)
  379. let options = { mimetype: 'image/jpeg' , caption: caption, filename: filename };
  380. client.sendMessage(number, {url: url}, MessageType.image, options).then(response => {
  381. res.status(200).json({
  382. status: true,
  383. response: response
  384. });
  385. }).catch(err => {
  386. res.status(500).json({
  387. status: false,
  388. response: err
  389. });
  390. });
  391.  
  392. } else if (filetype == 'pdf') {
  393. client.sendMessage(number, { url: url }, MessageType.document, { mimetype: Mimetype['pdf'],filename : filename + '.pdf' }).then(response => {
  394. return res.status(200).json({
  395. status: true,
  396. response: response
  397. });
  398. }).catch(err => {
  399. return res.status(500).json({
  400. status: false,
  401. response: err
  402. });
  403. });
  404. } else {
  405. res.status(500).json({
  406. status: false,
  407. response: 'Filetype tidak dikenal'
  408. });
  409. }
  410. } else {
  411. res.status(500).json({
  412. status: false,
  413. response: 'Please scan the QR before use this API'
  414. });
  415. }
  416. } else {
  417. res.writeHead(401, {
  418. 'Content-Type': 'application/json'
  419. });
  420. res.end(JSON.stringify({
  421. status: false,
  422. message: 'Please scan the QR before use the API 2'
  423. }));
  424. }
  425. });
  426.  
  427.  
  428.  
  429. //function kebutuhan webhook
  430. function kirimwebhook(sender, message, m ,conn,link) {
  431.  
  432. var webhook_response = {
  433. from: phoneNumberFormatter(sender),
  434. message: message
  435. }
  436. const getBuffer = async (url, options) => {
  437. try {
  438. options ? options : {}
  439. const res = await axios({
  440. method: "get",
  441. url,
  442. ...options,
  443. responseType: 'arraybuffer'
  444. })
  445. return res.data
  446. } catch (e) {
  447. console.log(`Error : ${e}`)
  448. }
  449. }
  450.  
  451. request({ url: link, method: "POST", json: webhook_response },
  452. async function (error, response) {
  453. if (!error && response.statusCode == 200) {
  454. // process hook
  455. if (response.body == null) {
  456. return 'gagal send webhook';
  457. }
  458. const res = response.body;
  459. console.log(res);
  460. if (res.mode == 'chat') {
  461. conn.sendMessage(sender, res.pesan, MessageType.text)
  462. } else if (res.mode == 'reply') {
  463. conn.sendMessage(sender, res.pesan, MessageType.extendedText, { quoted: m })
  464. } else if (res.mode == 'picture') {
  465. const url = res.data.url;
  466. const caption = res.data.caption;
  467. var messageOptions = {};
  468. const buffer = await getBuffer(url);
  469. if (caption != '') messageOptions.caption = caption;
  470. conn.sendMessage(sender, buffer, MessageType.image, messageOptions);
  471. }
  472. } else { console.log('error'); }
  473. }
  474. );
  475. }
  476.  
  477.  
  478.  
  479. server.listen(configs.port, function () {
  480. console.log('App running on *: ' + configs.port);
  481. });
  482.  
  483.  
  484.  
Comments
Add Comment
Please, Sign In to add comment