Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 107 additions & 21 deletions botTelegram/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions botTelegram/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@
"homepage": "https://github.com/JGaviria0/BotNotasUTP#readme",
"type": "module",
"dependencies": {
"ical-generator": "^6.0.1",
"dotenv": "^16.3.1",
"puppeteer": "^19.8.5",
"random-useragent": "^0.5.0",
"telegraf": "^4.12.2"
"telegraf": "^4.15.3"
},
"devDependencies": {
"nodemon": "^2.0.22"
}
}
}
87 changes: 74 additions & 13 deletions botTelegram/src/botTelegram.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { Telegraf } from "telegraf";
import { Telegraf, Input } from "telegraf";
import 'dotenv/config';
import {historicGradesScraping, logInScraping } from "./util/scraper.js"
import fs from 'fs';
import { validateInputLogIn } from "./util/validations.js";
import { readHTML } from "./util/extractValues.js";
import {historicGradesScraping, logInScraping, getGrades, getSchedule } from "./util/scraper.js"

const GRADES_PAGE_URL = "https://app4.utp.edu.co/reportes/ryc/ReporteDetalladoNotasxEstudiante.php";
const HISTORIC_PAGE_URL = "https://app4.utp.edu.co/MatAcad/verificacion/historial-web/programas.php";
const SCHEDULE_PAGE_URL = "https://app4.utp.edu.co/MatAcad/verificacion/horario.php";
const USERS_ID_DEFAULT_LENGTH = 10; // Amount of numbers of the citizen's id
const URL_BOT = process.env.URL_BOT;

Expand All @@ -17,10 +19,11 @@ bot.use((ctx, next) => {
})

bot.start((ctx) => {
ctx.reply('Welcome');
ctx.reply(`Welcome ${ctx.from.first_name}`);
ctx.reply(`Para usar el bot alguno de los siguientes comando\n
/notas cedula contraseña\n
/promedio cedula contraseña\n
/notas código contraseña\n
/promedio código contraseña\n
/horario código contraseña\n
Los datos del portal estudiantil`)

})
Expand Down Expand Up @@ -57,11 +60,11 @@ bot.command([/notas.*/], async (ctx) => {
const password = userInput[2];

validateInputLogIn(id, userInput)
const page = await logInScraping(id, password);
const {page} = await logInScraping(id, password);
await page.goto(GRADES_PAGE_URL);
const values = await readHTML(page);

console.log(values);
// console.log(values);

for (const ms of values) {
ctx.reply(ms)
Expand All @@ -86,7 +89,7 @@ bot.command([/promedio.*/], async (ctx) => {
const password = userInput[2];

validateInputLogIn(id, userInput)
const page = await logInScraping(id, password);
const {page, browser} = await logInScraping(id, password);
await page.goto(HISTORIC_PAGE_URL);
const userPrograms = await historicGradesScraping(page);

Expand All @@ -97,12 +100,31 @@ bot.command([/promedio.*/], async (ctx) => {
const programsIds = []
userPrograms.forEach(program => programsIds.push(program.id));

console.log(programsIds);
bot.command(programsIds, () => {
console.log("Ha seleccionado una carrera");
// console.log(programsIds);

bot.command(programsIds, async (ctx) => {
const page = await browser.newPage();
await page.goto(HISTORIC_PAGE_URL);
const programId = ctx.update.message.text.slice(1);
// console.log(page.isClosed());
const { grades } = await getGrades(page, programId);

let sumGrades = 0.0, sumCredits = 0.0;
for (let i = 0; i < grades.length; i++) {
const grade = grades[i].grade;
const credit = grades[i].cred;

sumGrades += grade * credit;
sumCredits += credit;
}

const result = sumGrades / sumCredits;

ctx.reply(`Tu promedio acumulado es de: ${result.toFixed(2)}`)
});

page.close();
await page.close();
// await browser.close();
} catch (error) {
//ERRORS_HANDLING[error.name](error.message, ctx)
console.log(error);
Expand All @@ -111,4 +133,43 @@ bot.command([/promedio.*/], async (ctx) => {
}
})

bot.launch()
// Command to export schedule
bot.command([/horario.*/], async (ctx) => {
showInfoMessage(ctx, 'Vamos a procesar su peticion, esto puede tardar algunos minutos.');

try {
const userInput = ctx.update.message.text.split(" ");
const id = userInput[1];
const password = userInput[2];

validateInputLogIn(id, userInput)
const {page, browser} = await logInScraping(id, password);
await page.goto(SCHEDULE_PAGE_URL);
// await page.waitForNavigation();
try {
await getSchedule(page)
} catch (error) {
console.log("Failed to get schedule")
}


if (fs.existsSync('./calendar.ics')){
ctx.reply('Tu horario se ha creado');
ctx.replyWithDocument(Input.fromLocalFile('./calendar.ics', 'calendar.ics')).catch((error) => {
console.log(error);
})
} else {
ctx.reply("Ocurrió un error durante el envío del calendario")
}


await page.close();
await browser.close();
} catch (error) {
console.log(error);
} finally {
ctx.deleteMessage(ctx.update.message.message_id);
}
});

bot.launch()
Loading