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

chuvsu-js

v2.3.0

Published

Node.js library for ChuvSU student portal (lk.chuvsu.ru) and schedule (tt.chuvsu.ru)

Readme

chuvsu-js

Node.js библиотека для работы с порталами ЧувГУ:

  • tt.chuvsu.ru — расписание занятий (факультеты, группы, преподаватели)
  • lk.chuvsu.ru — личный кабинет студента (персональные данные)

[!WARNING] Пока не доработана, код говно, замены занятий пока не парсит. Не надейтесь на правильный вывод расписания.

Установка

npm install chuvsu-js

Быстрый старт

Расписание (TtClient)

import { TtClient } from "chuvsu-js";

const tt = new TtClient();

// Войти гостем (без учётной записи)
await tt.loginAsGuest();

// Найти группу по названию
const groups = await tt.searchGroup({ name: "КТ-41-24" });
console.log(groups); // [{ id: 8919, name: "КТ-41-24", specialty: "...", profile: "..." }]

// Получить расписание группы
const schedule = await tt.getSchedule({ groupId: groups[0].id });

// Расписание на сегодня
const today = schedule.today();
for (const lesson of today) {
  console.log(
    `${lesson.start.hours}:${lesson.start.minutes} — ${lesson.subject} (${lesson.type})`,
  );
}

// С фильтром по подгруппе
schedule.today({ subgroup: 1 });

// На завтра
schedule.tomorrow();

// На текущую неделю
schedule.thisWeek();

// Текущая пара
schedule.currentLesson();

Личный кабинет (LkClient)

import { LkClient } from "chuvsu-js";

const lk = new LkClient();
await lk.login({ email: "[email protected]", password: "password" });

const data = await lk.getPersonalData();
console.log(`${data.lastName} ${data.firstName}, группа ${data.group}`);

// Получить ID группы для использования с TtClient
const groupId = await lk.getGroupId();

API

TtClient

Клиент для работы с расписанием (tt.chuvsu.ru).

Конструктор

new TtClient(options?: TtClientOptions)

| Опция | Тип | По умолчанию | Описание | | --------------- | ----------------------- | ----------------- | -------------------------------------------------------------- | | educationType | EducationType | HigherEducation | Тип образования: высшее (1) или СПО (2) | | cache | number \| CacheConfig | — | TTL кеша в мс. Число задаёт единый TTL, объект — по категориям |

Авторизация

// С учётной записью
await tt.login({ email: "...", password: "..." });

// Гостевой вход
await tt.loginAsGuest();

Получение расписания

const schedule = await tt.getSchedule({ groupId, period? });

Возвращает объект Schedule, который позволяет получать расписание локально, без дополнительных запросов к серверу.

Поиск

// Список факультетов
const faculties = await tt.getFaculties();

// Группы факультета
const groups = await tt.getGroupsForFaculty({ facultyId });

// Поиск группы по названию
const groups = await tt.searchGroup({ name: "ЗИ" });

// Поиск преподавателя
const teachers = await tt.searchTeacher({ name: "Иванов" });

Период

// Текущий учебный период
const period = tt.getCurrentPeriod();

Кеш

// Очистить весь кеш или по категории
tt.clearCache();
tt.clearCache("schedule");

// Экспорт/импорт (для сохранения между запусками)
const data = tt.exportCache();
tt.importCache(data);

Категории кеша: schedule, faculties, groups.

Schedule

Объект расписания группы. Все методы синхронные — данные уже загружены.

Свойства

schedule.groupId; // ID группы
schedule.period; // Учебный период
schedule.days; // Сырые данные (FullScheduleDay[])

Расписание по дате

// На сегодня
schedule.today({ subgroup?: number });

// На завтра
schedule.tomorrow({ subgroup?: number });

// На конкретную дату
schedule.forDate(date: Date, { subgroup?: number });

Расписание по неделе

// На текущую неделю
schedule.thisWeek({ subgroup?: number });

// На конкретную неделю
schedule.forWeek(week?: number, { subgroup?: number });

Расписание по дню недели

// По дню недели (0 = воскресенье, 1 = понедельник, ...)
schedule.forDay(weekday: number, { subgroup?: number, week?: number });

Текущая пара

const lesson = schedule.currentLesson({ subgroup?: number });

Утилиты семестра

// Номер текущей недели
schedule.getWeekNumber(date?: Date);

// Все недели семестра
schedule.getSemesterWeeks(weekCount?: number);

// Начало семестра
schedule.getSemesterStart();

Утилиты также доступны как standalone функции:

import {
  getSemesterStart,
  getSemesterWeeks,
  getWeekNumber,
  Period,
} from "chuvsu-js";

getSemesterStart({ period: Period.FallSemester, year: 2025 });
getSemesterWeeks({ period: Period.SpringSemester });
getWeekNumber({ period: Period.SpringSemester });

LkClient

Клиент для личного кабинета (lk.chuvsu.ru).

await lk.login({ email, password });
const data = await lk.getPersonalData();
const groupId = await lk.getGroupId();

PersonalData содержит: lastName, firstName, patronymic, sex, birthday, recordBookNumber, faculty, specialty, profile, group, course, email, phone.

Типы

Period

enum Period {
  FallSemester = 1, // Осенний семестр
  WinterSession = 2, // Зимняя сессия
  SpringSemester = 3, // Весенний семестр
  SummerSession = 4, // Летняя сессия
}

EducationType

enum EducationType {
  HigherEducation = 1, // Высшее образование
  VocationalEducation = 2, // СПО
}

Lesson

interface Lesson {
  number: number; // Номер пары
  start: LessonTime; // Начало { date, hours, minutes }
  end: LessonTime; // Конец { date, hours, minutes }
  subject: string; // Предмет
  type: string; // Тип (лекция, практика, лаб. работа)
  room: string; // Аудитория
  teacher: Teacher; // Преподаватель { name, position?, degree? }
  weeks: WeekRange; // Диапазон недель { from, to }
  subgroup?: number; // Подгруппа
  weekParity?: "even" | "odd"; // Чётность недели
}

Обработка ошибок

import { AuthError, ParseError } from "chuvsu-js";

try {
  await tt.login({ email: "...", password: "wrong" });
} catch (e) {
  if (e instanceof AuthError) {
    console.error("Неверные данные для входа");
  }
}

Лицензия

MIT