-
Notifications
You must be signed in to change notification settings - Fork 0
/
send.js
203 lines (161 loc) · 7.3 KB
/
send.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
const express = require("express");
const app = express();
const xlsx = require('xlsx');
const bodyParser = require("body-parser");
const webdriver = require('selenium-webdriver');
const multer = require("multer");
const path = require("path");
const { default: axios } = require("axios");
const { By, Key } = webdriver;
const upload = multer({ dest: 'uploads/phoneNumbers/' }); // Specify the destination folder for uploaded files
const PORT = 5000;
// set the view engine to ejs
app.set('view engine', 'ejs');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
let driver;
async function sendMessagesFromExcel(message , pdf, pdf2) {
const workbook = xlsx.readFile(pdf);
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
const rows = xlsx.utils.sheet_to_json(worksheet);
for (const row of rows) {
const contactNumber = row['Phone'];
const name = row['Name']; // Assuming 'Name' contains the message
console.log("Number", contactNumber);
console.log("Name", name);
// if (contactNumber && message) {
if (contactNumber ) {
try {
await sendWhatsAppMessage(contactNumber, message, pdf2);
} catch (error) {
console.log(error);
}
}
}
}
async function pauseNow(Time = 5) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve("Done"), Time * 1000);
});
}
async function sendWhatsAppMessage(contactNumber, message, pdf2) {
return new Promise(async (resolve, reject) => {
try {
// Open WhatsApp Web with the specified phone number
const response = await driver.get(`https://web.whatsapp.com/send?phone=${contactNumber}`);
await driver.wait(webdriver.until.elementLocated(By.css('div[title="Type a message"][contenteditable="true"]'), 10000));
const messageInput = await driver.findElement(By.css('div[title="Type a message"][contenteditable="true"]'));
messageInput.sendKeys(message);
await attachFile(pdf2);
// Click the send button
await pressSend();
console.log('Message sent successfully.');
await pauseNow();
resolve('Message sent successfully');
// }
} catch (error) {
if (error.name === 'UnexpectedAlertOpenError') {
// Handle the alert here, for example, by dismissing it
const alert = await driver.switchTo().alert();
console.log("alert = = ==== ", alert);
await alert.dismiss();
console.log('Dismissed unexpected alert:', alert.getText());
await pauseNow();
// You can also add further logic here to verify and continue the process.
resolve('Unexpected alert dismissed.');
} else {
console.error("An error occurred while sending the message:", error);
await pauseNow();
reject(error);
}
}
});
}
async function attachFile(filePath) {
const absoluteFilePath = path.join(__dirname, filePath);
console.log("path", absoluteFilePath);
const attachButton = await driver.findElement(By.css('div[title="Attach"]'));
await attachButton.click();
const input = await driver.findElement(By.css('input[type="file"]'));
await input.sendKeys(absoluteFilePath);
// Wait for the file to be attached
await driver.wait(webdriver.until.elementLocated(By.css('.copyable-text.selectable-text')), 10000);
}
async function pressSend() {
return new Promise(async (resolve, reject) => {
try {
const sendButton = await driver.wait(webdriver.until.elementLocated(By.css('div[aria-label="Send"][role="button"]')), 10000);
await driver.wait(webdriver.until.elementIsNotVisible(driver.findElement(By.css('.element-that-covers-send-button'))), 5000).catch(() => {});
await sendButton.click();
console.log('Send button clicked successfully.');
await pauseNow(10);
resolve('Send button clicked successfully.');
} catch (error) {
console.error("An error occurred while clicking the send button:", error);
reject(error);
}
});
}
async function AutomatedWhatsappMessage(message, pdf, pdf2) {
await pauseNow(10);
await sendMessagesFromExcel(message, pdf, pdf2);
}
async function main(message = "", pdf, pdf2) {
await driver.get('https://web.whatsapp.com/');
await pauseNow(20);
AutomatedWhatsappMessage(message , pdf, pdf2)
}
app.get("/", async(req, res) => {
// await initializeWebDriver(); // Call the function before rendering the page
res.render("pages/index");
})
async function getLatestVersions() {
try {
const response = await axios.get('https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json');
const channels = response.data.channels;
// Assuming you want the Stable channel, change it accordingly if needed
const stableChannel = channels.Stable;
console.log("stablechane", stableChannel);
const chromeVersion = stableChannel.version;
// Select the platform you need (e.g., win64)
const platform = 'win64';
// Find the download object for the specified platform
const download = stableChannel.downloads.chromedriver.find(item => item.platform === platform);
console.log("download",download )
// Extract the chromedriver version
const chromedriverVersion = download ? download.url.split('/')[8] : undefined;
return { chromeVersion, chromedriverVersion };
} catch (error) {
console.error('Failed to fetch versions. Cannot initialize WebDriver.', error.message);
return null;
}
}
async function initializeWebDriver() {
const versions = await getLatestVersions();
if (versions) {
console.log('Latest Chrome version:', versions.chromeVersion);
console.log('Latest ChromeDriver version:', versions.chromedriverVersion);
// Use these versions to download and set up the appropriate ChromeDriver
// For example, you can download the chromedriver executable from the official website
// and set the path accordingly in your Selenium WebDriver initialization.
// Replace the following line with your actual code to set up the WebDriver
driver = new webdriver.Builder().forBrowser('chrome').build();
} else {
console.error('Failed to fetch versions. Cannot initialize WebDriver.');
}
}
app.post("/result", upload.fields([{name : "pdf"}, {name : "pdf2"}]), (req, res) => {
console.log("Result MEssage", req.body);
console.log("file", req.files['pdf2']);
if (req.files['pdf'] && req.files['pdf2']) {
// const filePath = req.file.path;
console.log("Running");
const pdf1Files = req.files['pdf'].map(file => file.path);
const pdf2Files = req.files['pdf2'].map(file => file.path);
driver = new webdriver.Builder().forBrowser('chrome').build();
main(req.body.message || "" , pdf1Files[0], pdf2Files[0]);
}
})
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}/`);
})