From 4c347048a73418f5e0f66171e18e7b15cd57ad30 Mon Sep 17 00:00:00 2001 From: Nur Muhammad Date: Sat, 10 Oct 2020 12:42:55 +0800 Subject: [PATCH] Add validation, formatter & some configs --- app.js | 62 +++++++++++++++++++++++++++++++++++++++++--- helpers/formatter.js | 20 ++++++++++++++ package-lock.json | 19 ++++++++++++++ package.json | 1 + 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 helpers/formatter.js diff --git a/app.js b/app.js index cc8fc91..33d9ade 100644 --- a/app.js +++ b/app.js @@ -1,9 +1,11 @@ const { Client } = require('whatsapp-web.js'); const express = require('express'); +const { body, validationResult } = require('express-validator'); const socketIO = require('socket.io'); const qrcode = require('qrcode'); const http = require('http'); const fs = require('fs'); +const { phoneNumberFormatter } = require('./helpers/formatter'); const app = express(); const server = http.createServer(app); @@ -22,7 +24,22 @@ app.get('/', (req, res) => { res.sendFile('index.html', { root: __dirname }); }); -const client = new Client({ puppeteer: { headless: true }, session: sessionCfg }); +const client = new Client({ + puppeteer: { + headless: true, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-accelerated-2d-canvas', + '--no-first-run', + '--no-zygote', + '--single-process', // <- this one doesn't works in Windows + '--disable-gpu' + ], + }, + session: sessionCfg +}); client.on('message', msg => { if (msg.body == '!ping') { @@ -62,13 +79,52 @@ io.on('connection', function(socket) { } }); }); + + client.on('auth_failure', function(session) { + socket.emit('message', 'Auth failure, restarting...'); + }); + + client.on('disconnected', (reason) => { + socket.emit('message', 'Whatsapp is disconnected!'); + client.destroy(); + client.initialize(); + }); }); + +const checkRegisteredNumber = async function(number) { + const isRegistered = await client.isRegisteredUser(number); + return isRegistered; +} + // Send message -app.post('/send-message', (req, res) => { - const number = req.body.number; +app.post('/send-message', [ + body('number').notEmpty(), + body('message').notEmpty(), +], async (req, res) => { + const errors = validationResult(req).formatWith(({ msg }) => { + return msg; + }); + + if (!errors.isEmpty()) { + return res.status(422).json({ + status: false, + message: errors.mapped() + }); + } + + const number = phoneNumberFormatter(req.body.number); const message = req.body.message; + const isRegisteredNumber = await checkRegisteredNumber(number); + + if (!isRegisteredNumber) { + return res.status(422).json({ + status: false, + message: 'The number is not registered' + }); + } + client.sendMessage(number, message).then(response => { res.status(200).json({ status: true, diff --git a/helpers/formatter.js b/helpers/formatter.js new file mode 100644 index 0000000..def2b80 --- /dev/null +++ b/helpers/formatter.js @@ -0,0 +1,20 @@ +const phoneNumberFormatter = function(number) { + // 1. Menghilangkan karakter selain angka + let formatted = number.replace(/\D/g, ''); + + // 2. Menghilangkan angka 0 di depan (prefix) + // Kemudian diganti dengan 62 + if (formatted.startsWith('0')) { + formatted = '62' + formatted.substr(1); + } + + if (!formatted.endsWith('@c.us')) { + formatted += '@c.us'; + } + + return formatted; +} + +module.exports = { + phoneNumberFormatter +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 849ca28..fc09b89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -510,6 +510,15 @@ } } }, + "express-validator": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.6.1.tgz", + "integrity": "sha512-+MrZKJ3eGYXkNF9p9Zf7MS7NkPJFg9MDYATU5c80Cf4F62JdLBIjWxy6481tRC0y1NnC9cgOw8FuN364bWaGhA==", + "requires": { + "lodash": "^4.17.19", + "validator": "^13.1.1" + } + }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -719,6 +728,11 @@ "p-locate": "^4.1.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1274,6 +1288,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "validator": { + "version": "13.1.17", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.1.17.tgz", + "integrity": "sha512-zL5QBoemJ3jYFb2/j38y7ljhwYGXVLUp8H6W1nVxadnAOvUOytec+L7BHh1oBQ82/TzWXHd+GSaxUWp4lROkLg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 056dadf..5791de3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "license": "MIT", "dependencies": { "express": "^4.17.1", + "express-validator": "^6.6.1", "http": "0.0.1-security", "qrcode": "^1.4.4", "socket.io": "^2.3.0",