diff --git a/README.md b/README.md index c033997..f3fee9f 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ Tool to retrieve information from the SIGA FRBA UTN website. `npm i siga-scraper` - ## Methods + - [Scrape Cursada](https://github.com/NicoMigueles/siga-scraper#scrape-cursada) - [Scrape Notas](https://github.com/NicoMigueles/siga-scraper#scrape-notas) @@ -34,16 +34,10 @@ Returns: curso: string, // Código del curso, ejemplo: K1021 nombre: string, // Nombre del curso color: string, // Color del curso - notas: [ - { - instancia: string, // Instancia de evaluación - calificacion: number, // Nota, 0..10, el 0 representa el ausente. - }, - ], dia: number, // Representación numérica de la semana. hora: string, // Hora de la clase. horaT: string, // Hora de finalización de la clase. - turno: Turno, // enum('Mañana', 'Tarde', 'Noche') + turno: string, // 'Mañana' | 'Tarde' | 'Noche' aula: string, // Aula del curso. sede: string, // Sede en la que se dicta el curso. }, @@ -62,11 +56,14 @@ Returns: ```typescript // Response example. [ - name: 'Análisis Matemático I', - [{ - instancia: string, - calificacion: number, - }], + courseId: string, // Id del curso interno del SIGA + name: string, // 'Análisis Matemático I' + notas: [ + { + instancia: string, // Instancia de evaluación + calificacion: number, // Nota, 0..10, el 0 representa el ausente. + } + ], ]; ``` @@ -84,7 +81,20 @@ async function main() { const response = await sigaScraper.scrapeCursada(); console.log(response); - + /* + [{ + courseId: '950703', + curso: 'Z2004', + nombre: 'Análisis Matemático II', + aula: '115', + sede: 'Campus', + color: '#7A94CF', + turno: 'Mañana', + dia: 3, + hora: '8:30', + horaT: '12:30', + }, ...] + */ await sigaScraper.stop(); } @@ -97,8 +107,8 @@ main(); import sigaScraper from 'siga-scraper'; async function main() { - await sigaScraper.start(); // Inicia el cluster de navegadores que realizan el scrape. - await sigaScraper.login(SIGA_USER, SIGA_PASS); // Logea y guarda la session en el cluster. + await sigaScraper.start(); + await sigaScraper.login(SIGA_USER, SIGA_PASS); const tasksPromises = [ sigaScraper.scrapeNotas(), sigaScraper.scrapeCursada(), diff --git a/lib/index.ts b/lib/index.ts index 89399c1..6c8dc12 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -139,7 +139,6 @@ export = class sigaScraper { aula, sede, color: rgbtohex(color), - notas: [], turno: shift[turno], dia: dias.length > 1 ? dias : dias[0], hora: horas.length > 1 ? horas : horas[0], @@ -168,20 +167,20 @@ export = class sigaScraper { 'tbody > tr > td > span:nth-child(1) > a', ), ].map((e, i) => { - const name = `${ - (e as HTMLElement).onclick!.toString().split(`'`)[5] - }`; + const onclickData = (e as HTMLElement).onclick!.toString().split(`'`); + const courseId = onclickData[3]; + const name = onclickData[5]; const selector = `tbody > tr:nth-child(${ 2 * i + 3 }) > td > span:nth-child(2) > a`; - return { name, selector }; + return { courseId, name, selector }; }), ); const response = []; // Por cada asignatura, buscar las notas. for await (const subject of subjects) { - const { name, selector } = subject; + const { courseId, name, selector } = subject; await Promise.all([page.click(selector), page.waitForNavigation()]); @@ -220,7 +219,7 @@ export = class sigaScraper { }), ]); - response.push({ name, notas }); + response.push({ courseId, name, notas }); } return response; }); diff --git a/lib/interfaces/index.ts b/lib/interfaces/index.ts index 3daa4ea..143985b 100644 --- a/lib/interfaces/index.ts +++ b/lib/interfaces/index.ts @@ -3,7 +3,6 @@ export interface Course { curso: string; nombre: string; color: string; - notas: []; dia: number | number[]; hora: string | string[]; horaT: string | string[]; @@ -17,6 +16,7 @@ export interface Nota { calificacion: number; // Nota numerica. 0 .. 10, el 0 representa el ausente. } export interface Notas { + courseId: string; name: string; notas: Nota[]; } diff --git a/lib/test/test.ts b/lib/test/test.ts index 534eb5f..10998c0 100644 --- a/lib/test/test.ts +++ b/lib/test/test.ts @@ -1,10 +1,5 @@ -import * as dotenv from 'dotenv'; import sigaScraper from '..'; -dotenv.config(); - -const { SIGA_USER, SIGA_PASS } = process.env; - describe('Scrape Cursada', () => { test('Deberia devolver un array de con informacion acerca asignaturas.', async (done) => { try { @@ -18,7 +13,6 @@ describe('Scrape Cursada', () => { aula: '115', sede: 'Campus', color: '#7A94CF', - notas: [], turno: 'Mañana', dia: 3, hora: '8:30', @@ -31,7 +25,6 @@ describe('Scrape Cursada', () => { aula: '102', sede: 'Campus', color: '#AF9772', - notas: [], turno: 'Mañana', dia: 3, hora: '8:30', @@ -61,6 +54,7 @@ describe('Scrape Notas', () => { const expected = [ { + courseId: '950703', name: 'Análisis Matemático II', notas: [ { @@ -74,6 +68,7 @@ describe('Scrape Notas', () => { ], }, { + courseId: '950606', name: 'Física II', notas: [ { @@ -92,6 +87,7 @@ describe('Scrape Notas', () => { }, ]; const scrapeResponse = await sigaScraper.scrapeNotas(); + // console.log(JSON.stringify(scrapeResponse, null, 2)); expect(scrapeResponse instanceof Array).toBeTruthy(); diff --git a/package.json b/package.json index e912c56..e9516d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "siga-scraper", - "version": "1.1.2", + "version": "1.2.0", "description": "Tool to scrape information from SIGA FRBA UTN.", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -9,7 +9,7 @@ ], "scripts": { "build": "tsc", - "test": "cross-env NODE_ENV=test jest --detectOpenHandles --forceExit --verbose" + "test": "tsc & cross-env NODE_ENV=test jest --detectOpenHandles --forceExit --verbose" }, "repository": { "type": "git", @@ -36,7 +36,7 @@ "homepage": "https://github.com/NicoMigueles/siga-scraper#readme", "jest": { "preset": "ts-jest", - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(ts|tsx)?$" + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(js)?$" }, "devDependencies": { "@types/dotenv": "^8.2.0",