npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

siga-scraper

v1.4.3

Published

Tool to scrape information from SIGA FRBA UTN.

Downloads

63

Readme

SIGA Scraper

Latest Stable Version

Tool to retrieve information from the SIGA FRBA UTN website.

Support

Invitame un café en cafecito.app

Instalation

npm i siga-scraper

Methods

Scrape Cursada

Method scrapeCursada : Promise<Course[]>,

Returns: Course[]

// Response example.
[
  {
    courseId: string, // Id del curso interno del SIGA
    curso: string, // Código del curso, ejemplo: K1021
    nombre: string, // Nombre del curso
    color: string, // Color del curso
    dia: number[], // Representación numérica del día de la semana.
    hora: string[], // Hora de la clase.
    horaT: string[], // Hora de finalización de la clase.
    turno: string, // 'Mañana' | 'Tarde' | 'Noche'
    aula: string, // Aula del curso.
    sede: string, // Sede en la que se dicta el curso.
  },
];

PD: El día y las horas son arrays ya que en el caso de que una asignatura se curse más de un día, se alinean los indices de los 3 arrays.

El día empieza en 1 => Lunes, hasta el 6 => Sabado, se excluye el Domingo.

Scrape Notas

Method scrapeNotas : Promise<Notas[]>,

Returns: Notas[]

// Response example.
[
  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.
    }
  ],
];

Scrape Historial Consolidado

scrapeHistorialConsolidado() : Promise<RowEntry[]>,

Returns: RowEntry[]

// Response RowEntry example.

export interface Acta {
  sede: string;
  libro: string;
  folio: string;
  nota?: number;
}

export interface RowEntry {
  tipo: string; // 'Cursada' | 'Final';
  estado: string;
  plan: string; // Nombre del plan, ejemplo O95A (civil) o K08 (sistemas).
  courseId: string; // Id del curso interno del SIGA
  nombre: string; // Nombre del curso
  year: number; // Año de la cursada
  periodo: string; // Identificador del periodo
  fecha: string; // DD/MM/AAAA
  acta: Acta | null;
}
/*
{
  "tipo": "Final",
  "estado": "Aprob",
  "plan": "K08",
  "courseId": "950701",
  "nombre": "Álgebra y Geometría Analítica",
  "year": 2018,
  "periodo": "K08 Anual",
  "fecha": "29/11/2018",
  "acta": {
    "sede": "FRBA",
    "libro": "PR045",
    "folio": "180",
    "nota": 8
  }
}
*/

Scrape Actas de Final

scrapeActaDeFinales() : Promise<ActaFinal[]>,

Returns: ActaFinal[]

// Response example.

export interface ActaFinal {
  fecha: string;
  courseId: string;
  nombre: string;
  libro: string;
  folio: string;
  nota: number;
}

/*
  {
    "fecha": "01/01/2020",
    "courseId": "000000",
    "nombre": "Asignatura 1",
    "libro": "AA001",
    "folio": "33",
    "nota": "10"
  },
*/

Examples

QuickStart

import sigaScraper from 'siga-scraper';

async function main() {
  await sigaScraper.start();
  await sigaScraper.login(SIGA_USER, SIGA_PASS);

  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();
}

main();

Running tasks simultaneously

import sigaScraper from 'siga-scraper';

async function main() {
  await sigaScraper.start();
  await sigaScraper.login(SIGA_USER, SIGA_PASS);
  const tasksPromises = [
    sigaScraper.scrapeNotas(),
    sigaScraper.scrapeCursada(),
  ];
  const [responseNotas, responseCursada] = await Promise.all(tasksPromises);

  console.log(responseNotas); // => [ {...}, {...} ]
  console.log(responseCursada); // => [ {...}, {...} ]

  await sigaScraper.stop();
}

main();

Contribute

Pull request are open and welcome.

License