diff --git a/app.js b/app.js
index 33d9ade..94ad7d2 100644
--- a/app.js
+++ b/app.js
@@ -1,4 +1,4 @@
-const { Client } = require('whatsapp-web.js');
+const { Client, MessageMedia } = require('whatsapp-web.js');
const express = require('express');
const { body, validationResult } = require('express-validator');
const socketIO = require('socket.io');
@@ -6,6 +6,8 @@ const qrcode = require('qrcode');
const http = require('http');
const fs = require('fs');
const { phoneNumberFormatter } = require('./helpers/formatter');
+const fileUpload = require('express-fileupload');
+const axios = require('axios');
const app = express();
const server = http.createServer(app);
@@ -13,6 +15,9 @@ const io = socketIO(server);
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
+app.use(fileUpload({
+ debug: true
+}));
const SESSION_FILE_PATH = './whatsapp-session.json';
let sessionCfg;
@@ -138,6 +143,36 @@ app.post('/send-message', [
});
});
+// Send media
+app.post('/send-media', async (req, res) => {
+ const number = phoneNumberFormatter(req.body.number);
+ const caption = req.body.caption;
+ const fileUrl = req.body.file;
+
+ // const media = MessageMedia.fromFilePath('./image-example.png');
+ // const file = req.files.file;
+ // const media = new MessageMedia(file.mimetype, file.data.toString('base64'), file.name);
+ let mimetype;
+ const attachment = await axios.get(fileUrl, { responseType: 'arraybuffer' }).then(response => {
+ mimetype = response.headers['content-type'];
+ return response.data.toString('base64');
+ });
+
+ const media = new MessageMedia(mimetype, attachment, 'Media');
+
+ client.sendMessage(number, media, { caption: caption }).then(response => {
+ res.status(200).json({
+ status: true,
+ response: response
+ });
+ }).catch(err => {
+ res.status(500).json({
+ status: false,
+ response: err
+ });
+ });
+});
+
server.listen(8000, function() {
console.log('App running on *: ' + 8000);
});
diff --git a/image-example.png b/image-example.png
new file mode 100644
index 0000000..eed9c53
Binary files /dev/null and b/image-example.png differ
diff --git a/package-lock.json b/package-lock.json
index fc09b89..46d255c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -71,6 +71,14 @@
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
+ "axios": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz",
+ "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==",
+ "requires": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
"backo2": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
@@ -198,6 +206,14 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
+ "busboy": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
+ "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
+ "requires": {
+ "dicer": "0.3.0"
+ }
+ },
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -319,6 +335,14 @@
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.799653.tgz",
"integrity": "sha512-t1CcaZbvm8pOlikqrsIM9GOa7Ipp07+4h/q9u0JXBWjPCjHdBl9KkddX87Vv9vBHoBGtwV79sYQNGnQM6iS5gg=="
},
+ "dicer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
+ "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
+ "requires": {
+ "streamsearch": "0.1.2"
+ }
+ },
"dijkstrajs": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz",
@@ -510,6 +534,14 @@
}
}
},
+ "express-fileupload": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.0.tgz",
+ "integrity": "sha512-oe4WpKcSppXnl5peornawWUa6tKmIc1/kJxMNRGJR1A0v4zyLL6VsFR6wZ8P2a4Iq3aGx8xae3Vlr+MOMQhFPw==",
+ "requires": {
+ "busboy": "^0.3.1"
+ }
+ },
"express-validator": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.6.1.tgz",
@@ -576,6 +608,11 @@
"path-exists": "^4.0.0"
}
},
+ "follow-redirects": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+ "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA=="
+ },
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -1191,6 +1228,11 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
+ },
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
diff --git a/package.json b/package.json
index 5791de3..16a6441 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,9 @@
"author": "Nur Muhammad",
"license": "MIT",
"dependencies": {
+ "axios": "^0.20.0",
"express": "^4.17.1",
+ "express-fileupload": "^1.2.0",
"express-validator": "^6.6.1",
"http": "0.0.1-security",
"qrcode": "^1.4.4",
diff --git a/readme.md b/readme.md
index e89b48b..2087960 100644
--- a/readme.md
+++ b/readme.md
@@ -6,6 +6,7 @@ Watch the tutorials:
- Whatsapp API Tutorial: Part 1
- Whatsapp API Tutorial: Part 2
- Whatsapp API Tutorial: Tips & Tricks
+- Whatsapp API Tutorial: Sending Media File
### How to use?
- Clone or download this repo