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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -18
  3. package/dist/cabinet/cabinet.d.ts +79 -79
  4. package/dist/cabinet/cabinet.js +162 -162
  5. package/dist/cabinet/data.d.ts +33 -4
  6. package/dist/cabinet/data.js +52 -6
  7. package/dist/cabinet/disciplines.d.ts +19 -19
  8. package/dist/cabinet/disciplines.js +87 -87
  9. package/dist/cabinet/index.d.ts +2 -5
  10. package/dist/cabinet/index.js +2 -5
  11. package/dist/cabinet/parsers.d.ts +22 -3
  12. package/dist/cabinet/parsers.js +118 -0
  13. package/dist/cabinet/scores.d.ts +12 -12
  14. package/dist/cabinet/scores.js +101 -101
  15. package/dist/cabinet/sesId.d.ts +10 -10
  16. package/dist/cabinet/sesId.js +40 -40
  17. package/dist/cabinet/session.d.ts +33 -0
  18. package/dist/cabinet/session.js +99 -0
  19. package/dist/cabinet/types.d.ts +0 -137
  20. package/dist/cabinet/utils.d.ts +6 -6
  21. package/dist/cabinet/utils.js +16 -19
  22. package/dist/cabinet/validSession.d.ts +8 -8
  23. package/dist/cabinet/validSession.js +29 -29
  24. package/dist/cabinetStudent/cabinetStudent.d.ts +87 -0
  25. package/dist/cabinetStudent/cabinetStudent.js +185 -0
  26. package/dist/cabinetStudent/disciplines.d.ts +19 -0
  27. package/dist/cabinetStudent/disciplines.js +86 -0
  28. package/dist/cabinetStudent/index.d.ts +4 -0
  29. package/dist/cabinetStudent/index.js +4 -0
  30. package/dist/cabinetStudent/scores.d.ts +12 -0
  31. package/dist/cabinetStudent/scores.js +103 -0
  32. package/dist/cabinetStudent/types.d.ts +137 -0
  33. package/dist/cabinetStudent/types.js +1 -0
  34. package/dist/cabinetTeacher/academicGroups.d.ts +10 -0
  35. package/dist/cabinetTeacher/academicGroups.js +36 -0
  36. package/dist/cabinetTeacher/cabinetTeacher.d.ts +71 -0
  37. package/dist/cabinetTeacher/cabinetTeacher.js +132 -0
  38. package/dist/cabinetTeacher/index.d.ts +3 -0
  39. package/dist/cabinetTeacher/index.js +3 -0
  40. package/dist/cabinetTeacher/types.d.ts +68 -0
  41. package/dist/cabinetTeacher/types.js +1 -0
  42. package/dist/examples.d.ts +1 -1
  43. package/dist/examples.js +50 -38
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +2 -0
  46. package/dist/types.d.ts +4 -3
  47. package/package.json +35 -34
