zdu-student-api 1.1.6 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +231 -18
- package/dist/cabinet/cabinet.d.ts +79 -79
- package/dist/cabinet/cabinet.js +162 -162
- package/dist/cabinet/data.d.ts +33 -4
- package/dist/cabinet/data.js +52 -6
- package/dist/cabinet/disciplines.d.ts +19 -19
- package/dist/cabinet/disciplines.js +87 -87
- package/dist/cabinet/index.d.ts +2 -5
- package/dist/cabinet/index.js +2 -5
- package/dist/cabinet/parsers.d.ts +22 -3
- package/dist/cabinet/parsers.js +118 -0
- package/dist/cabinet/scores.d.ts +12 -12
- package/dist/cabinet/scores.js +101 -101
- package/dist/cabinet/sesId.d.ts +10 -10
- package/dist/cabinet/sesId.js +40 -40
- package/dist/cabinet/session.d.ts +33 -0
- package/dist/cabinet/session.js +99 -0
- package/dist/cabinet/types.d.ts +0 -137
- package/dist/cabinet/utils.d.ts +6 -6
- package/dist/cabinet/utils.js +16 -19
- package/dist/cabinet/validSession.d.ts +8 -8
- package/dist/cabinet/validSession.js +29 -29
- package/dist/cabinetStudent/cabinetStudent.d.ts +87 -0
- package/dist/cabinetStudent/cabinetStudent.js +185 -0
- package/dist/cabinetStudent/disciplines.d.ts +19 -0
- package/dist/cabinetStudent/disciplines.js +86 -0
- package/dist/cabinetStudent/index.d.ts +4 -0
- package/dist/cabinetStudent/index.js +4 -0
- package/dist/cabinetStudent/scores.d.ts +12 -0
- package/dist/cabinetStudent/scores.js +103 -0
- package/dist/cabinetStudent/types.d.ts +137 -0
- package/dist/cabinetStudent/types.js +1 -0
- package/dist/cabinetTeacher/academicGroups.d.ts +10 -0
- package/dist/cabinetTeacher/academicGroups.js +36 -0
- package/dist/cabinetTeacher/cabinetTeacher.d.ts +71 -0
- package/dist/cabinetTeacher/cabinetTeacher.js +132 -0
- package/dist/cabinetTeacher/index.d.ts +3 -0
- package/dist/cabinetTeacher/index.js +3 -0
- package/dist/cabinetTeacher/types.d.ts +68 -0
- package/dist/cabinetTeacher/types.js +1 -0
- package/dist/examples.d.ts +1 -1
- package/dist/examples.js +50 -38
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/types.d.ts +4 -3
- package/package.json +35 -34
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { getSesId } from '../cabinet/session.js';
|
|
2
|
+
import { isValidSession } from '../cabinet/session.js';
|
|
3
|
+
import { getAcademicGroups } from './academicGroups.js';
|
|
4
|
+
import { getDataTeacher } from '../cabinet/data.js';
|
|
5
|
+
import { getSemester } from '../cabinet/utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Клас кабінету викладача
|
|
8
|
+
* @category CabinetTeacher
|
|
9
|
+
*/
|
|
10
|
+
export class CabinetTeacher {
|
|
11
|
+
/**
|
|
12
|
+
* Логін користувача
|
|
13
|
+
*/
|
|
14
|
+
login;
|
|
15
|
+
/**
|
|
16
|
+
* Пароль від кабінету викладача
|
|
17
|
+
*/
|
|
18
|
+
password;
|
|
19
|
+
/**
|
|
20
|
+
* ID сесії викладача
|
|
21
|
+
*/
|
|
22
|
+
sesID;
|
|
23
|
+
/**
|
|
24
|
+
* GUID сесії з cookie
|
|
25
|
+
*/
|
|
26
|
+
sessGUID;
|
|
27
|
+
/**
|
|
28
|
+
* Семестр для пошуку оцінок (0 - перший, 1 - другий)
|
|
29
|
+
*/
|
|
30
|
+
semester = 1;
|
|
31
|
+
/**
|
|
32
|
+
* Данні викладача {@link DataTeacher}
|
|
33
|
+
*/
|
|
34
|
+
data;
|
|
35
|
+
/**
|
|
36
|
+
* Список академічних груп {@link AcademicGroup}
|
|
37
|
+
*/
|
|
38
|
+
academicGroups = [];
|
|
39
|
+
/**
|
|
40
|
+
* Конструктор
|
|
41
|
+
* @param login - Логін користувача
|
|
42
|
+
* @param password - Пароль
|
|
43
|
+
*/
|
|
44
|
+
constructor(login, password) {
|
|
45
|
+
this.login = login;
|
|
46
|
+
this.password = password;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Авторизація
|
|
50
|
+
*/
|
|
51
|
+
async auth(login, password) {
|
|
52
|
+
const accountData = await getSesId(login ?? this.login, password ?? this.password, 'teacher');
|
|
53
|
+
this.setSemester();
|
|
54
|
+
if (accountData.ok) {
|
|
55
|
+
this.sesID = accountData.sesID;
|
|
56
|
+
this.sessGUID = accountData.sessGUID;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Базове значення семестру
|
|
63
|
+
*/
|
|
64
|
+
setSemester() {
|
|
65
|
+
this.semester = getSemester();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Отримання всіх данних
|
|
69
|
+
*/
|
|
70
|
+
async loadData() {
|
|
71
|
+
const one = (await this.getAcademicGroups()).ok;
|
|
72
|
+
const two = (await this.getData()).ok;
|
|
73
|
+
return one && two;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Відновлення сесії
|
|
77
|
+
*/
|
|
78
|
+
async setSession(sesID, sessGUID) {
|
|
79
|
+
this.setSemester();
|
|
80
|
+
const ses = await isValidSession(sesID, sessGUID, 'teacher');
|
|
81
|
+
if (ses) {
|
|
82
|
+
this.sesID = sesID;
|
|
83
|
+
this.sessGUID = sessGUID;
|
|
84
|
+
}
|
|
85
|
+
return ses;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Перевірка валідності сесії
|
|
89
|
+
*/
|
|
90
|
+
async isValidSession() {
|
|
91
|
+
if (!this.sesID || !this.sessGUID)
|
|
92
|
+
return false;
|
|
93
|
+
return await isValidSession(this.sesID, this.sessGUID, 'teacher');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Отримати всі академічні групи
|
|
97
|
+
* @returns Об'єкт академічних груп {@link AcademicGroups}
|
|
98
|
+
*/
|
|
99
|
+
async getAcademicGroups() {
|
|
100
|
+
if (!this.sesID || !this.sessGUID)
|
|
101
|
+
return { ok: false, groups: [] };
|
|
102
|
+
try {
|
|
103
|
+
const academicGroupsData = await getAcademicGroups(this.sesID, this.sessGUID);
|
|
104
|
+
if (academicGroupsData.ok) {
|
|
105
|
+
this.academicGroups = academicGroupsData.groups;
|
|
106
|
+
}
|
|
107
|
+
return academicGroupsData;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return { ok: false, groups: [] };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Отримати анкетні данні викладача
|
|
115
|
+
* @returns Об'єкт {@link Data}
|
|
116
|
+
*/
|
|
117
|
+
async getData() {
|
|
118
|
+
if (!this.sesID || !this.sessGUID)
|
|
119
|
+
return { ok: false };
|
|
120
|
+
try {
|
|
121
|
+
const data = await getDataTeacher(this.sesID, this.sessGUID);
|
|
122
|
+
if (data.ok) {
|
|
123
|
+
this.data = data;
|
|
124
|
+
}
|
|
125
|
+
return data;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.log(err);
|
|
129
|
+
return { ok: false };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Дані викладача з головної сторінки кабінету
|
|
3
|
+
* @category CabinetTeacher
|
|
4
|
+
* @remarks
|
|
5
|
+
* **Статус запиту:**
|
|
6
|
+
* - `ok` — Успіх отримання даних (true/false)
|
|
7
|
+
*
|
|
8
|
+
* **ПІБ викладача:**
|
|
9
|
+
* - `fullName` — Повне ім'я викладача (Прізвище Ім'я По батькові)
|
|
10
|
+
* - `lastName` — Прізвище
|
|
11
|
+
* - `firstName` — Ім'я
|
|
12
|
+
* - `middleName` — По батькові
|
|
13
|
+
*
|
|
14
|
+
* **Інформація про роботу:**
|
|
15
|
+
* - `department` — Назва кафедри
|
|
16
|
+
* - `partTimeHours` — Кількість годин за сумісництвом (число без "год.")
|
|
17
|
+
* - `workDurationMonths` — Тривалість роботи в навчальному році (місяців)
|
|
18
|
+
* - `totalPositionHours` — Загальна кількість годин за ставками (число без "год.")
|
|
19
|
+
* - `workloadByStaff` — Розподілене навантаження за штатом (число без "год.")
|
|
20
|
+
* - `totalWorkload` — Загальне розподілене навантаження (число без "год.")
|
|
21
|
+
*/
|
|
22
|
+
export interface DataTeacher {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
fullName?: string;
|
|
25
|
+
lastName?: string;
|
|
26
|
+
firstName?: string;
|
|
27
|
+
middleName?: string;
|
|
28
|
+
department?: string;
|
|
29
|
+
partTimeHours?: number;
|
|
30
|
+
workDurationMonths?: number;
|
|
31
|
+
totalPositionHours?: number;
|
|
32
|
+
workloadByStaff?: number;
|
|
33
|
+
totalWorkload?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Інформація про академічну групу
|
|
37
|
+
* @category CabinetTeacher
|
|
38
|
+
* @remarks
|
|
39
|
+
* - `name` — Назва групи (наприклад: "23Мд-СОфіз")
|
|
40
|
+
* - `semester` — Семестр: "1" (перше), "2" (друге)
|
|
41
|
+
* - `encodedName` — URL-encoded назва групи для запитів
|
|
42
|
+
* - `course` — Номер курсу (1-4)
|
|
43
|
+
* - `specialty` — Повна назва спеціальності з кодом
|
|
44
|
+
* - `faculty` — Назва факультету
|
|
45
|
+
* - `teacherId` — ID викладача з параметра teacher в URL
|
|
46
|
+
* - `journalUrl` — Відносний URL для переходу до журналу групи
|
|
47
|
+
*/
|
|
48
|
+
export interface AcademicGroup {
|
|
49
|
+
name: string;
|
|
50
|
+
semester: number;
|
|
51
|
+
encodedName: string;
|
|
52
|
+
course: number;
|
|
53
|
+
specialty: string;
|
|
54
|
+
faculty: string;
|
|
55
|
+
teacherId: string;
|
|
56
|
+
journalUrl: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Список академічних груп викладача
|
|
60
|
+
* @category CabinetTeacher
|
|
61
|
+
* @remarks
|
|
62
|
+
* - `ok` — Успіх отримання даних (true/false)
|
|
63
|
+
* - `groups` — Масив груп {@link Group}
|
|
64
|
+
*/
|
|
65
|
+
export interface AcademicGroups {
|
|
66
|
+
ok: boolean;
|
|
67
|
+
groups: AcademicGroup[];
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/examples.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import 'dotenv/config';
|
package/dist/examples.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import 'dotenv/config';
|
|
2
2
|
// const schedule = new Schedule();
|
|
3
3
|
// schedule.group = '23Бд-СОінф123'
|
|
4
4
|
// schedule.type = 'group'
|
|
@@ -23,9 +23,9 @@ import { Cabinet } from './index.js';
|
|
|
23
23
|
// } catch (err: any) {
|
|
24
24
|
// console.error(err.message);
|
|
25
25
|
// }
|
|
26
|
-
//console.log(
|
|
27
|
-
// console.log(
|
|
28
|
-
// console.log(
|
|
26
|
+
// console.log(await getGroups('25Бд-Комп')); // -3158
|
|
27
|
+
// console.log(await getTeachers('Кривонос Олександр'));
|
|
28
|
+
// console.log(await getRooms('319'));
|
|
29
29
|
// const audience = new Audience();
|
|
30
30
|
// audience.blockName = "гуртож №3"
|
|
31
31
|
// try {
|
|
@@ -39,10 +39,10 @@ import { Cabinet } from './index.js';
|
|
|
39
39
|
// console.log((await getSesId("FFFFF", "123456789")))
|
|
40
40
|
// console.log(cb.data);
|
|
41
41
|
// console.log(cb.disciplines);
|
|
42
|
-
// const { sesID, sessGUID } = await getSesId(
|
|
42
|
+
// const { sesID, sessGUID } = await getSesId(process.env.LOGIN!, process.env.PASSWORD!);
|
|
43
43
|
// console.log(sesID, sessGUID);
|
|
44
|
-
// const sesID = '
|
|
45
|
-
// const sessGUID = '
|
|
44
|
+
// const sesID = '';
|
|
45
|
+
// const sessGUID = '';
|
|
46
46
|
// const data = await getData(sesID, sessGUID);
|
|
47
47
|
// const data = await getDisciplines(sesID, sessGUID);
|
|
48
48
|
// const data = await getСurrentDisciplines(sesID, sessGUID);
|
|
@@ -50,35 +50,47 @@ import { Cabinet } from './index.js';
|
|
|
50
50
|
// const data2 = await getScores(sesID, sessGUID, '43910', 0);
|
|
51
51
|
// // console.log(data2);
|
|
52
52
|
// const me = data2.studentScores.find((s) => s.id === data2.studentId)!;
|
|
53
|
-
const sesID = '
|
|
54
|
-
const sessGUID = '
|
|
55
|
-
const cb = new
|
|
56
|
-
// await cb.auth();
|
|
57
|
-
|
|
58
|
-
// console.log(cb.sesID,
|
|
59
|
-
console.log(
|
|
53
|
+
// const sesID = '';
|
|
54
|
+
// const sessGUID = '';
|
|
55
|
+
// //const cb = new CabinetStudent(process.env.LOGIN!, process.env.PASSWORD!);
|
|
56
|
+
// //await cb.auth();
|
|
57
|
+
// // console.log(cb.sesID, cb.sessGUID);
|
|
58
|
+
// console.log(await cb.setSession(sesID, sessGUID));
|
|
59
|
+
// // console.log(cb.sesID, cb.sessGUID);
|
|
60
|
+
// console.log(await cb.loadData());
|
|
61
|
+
// await cb.getDisciplines();
|
|
62
|
+
// console.log(await cb.getId());
|
|
60
63
|
// console.log(cb.allScores);
|
|
61
|
-
printFinalScores(cb.allScores
|
|
62
|
-
function printFinalScores(scoresArray, disciplines) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
64
|
+
// printFinalScores(cb.allScores!, cb.disciplines);
|
|
65
|
+
// function printFinalScores(scoresArray: Scores[], disciplines: Discipline[]) {
|
|
66
|
+
// // Створюємо мапу prId → name для швидкого доступу
|
|
67
|
+
// const disciplineMap: Record<string, string> = {};
|
|
68
|
+
// for (const d of disciplines) {
|
|
69
|
+
// disciplineMap[d.prId] = d.name;
|
|
70
|
+
// }
|
|
71
|
+
// const result: Record<string, Record<string, string>> = {};
|
|
72
|
+
// for (const scoresObj of scoresArray) {
|
|
73
|
+
// const disciplineId = scoresObj.prId;
|
|
74
|
+
// const disciplineName = disciplineMap[disciplineId] ?? disciplineId;
|
|
75
|
+
// for (const student of scoresObj.studentScores) {
|
|
76
|
+
// if (!result[student.id]) result[student.id] = {};
|
|
77
|
+
// result[student.id][disciplineName] = student.finalScore;
|
|
78
|
+
// }
|
|
79
|
+
// }
|
|
80
|
+
// for (const studentId in result) {
|
|
81
|
+
// console.log(`Student ${studentId}:`);
|
|
82
|
+
// for (const disciplineName in result[studentId]) {
|
|
83
|
+
// console.log(` ${disciplineName}: ${result[studentId][disciplineName]}`);
|
|
84
|
+
// }
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
// const sesID = '';
|
|
88
|
+
// const sessGUID = '';
|
|
89
|
+
// const cb = new CabinetTeacher(process.env.LOGINT!, process.env.PASSWORDT!);
|
|
90
|
+
// // console.log(await cb.auth());
|
|
91
|
+
// //console.log(cb.sesID, cb.sessGUID);
|
|
92
|
+
// console.log(await cb.setSession(sesID, sessGUID));
|
|
93
|
+
// console.log(cb.sesID, cb.sessGUID);
|
|
94
|
+
// console.log(await cb.loadData());
|
|
95
|
+
// console.log(cb.data);
|
|
96
|
+
// console.log(cb.academicGroups);
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -94,16 +94,17 @@ export interface BaseLesson {
|
|
|
94
94
|
* @category Schedule
|
|
95
95
|
*
|
|
96
96
|
* @remarks
|
|
97
|
-
* - `half` —
|
|
97
|
+
* - `half` — Половина пари (не використовується)
|
|
98
98
|
* - `teacher` — Основний викладач
|
|
99
99
|
* - `teachers_add` — Додаткові викладачі
|
|
100
100
|
* - `room` — Аудиторія, наприклад "319/№1"
|
|
101
|
-
* - `group` — Список груп, які відвідують заняття
|
|
101
|
+
* - `group` — Список груп, які відвідують заняття / підгрупа
|
|
102
102
|
* - `title` — Повна назва предмету або його код
|
|
103
103
|
* - `type` — Тип заняття
|
|
104
104
|
* - `replacement` — Позначка про заміну пари
|
|
105
|
+
* - `reservation` — Зарезервована пара
|
|
105
106
|
* - `online` — Чи є онлайн-посилання / онлайн-режим
|
|
106
|
-
* - `comment4link` — Коментар до посилання (іноді використовується для Zoom/Meet)
|
|
107
|
+
* - `comment4link` — Коментар до посилання (іноді використовується для Zoom/Meet) / підгрупа / коментар
|
|
107
108
|
* - `link` — Посилання на онлайн-заняття
|
|
108
109
|
*/
|
|
109
110
|
export interface DetailedLesson extends BaseLesson {
|
package/package.json
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
2
|
+
"name": "zdu-student-api",
|
|
3
|
+
"version": "1.1.8",
|
|
4
|
+
"description": "API client for ZDU student services",
|
|
5
|
+
"author": "Nicita3 <ni596157@gmail.com> (https://github.com/Nicita-3)",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"docs": "typedoc --out docs src",
|
|
15
|
+
"test": "node --loader ts-node/esm src/examples.ts",
|
|
16
|
+
"publish:all": "npm run build && npm run docs && npm publish"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/Nicita-3/zdu-student-api"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://nicita-3.github.io/zdu-student-api",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^24.10.1",
|
|
26
|
+
"prettier": "^3.7.4",
|
|
27
|
+
"ts-node": "^10.9.2",
|
|
28
|
+
"typedoc": "^0.28.14",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"buffer": "^6.0.3",
|
|
33
|
+
"cross-fetch": "^4.1.0",
|
|
34
|
+
"dotenv": "^17.2.3",
|
|
35
|
+
"iconv-lite": "^0.7.0"
|
|
36
|
+
}
|
|
36
37
|
}
|