Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 9697116

Browse files
2 parents e01307f + 86dc101 commit 9697116

File tree

8 files changed

+743
-1347
lines changed

8 files changed

+743
-1347
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
node_modules
2-
results
2+
results
3+
secure
4+
.env

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"liveServer.settings.port": 5501
3+
}

api.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
const { chromium } = require("playwright");
2+
const nodemailer = require("nodemailer");
3+
const PDFDocument = require('pdfkit');
4+
5+
const fs = require('fs');
6+
const path = require('path');
7+
8+
var htmlTemplate = path.join(__dirname, 'template/index.html');
9+
var htmlToSend = fs.readFileSync(htmlTemplate, 'utf8').toString();
10+
11+
module.exports = {
12+
13+
getAllResults : async (students, exam_id) => {
14+
let browser = await chromium.launch();
15+
let page = await browser.newPage();
16+
17+
await page.setViewportSize({ width: 1000, height: 850 });
18+
await page.goto("https://pareeksha.mgu.ac.in/Pareeksha/index.php/Public/PareekshaResultView_ctrl/index/3");
19+
// await page.goto("https://dsdc.mgu.ac.in/exQpMgmt/index.php/public/ResultView_ctrl/");
20+
await page.selectOption('select#exam_id', exam_id);
21+
22+
console.log("\nStarting to take screenshots...\n");
23+
24+
for (let i = 0; i < students.length; i++) {
25+
26+
await page.fill('#prn', students[i].prn);
27+
await page.click('button#btnresult');
28+
29+
await page.waitForSelector('div#mgu_btech_contentholder table:nth-child(3)', { visible: true });
30+
await page.screenshot({
31+
path: `results/${students[i].prn}.png`,
32+
});
33+
console.log(`Screenshot taken for ${students[i].name}`);
34+
}
35+
36+
await browser.close();
37+
console.log("\nAll screenshots taken!\n");
38+
},
39+
40+
41+
generatePDFs : async (students) => {
42+
console.log("\nStarting to generate PDFs...\n");
43+
for (let i = 0; i < students.length; i++) {
44+
45+
try {
46+
var password = module.exports.generateCustomPassword(students[i]);
47+
var doc = new PDFDocument({
48+
margin: 0,
49+
size: [850, 850],
50+
info: {
51+
Title: 'MCA 3rd Semester Results',
52+
Author: 'Arjun Krishna',
53+
54+
},
55+
userPassword: password,
56+
});
57+
58+
var stream = fs.createWriteStream(`secure/${students[i].prn}.pdf`);
59+
doc.pipe(stream);
60+
doc.image(`results/${students[i].prn}.png`, 0, 20, { width: 850, height: 850 });
61+
doc.end();
62+
} catch (error) {
63+
console.log(error);
64+
}
65+
66+
console.log(`PDF generated for ${students[i].name}`);
67+
}
68+
console.log("\nAll PDFs generated!\n");
69+
},
70+
71+
72+
sendOutEmails : async (students) => {
73+
console.log("\nStarting to send out emails...\n");
74+
for (let i = 0; i < students.length; i++) {
75+
await module.exports.sendEmail({
76+
recipient: students[i].email,
77+
prn: students[i].prn
78+
});
79+
console.log(`\nEmail sent to ${students[i].name}\n`);
80+
}
81+
console.log("\nAll emails sent!\n");
82+
},
83+
84+
85+
sendEmail : async (details) => {
86+
87+
var transporter = nodemailer.createTransport({
88+
service: 'gmail',
89+
auth: {
90+
user: process.env.EMAIL_USER,
91+
pass: process.env.EMAIL_PASS
92+
}
93+
});
94+
95+
var mailOptions = {
96+
from: `"Result Notification" <${process.env.EMAIL_USER}>`,
97+
to: details.recipient,
98+
subject: 'MCA 3rd Semester Results | Secure PDF Attached',
99+
html: htmlToSend,
100+
attachments: [
101+
{
102+
filename: `${details.prn}.pdf`,
103+
path: `secure/${details.prn}.pdf`,
104+
contentType: 'application/pdf'
105+
}
106+
],
107+
headers: { 'x-myheader': 'test header' }
108+
};
109+
110+
transporter.sendMail(mailOptions, (error, info) => {
111+
if (error) {
112+
console.log(error);
113+
} else {
114+
console.log('Email sent: ' + info.response);
115+
}
116+
});
117+
118+
},
119+
120+
121+
generateCustomPassword : (details) => {
122+
var name = details.name;
123+
var birthdate = details.dob;
124+
var password = name.substring(0, 4).toUpperCase() + birthdate.substring(8, 10) + birthdate.substring(5, 7);
125+
return password;
126+
}
127+
128+
};

data.json

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
{
2-
"exam_id" : "58",
3-
"prn" : [
4-
"203242210987", "203242210988", "203242210989", "203242210990", "203242210991", "203242210992",
5-
"203242210993", "203242210994", "203242210995", "203242210996", "203242210997", "203242210998",
6-
"203242210999", "203242211000", "203242211001", "203242211002", "203242211003", "203242211004",
7-
"203242211005", "203242211006", "203242211007", "203242211008", "203242211009", "203242211010",
8-
"203242211011", "203242211012", "203242211013", "203242211014", "203242211015", "203242211016",
9-
"203242211017", "203242211018", "203242211019", "203242211020", "203242211021", "203242211022",
10-
"203242211023", "203242211024", "203242211025", "203242211026", "203242211027", "203242211028",
11-
"203242211029", "203242211030", "203242211031", "203242211032", "203242211033", "203242211034",
12-
"203242211035", "203242211036", "203242211037", "203242211038", "203242211039", "203242211040",
13-
"203242211041", "203242211042", "203242211043", "203242211044", "203242211045", "203242211046"
2+
"exam_id" : "126",
3+
"students" : [
4+
{
5+
"name" : "Bharath Vinod",
6+
"prn" : "203242211006",
7+
"dob" : "1999-11-21",
8+
"email" : "[email protected]"
9+
},
10+
{
11+
"name" : "Arjun Krishna",
12+
"prn" : "203242211001",
13+
"dob" : "1999-05-04",
14+
"email" : "[email protected]"
15+
},
16+
{
17+
"name" : "Gopika K",
18+
"prn" : "203242211011",
19+
"dob" : "1999-05-26",
20+
"email" : "[email protected]"
21+
}
1422
]
1523
}

0 commit comments

Comments
 (0)