@@ -1,162 +1,162 @@
1
- import { getSesId } from './sesId.js';
2
- import { isValidSession } from './validSession.js';
3
- import { getСurrentDisciplines } from './disciplines.js';
4
- import { getData } from './data.js';
5
- import { getScores } from './scores.js';
6
- /**
7
- * Клас кабінету студента
8
- * @category Cabinet
9
- */
10
- export class Cabinet {
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 = 0;
31
- /**
32
- * Список дисциплін {@link Discipline}
33
- */
34
- disciplines = [];
35
- /**
36
- * Данні студента {@link Data}
37
- */
38
- data;
39
- /**
40
- * Оціки з усіх предметів {@link Scores}
41
- */
42
- allScores;
43
- /**
44
- * Конструктор
45
- * @param login - Прізвище користувача
46
- * @param password - Пароль
47
- */
48
- constructor(login, password) {
49
- this.login = login;
50
- this.password = password;
51
- }
52
- /**
53
- * Авторизація
54
- */
55
- async auth(login, password) {
56
- const accountData = await getSesId(login ?? this.login, password ?? this.password);
57
- this.setSemester();
58
- if (accountData.ok) {
59
- this.sesID = accountData.sesID;
60
- this.sessGUID = accountData.sessGUID;
61
- return true;
62
- }
63
- return false;
64
- }
65
- /**
66
- * Базове значення семестру
67
- */
68
- setSemester() {
69
- const year = new Date().getFullYear();
70
- const febStart = new Date(year, 1, 1); // лютий = 1
71
- const sepStart = new Date(year, 8, 1); // вересень = 8
72
- const date = new Date();
73
- if (!(date < febStart || date >= sepStart)) {
74
- this.semester = 1;
75
- }
76
- }
77
- /**
78
- * Отримання всіх данних
79
- */
80
- async loadData() {
81
- const one = (await this.getDisciplines()).ok;
82
- const two = (await this.getData()).ok;
83
- const three = (await this.getAllScores()).length > 0;
84
- return one && two && three;
85
- }
86
- /**
87
- * Відновлення сесії
88
- */
89
- async setSession(sesID, sessGUID) {
90
- this.setSemester();
91
- const ses = await isValidSession(sesID, sessGUID);
92
- if (ses) {
93
- this.sesID = sesID;
94
- this.sessGUID = sessGUID;
95
- }
96
- return ses;
97
- }
98
- /**
99
- * Перевірка валідності сесії
100
- */
101
- async isValidSession() {
102
- if (!this.sesID || !this.sessGUID)
103
- return false;
104
- return await isValidSession(this.sesID, this.sessGUID);
105
- }
106
- /**
107
- * Отримати дисципліни поточного семестру студента
108
- * @returns Масив дисциплін {@link Disciplines}
109
- */
110
- async getDisciplines() {
111
- if (!this.sesID || !this.sessGUID)
112
- return { ok: false, disciplines: [] };
113
- try {
114
- const disciplinesData = await getСurrentDisciplines(this.sesID, this.sessGUID);
115
- if (disciplinesData.ok) {
116
- this.disciplines = disciplinesData.disciplines;
117
- }
118
- return disciplinesData;
119
- }
120
- catch {
121
- return { ok: false, disciplines: [] };
122
- }
123
- }
124
- /**
125
- * Отримати анкетні данні студента
126
- * @returns Об'єкт {@link ata}
127
- */
128
- async getData() {
129
- if (!this.sesID || !this.sessGUID)
130
- return { ok: false };
131
- try {
132
- const data = await getData(this.sesID, this.sessGUID);
133
- if (data.ok) {
134
- this.data = data;
135
- }
136
- return data;
137
- }
138
- catch {
139
- return { ok: false };
140
- }
141
- }
142
- /**
143
- * Отримати оцінки з всіх предметів
144
- */
145
- async getAllScores(semester) {
146
- if (!this.sesID || !this.sessGUID)
147
- return [];
148
- if (!this.disciplines?.length)
149
- return [];
150
- const targetSemester = semester ?? this.semester;
151
- try {
152
- const scorePromises = this.disciplines.map((discipline) => getScores(this.sesID, this.sessGUID, discipline.prId, targetSemester));
153
- const results = await Promise.all(scorePromises);
154
- const allScores = results.filter((scores) => scores.ok);
155
- this.allScores = allScores;
156
- return allScores;
157
- }
158
- catch {
159
- return [];
160
- }
161
- }
162
- }
1
+ import { getSesId } from './sesId.js';
2
+ import { isValidSession } from './validSession.js';
3
+ import { getСurrentDisciplines } from './disciplines.js';
4
+ import { getData } from './data.js';
5
+ import { getScores } from './scores.js';
6
+ /**
7
+ * Клас кабінету студента
8
+ * @category Cabinet
9
+ */
10
+ export class Cabinet {
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 = 0;
31
+ /**
32
+ * Список дисциплін {@link Discipline}
33
+ */
34
+ disciplines = [];
35
+ /**
36
+ * Данні студента {@link Data}
37
+ */
38
+ data;
39
+ /**
40
+ * Оціки з усіх предметів {@link Scores}
41
+ */
42
+ allScores;
43
+ /**
44
+ * Конструктор
45
+ * @param login - Прізвище користувача
46
+ * @param password - Пароль
47
+ */
48
+ constructor(login, password) {
49
+ this.login = login;
50
+ this.password = password;
51
+ }
52
+ /**
53
+ * Авторизація
54
+ */
55
+ async auth(login, password) {
56
+ const accountData = await getSesId(login ?? this.login, password ?? this.password);
57
+ this.setSemester();
58
+ if (accountData.ok) {
59
+ this.sesID = accountData.sesID;
60
+ this.sessGUID = accountData.sessGUID;
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ /**
66
+ * Базове значення семестру
67
+ */
68
+ setSemester() {
69
+ const year = new Date().getFullYear();
70
+ const febStart = new Date(year, 1, 1); // лютий = 1
71
+ const sepStart = new Date(year, 8, 1); // вересень = 8
72
+ const date = new Date();
73
+ if (!(date < febStart || date >= sepStart)) {
74
+ this.semester = 1;
75
+ }
76
+ }
77
+ /**
78
+ * Отримання всіх данних
79
+ */
80
+ async loadData() {
81
+ const one = (await this.getDisciplines()).ok;
82
+ const two = (await this.getData()).ok;
83
+ const three = (await this.getAllScores()).length > 0;
84
+ return one && two && three;
85
+ }
86
+ /**
87
+ * Відновлення сесії
88
+ */
89
+ async setSession(sesID, sessGUID) {
90
+ this.setSemester();
91
+ const ses = await isValidSession(sesID, sessGUID);
92
+ if (ses) {
93
+ this.sesID = sesID;
94
+ this.sessGUID = sessGUID;
95
+ }
96
+ return ses;
97
+ }
98
+ /**
99
+ * Перевірка валідності сесії
100
+ */
101
+ async isValidSession() {
102
+ if (!this.sesID || !this.sessGUID)
103
+ return false;
104
+ return await isValidSession(this.sesID, this.sessGUID);
105
+ }
106
+ /**
107
+ * Отримати дисципліни поточного семестру студента
108
+ * @returns Масив дисциплін {@link Disciplines}
109
+ */
110
+ async getDisciplines() {
111
+ if (!this.sesID || !this.sessGUID)
112
+ return { ok: false, disciplines: [] };
113
+ try {
114
+ const disciplinesData = await getСurrentDisciplines(this.sesID, this.sessGUID);
115
+ if (disciplinesData.ok) {
116
+ this.disciplines = disciplinesData.disciplines;
117
+ }
118
+ return disciplinesData;
119
+ }
120
+ catch {
121
+ return { ok: false, disciplines: [] };
122
+ }
123
+ }
124
+ /**
125
+ * Отримати анкетні данні студента
126
+ * @returns Об'єкт {@link ata}
127
+ */
128
+ async getData() {
129
+ if (!this.sesID || !this.sessGUID)
130
+ return { ok: false };
131
+ try {
132
+ const data = await getData(this.sesID, this.sessGUID);
133
+ if (data.ok) {
134
+ this.data = data;
135
+ }
136
+ return data;
137
+ }
138
+ catch {
139
+ return { ok: false };
140
+ }
141
+ }
142
+ /**
143
+ * Отримати оцінки з всіх предметів
144
+ */
145
+ async getAllScores(semester) {
146
+ if (!this.sesID || !this.sessGUID)
147
+ return [];
148
+ if (!this.disciplines?.length)
149
+ return [];
150
+ const targetSemester = semester ?? this.semester;
151
+ try {
152
+ const scorePromises = this.disciplines.map((discipline) => getScores(this.sesID, this.sessGUID, discipline.prId, targetSemester));
153
+ const results = await Promise.all(scorePromises);
154
+ const allScores = results.filter((scores) => scores.ok);
155
+ this.allScores = allScores;
156
+ return allScores;
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ }
162
+ }
@@ -1,13 +1,42 @@
1
- import { Data } from './types.js';
1
+ import { DataTeacher } from '../cabinetTeacher/types.js';
2
+ import { DataStudent } from '../cabinetStudent/types.js';
2
3
  /**
3
4
  * Отримати анкетні дані студента
4
- * @category Cabinet
5
+ * @category CabinetTeacher
5
6
  * @param sesId - ID сесії користувача
6
7
  * @param sessGUID - GUID сесії з cookie
7
8
  * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
8
9
  * @example
9
10
  * ```typescript
10
- * const data = await getData(sesId, sessGUID);
11
+ * const cb = new CabinetTeacher(process.env.LOGINTEACHER!, process.env.PASSWORDTEACHER!);
12
+ * const data = await cb.getData(sesId, sessGUID);
13
+ * // {
14
+ * ok: true,
15
+ * fullName: 'Іванов Іван Іванович',
16
+ * lastName: 'Іванов',
17
+ * firstName: 'Іван',
18
+ * middleName: 'Іванович',
19
+ * department: 'Кафедра комп’ютерних наук та інформаційних технологій',
20
+ * partTimeHours: 0,
21
+ * workDurationMonths: 10,
22
+ * totalPositionHours: 0,
23
+ * workloadByStaff: 68,
24
+ * totalWorkload: 68
25
+ * // }
26
+ * ```
27
+ * @returns Об'єкт з запарсеними даними {@link DataTeacher}
28
+ */
29
+ export declare function getDataTeacher(sesId: string, sessGUID: string): Promise<DataTeacher>;
30
+ /**
31
+ * Отримати анкетні дані студента
32
+ * @category CabinetStudent
33
+ * @param sesId - ID сесії користувача
34
+ * @param sessGUID - GUID сесії з cookie
35
+ * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
36
+ * @example
37
+ * ```typescript
38
+ * const cb = new CabinetTeacher(process.env.LOGINSTUDENT!, process.env.PASSWORDSTUDENT!);
39
+ * const data = await cb.getData(sesId, sessGUID);
11
40
  * // {
12
41
  * // ok: true,
13
42
  * // fullName: 'Іванов Іван Іванович',
@@ -34,4 +63,4 @@ import { Data } from './types.js';
34
63
  * ```
35
64
  * @returns Об'єкт з запарсеними даними {@link Data}
36
65
  */
37
- export declare function getData(sesId: string, sessGUID: string): Promise<Data>;
66
+ export declare function getDataStudent(sesId: string, sessGUID: string): Promise<DataStudent>;
@@ -1,16 +1,62 @@
1
1
  import fetch from 'cross-fetch';
2
2
  import iconv from 'iconv-lite';
3
- import { parseDataPageN3, parseDataPageN31 } from './parsers.js';
4
- import { generateCookieString, isLoginPage } from './utils.js';
3
+ import { generateCookieString, isLoginPage } from './session.js';
4
+ import { parseDataPageN3, parseDataPageN31, parseTeacherData } from './parsers.js';
5
5
  /**
6
6
  * Отримати анкетні дані студента
7
- * @category Cabinet
7
+ * @category CabinetTeacher
8
8
  * @param sesId - ID сесії користувача
9
9
  * @param sessGUID - GUID сесії з cookie
10
10
  * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
11
11
  * @example
12
12
  * ```typescript
13
- * const data = await getData(sesId, sessGUID);
13
+ * const cb = new CabinetTeacher(process.env.LOGINTEACHER!, process.env.PASSWORDTEACHER!);
14
+ * const data = await cb.getData(sesId, sessGUID);
15
+ * // {
16
+ * ok: true,
17
+ * fullName: 'Іванов Іван Іванович',
18
+ * lastName: 'Іванов',
19
+ * firstName: 'Іван',
20
+ * middleName: 'Іванович',
21
+ * department: 'Кафедра комп’ютерних наук та інформаційних технологій',
22
+ * partTimeHours: 0,
23
+ * workDurationMonths: 10,
24
+ * totalPositionHours: 0,
25
+ * workloadByStaff: 68,
26
+ * totalWorkload: 68
27
+ * // }
28
+ * ```
29
+ * @returns Об'єкт з запарсеними даними {@link DataTeacher}
30
+ */
31
+ export async function getDataTeacher(sesId, sessGUID) {
32
+ try {
33
+ const result = { ok: false };
34
+ const cookieString = generateCookieString(sessGUID);
35
+ const response1 = await fetch(`https://dekanat.zu.edu.ua/cgi-bin/kaf.cgi?n=2&sesID=${sesId}`, { headers: { Cookie: cookieString } });
36
+ const buffer = await response1.arrayBuffer();
37
+ const html = iconv.decode(Buffer.from(buffer), 'windows-1251');
38
+ if (isLoginPage(html))
39
+ return { ok: false };
40
+ const data = parseTeacherData(html);
41
+ Object.assign(result, data);
42
+ result.ok = true;
43
+ return result;
44
+ }
45
+ catch (e) {
46
+ console.error('Error in getDataTeacher:', e);
47
+ throw e;
48
+ }
49
+ }
50
+ /**
51
+ * Отримати анкетні дані студента
52
+ * @category CabinetStudent
53
+ * @param sesId - ID сесії користувача
54
+ * @param sessGUID - GUID сесії з cookie
55
+ * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
56
+ * @example
57
+ * ```typescript
58
+ * const cb = new CabinetTeacher(process.env.LOGINSTUDENT!, process.env.PASSWORDSTUDENT!);
59
+ * const data = await cb.getData(sesId, sessGUID);
14
60
  * // {
15
61
  * // ok: true,
16
62
  * // fullName: 'Іванов Іван Іванович',
@@ -37,7 +83,7 @@ import { generateCookieString, isLoginPage } from './utils.js';
37
83
  * ```
38
84
  * @returns Об'єкт з запарсеними даними {@link Data}
39
85
  */
40
- export async function getData(sesId, sessGUID) {
86
+ export async function getDataStudent(sesId, sessGUID) {
41
87
  try {
42
88
  const result = { ok: false };
43
89
  const cookieString = generateCookieString(sessGUID);
@@ -63,7 +109,7 @@ export async function getData(sesId, sessGUID) {
63
109
  return result;
64
110
  }
65
111
  catch (e) {
66
- console.error('Error in getData:', e);
112
+ console.error('Error in getDataStudent:', e);
67
113
  throw e;
68
114
  }
69
115
  }
@@ -1,19 +1,19 @@
1
- import { Disciplines } from './types.js';
2
- /**
3
- * Отримати всі дисципліни студента
4
- * @category Cabinet
5
- * @param sesId - ID сесії користувача
6
- * @param sessGUID - GUID сесії з cookie
7
- * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
8
- * @returns Масив дисциплін {@link Disciplines}
9
- */
10
- export declare function getDisciplines(sesId: string, sessGUID: string): Promise<Disciplines>;
11
- /**
12
- * Отримати поточні дисципліни студента
13
- * @category Cabinet
14
- * @param sesId - ID сесії користувача
15
- * @param sessGUID - GUID сесії з cookie
16
- * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
17
- * @returns Масив дисциплін {@link Disciplines}
18
- */
19
- export declare function getСurrentDisciplines(sesId: string, sessGUID: string): Promise<Disciplines>;
1
+ import { Disciplines } from './types.js';
2
+ /**
3
+ * Отримати всі дисципліни студента
4
+ * @category Cabinet
5
+ * @param sesId - ID сесії користувача
6
+ * @param sessGUID - GUID сесії з cookie
7
+ * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
8
+ * @returns Масив дисциплін {@link Disciplines}
9
+ */
10
+ export declare function getDisciplines(sesId: string, sessGUID: string): Promise<Disciplines>;
11
+ /**
12
+ * Отримати поточні дисципліни студента
13
+ * @category Cabinet
14
+ * @param sesId - ID сесії користувача
15
+ * @param sessGUID - GUID сесії з cookie
16
+ * @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
17
+ * @returns Масив дисциплін {@link Disciplines}
18
+ */
19
+ export declare function getСurrentDisciplines(sesId: string, sessGUID: string): Promise<Disciplines>;