zdu-student-api 1.1.5 → 1.1.7
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 +242 -18
- package/dist/audience.d.ts +44 -44
- package/dist/audience.js +50 -48
- package/dist/cabinet/cabinet.d.ts +79 -0
- package/dist/cabinet/cabinet.js +162 -0
- package/dist/cabinet/data.d.ts +66 -0
- package/dist/cabinet/data.js +115 -0
- package/dist/cabinet/disciplines.d.ts +19 -0
- package/dist/cabinet/disciplines.js +87 -0
- package/dist/cabinet/index.d.ts +3 -2
- package/dist/cabinet/index.js +3 -2
- package/dist/cabinet/parsers.d.ts +37 -0
- package/dist/cabinet/parsers.js +284 -0
- package/dist/cabinet/scores.d.ts +12 -0
- package/dist/cabinet/scores.js +101 -0
- package/dist/cabinet/sesId.d.ts +10 -9
- package/dist/cabinet/sesId.js +40 -39
- package/dist/cabinet/session.d.ts +33 -0
- package/dist/cabinet/session.js +99 -0
- package/dist/cabinet/types.d.ts +2 -2
- package/dist/cabinet/utils.d.ts +8 -0
- package/dist/cabinet/utils.js +19 -0
- package/dist/cabinet/validSession.d.ts +8 -0
- package/dist/cabinet/validSession.js +29 -0
- package/dist/cabinetStudent/cabinetStudent.d.ts +87 -0
- package/dist/cabinetStudent/cabinetStudent.js +181 -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 +101 -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/constants.d.ts +49 -49
- package/dist/constants.js +55 -52
- package/dist/examples.d.ts +1 -1
- package/dist/examples.js +70 -15
- package/dist/index.d.ts +12 -10
- package/dist/index.js +12 -10
- package/dist/schedule.d.ts +62 -62
- package/dist/schedule.js +74 -68
- package/dist/types.d.ts +17 -16
- package/dist/types.js +0 -1
- package/package.json +35 -33
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 NIKITA KHORECHKO
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -2,19 +2,55 @@
|
|
|
2
2
|
|
|
3
3
|
API для **Житомирського державного університету імені Івана Франка**.
|
|
4
4
|
|
|
5
|
+
### СТАБІЛЬНЕ API:
|
|
6
|
+
|
|
5
7
|
Бібліотека надає програмний доступ до відкритих сервісів університету, зокрема:
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
- 📅 розклад занять студентів / викладачів / аудиторій
|
|
10
|
+
- 🚪 зайняті / вільні аудиторії
|
|
11
|
+
- 🏫 списки аудиторій
|
|
12
|
+
- 👥 списки груп
|
|
13
|
+
- 👨🏫 списки викладачів
|
|
14
|
+
- 🎯 TypeScript підтримка з повною типізацією
|
|
15
|
+
- 📱 Сумісність з Node.js та браузерними середовищами
|
|
16
|
+
|
|
17
|
+
### BETA API:
|
|
18
|
+
|
|
19
|
+
#### 📚 Кабінет студента (CabinetStudent)
|
|
20
|
+
|
|
21
|
+
- 🔐 Авторизація в кабінеті студента
|
|
22
|
+
- 📝 Отримання анкетних даних студента (ПІБ, дата народження, стать, контакти, факультет, спеціальність, група, форма навчання)
|
|
23
|
+
- 📖 Отримання дисциплін поточного семестру
|
|
24
|
+
- 📊 Отримання оцінок з окремого предмета (з деталізацією по заняттях, пропускам та фінальною оцінкою)
|
|
25
|
+
- 📈 Отримання оцінок з усіх дисциплін одночасно
|
|
26
|
+
- 🎓 Отримання оцінок за конкретний семестр (1 або 2)
|
|
27
|
+
- 🆔 Отримання ID студента в системі оцінювання
|
|
28
|
+
- 💾 Відновлення попередньої сесії без повторної авторизації
|
|
29
|
+
- ✅ Перевірка валідності поточної сесії
|
|
30
|
+
- 🔄 Автоматичне визначення поточного семестру
|
|
31
|
+
- 📦 Масове завантаження всіх даних (анкетні дані + дисципліни + оцінки)
|
|
32
|
+
- 📅 Інформація про розклад занять для кожної дисципліни (викладач, дата, час, тип заняття)
|
|
33
|
+
|
|
34
|
+
#### 👨🏫 Кабінет викладача (CabinetTeacher)
|
|
35
|
+
|
|
36
|
+
- 🔐 Авторизація в кабінеті викладача
|
|
37
|
+
- 📝 Отримання анкетних даних викладача (ПІБ, кафедра, години роботи, навантаження)
|
|
38
|
+
- 👥 Отримання списку всіх академічних груп викладача
|
|
39
|
+
- 📊 Деталізована інформація про кожну групу (назва, курс, семестр, спеціальність, факультет)
|
|
40
|
+
- 🔗 URL-посилання на журнали академічних груп
|
|
41
|
+
- 💼 Інформація про навчальне навантаження (години за штатом, за сумісництвом, загальне)
|
|
42
|
+
- 📆 Тривалість роботи в навчальному році
|
|
43
|
+
- 💾 Відновлення попередньої сесії без повторної авторизації
|
|
44
|
+
- ✅ Перевірка валідності поточної сесії
|
|
45
|
+
- 📦 Масове завантаження всіх даних (анкетні дані + академічні групи)
|
|
12
46
|
|
|
13
47
|
### 🔮 У планах
|
|
14
48
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
49
|
+
- стабільне API кабінету студента
|
|
50
|
+
- стабільне API кабінету викладача
|
|
51
|
+
- Отримання історії оцінок з усіх предметів
|
|
52
|
+
- Отримання айді всіх доступних студентів для окремого викладача
|
|
53
|
+
- Отримання всіх оцінок через кабінет викладача
|
|
18
54
|
|
|
19
55
|
> ⚠️ Проєкт **не є офіційним** API університету.
|
|
20
56
|
|
|
@@ -26,6 +62,12 @@ API для **Житомирського державного університ
|
|
|
26
62
|
npm install zdu-student-api
|
|
27
63
|
```
|
|
28
64
|
|
|
65
|
+
або
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pnpm install zdu-student-api
|
|
69
|
+
```
|
|
70
|
+
|
|
29
71
|
---
|
|
30
72
|
|
|
31
73
|
## Базове використання
|
|
@@ -42,11 +84,11 @@ schedule.rosText = true;
|
|
|
42
84
|
schedule.allStreamComponents = true;
|
|
43
85
|
|
|
44
86
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
87
|
+
const sc = await schedule.getSchedule();
|
|
88
|
+
console.log('Розклад:', sc);
|
|
47
89
|
} catch (err: any) {
|
|
48
|
-
|
|
49
|
-
|
|
90
|
+
console.error(err.message);
|
|
91
|
+
console.error(scheduleErrors[JSON.parse(err.message).errorcode]);
|
|
50
92
|
}
|
|
51
93
|
```
|
|
52
94
|
|
|
@@ -137,16 +179,198 @@ console.log(dops);
|
|
|
137
179
|
|
|
138
180
|
---
|
|
139
181
|
|
|
140
|
-
|
|
182
|
+
## Кабінет студента
|
|
183
|
+
|
|
184
|
+
### Базове використання
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import { CabinetStudent } from 'zdu-student-api';
|
|
188
|
+
|
|
189
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
190
|
+
|
|
191
|
+
// Авторизація
|
|
192
|
+
const authSuccess = await cabinet.auth();
|
|
193
|
+
if (authSuccess) {
|
|
194
|
+
console.log('Авторизовано успішно!');
|
|
195
|
+
console.log('Session ID:', cabinet.sesID);
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
### Отримання всіх даних студента
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
205
|
+
await cabinet.auth();
|
|
206
|
+
|
|
207
|
+
// Завантажити всі дані (анкетні дані, дисципліни, оцінки)
|
|
208
|
+
await cabinet.loadData();
|
|
209
|
+
|
|
210
|
+
console.log('Дані студента:', cabinet.data);
|
|
211
|
+
console.log('Дисципліни:', cabinet.disciplines);
|
|
212
|
+
console.log('Оцінки:', cabinet.allScores);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### Робота з дисциплінами та оцінками
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
221
|
+
await cabinet.auth();
|
|
222
|
+
|
|
223
|
+
// Отримати дисципліни поточного семестру
|
|
224
|
+
const disciplines = await cabinet.getDisciplines();
|
|
225
|
+
console.log('Дисципліни:', disciplines);
|
|
226
|
+
|
|
227
|
+
// Отримати оцінки з усіх дисциплін
|
|
228
|
+
const allScores = await cabinet.getAllScores();
|
|
229
|
+
console.log('Всі оцінки:', allScores);
|
|
230
|
+
|
|
231
|
+
// Отримати оцінки за конкретний семестр
|
|
232
|
+
const firstSemesterScores = await cabinet.getAllScores(1);
|
|
233
|
+
const secondSemesterScores = await cabinet.getAllScores(2);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### Відновлення сесії
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
242
|
+
|
|
243
|
+
// Відновити попередню сесію
|
|
244
|
+
const sesID = 'YOUR_SESSION_ID';
|
|
245
|
+
const sessGUID = 'YOUR_SESSION_GUID';
|
|
246
|
+
|
|
247
|
+
// Сесія активна тільки 24 години і стає застарілою як тільки відбувається нова авторизація викладача в кабінеті
|
|
248
|
+
const sessionValid = await cabinet.setSession(sesID, sessGUID);
|
|
249
|
+
if (sessionValid) {
|
|
250
|
+
console.log('Сесію відновлено!');
|
|
251
|
+
await cabinet.loadData();
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
### Перевірка валідності сесії
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
261
|
+
await cabinet.auth();
|
|
262
|
+
|
|
263
|
+
// Перевірити чи сесія ще дійсна
|
|
264
|
+
const isValid = await cabinet.isValidSession();
|
|
265
|
+
console.log('Сесія дійсна:', isValid);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
### Отримання ID студента
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
const cabinet = new CabinetStudent('ПРІЗВИЩЕ', 'ПАРОЛЬ');
|
|
274
|
+
await cabinet.auth();
|
|
275
|
+
|
|
276
|
+
const studentId = await cabinet.getId();
|
|
277
|
+
console.log('ID студента:', studentId);
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Кабінет викладача
|
|
283
|
+
|
|
284
|
+
### Базове використання
|
|
141
285
|
|
|
142
286
|
```ts
|
|
143
|
-
import {
|
|
287
|
+
import { CabinetTeacher } from 'zdu-student-api';
|
|
288
|
+
|
|
289
|
+
const cabinet = new CabinetTeacher('ЛОГІН', 'ПАРОЛЬ');
|
|
144
290
|
|
|
145
|
-
|
|
146
|
-
|
|
291
|
+
// Авторизація
|
|
292
|
+
const authSuccess = await cabinet.auth();
|
|
293
|
+
if (authSuccess) {
|
|
294
|
+
console.log('Авторизовано успішно!');
|
|
295
|
+
console.log('Session ID:', cabinet.sesID);
|
|
296
|
+
}
|
|
147
297
|
```
|
|
148
298
|
|
|
149
|
-
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
### Отримання даних викладача
|
|
302
|
+
|
|
303
|
+
```ts
|
|
304
|
+
const cabinet = new CabinetTeacher('ЛОГІН', 'ПАРОЛЬ');
|
|
305
|
+
await cabinet.auth();
|
|
306
|
+
|
|
307
|
+
// Отримати анкетні дані викладача
|
|
308
|
+
const data = await cabinet.getData();
|
|
309
|
+
console.log('ПІБ:', data.fullName);
|
|
310
|
+
console.log('Кафедра:', data.department);
|
|
311
|
+
console.log('Навантаження:', data.totalWorkload);
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
### Робота з академічними групами
|
|
317
|
+
|
|
318
|
+
```ts
|
|
319
|
+
const cabinet = new CabinetTeacher('ЛОГІН', 'ПАРОЛЬ');
|
|
320
|
+
await cabinet.auth();
|
|
321
|
+
|
|
322
|
+
// Отримати всі академічні групи
|
|
323
|
+
const groups = await cabinet.getAcademicGroups();
|
|
324
|
+
console.log('Академічні групи:', groups);
|
|
325
|
+
|
|
326
|
+
// Інформація зберігається в об'єкті
|
|
327
|
+
console.log('Групи викладача:', cabinet.academicGroups);
|
|
328
|
+
|
|
329
|
+
// Приклад даних групи:
|
|
330
|
+
// {
|
|
331
|
+
// name: '46Бд-Комп',
|
|
332
|
+
// semester: 1,
|
|
333
|
+
// encodedName: '46%C1%E4-%CA%EE%EC%EF',
|
|
334
|
+
// course: 4,
|
|
335
|
+
// specialty: '122 Комп`ютерні науки (Д_Б 2022-2023 н.р.)',
|
|
336
|
+
// faculty: 'Фізико-математичний факультет',
|
|
337
|
+
// teacherId: '1466',
|
|
338
|
+
// journalUrl: './teachers.cgi?sesID={sesID}&n=1&grp=46%C1%E4-%CA%EE%EC%EF&teacher=1466'
|
|
339
|
+
// },
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
### Отримання всіх даних викладача
|
|
345
|
+
|
|
346
|
+
```ts
|
|
347
|
+
const cabinet = new CabinetTeacher('ЛОГІН', 'ПАРОЛЬ');
|
|
348
|
+
await cabinet.auth();
|
|
349
|
+
|
|
350
|
+
// Завантажити всі дані (анкетні дані + академічні групи)
|
|
351
|
+
await cabinet.loadData();
|
|
352
|
+
|
|
353
|
+
console.log('Дані викладача:', cabinet.data);
|
|
354
|
+
console.log('Академічні групи:', cabinet.academicGroups);
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
### Відновлення сесії викладача
|
|
360
|
+
|
|
361
|
+
```ts
|
|
362
|
+
const cabinet = new CabinetTeacher('ЛОГІН', 'ПАРОЛЬ');
|
|
363
|
+
|
|
364
|
+
// Відновити попередню сесію
|
|
365
|
+
const sesID = 'YOUR_SESSION_ID';
|
|
366
|
+
const sessGUID = 'YOUR_SESSION_GUID';
|
|
367
|
+
|
|
368
|
+
const sessionValid = await cabinet.setSession(sesID, sessGUID);
|
|
369
|
+
if (sessionValid) {
|
|
370
|
+
console.log('Сесію відновлено!');
|
|
371
|
+
await cabinet.loadData();
|
|
372
|
+
}
|
|
373
|
+
```
|
|
150
374
|
|
|
151
375
|
---
|
|
152
376
|
|
|
@@ -159,4 +383,4 @@ console.log(sessionId);
|
|
|
159
383
|
|
|
160
384
|
## Ліцензія
|
|
161
385
|
|
|
162
|
-
MIT ©
|
|
386
|
+
MIT © 2026
|
package/dist/audience.d.ts
CHANGED
|
@@ -5,64 +5,64 @@ import { AudienceRoom, Blocks } from './types.js';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class Audience {
|
|
7
7
|
/**
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
* Назва корпусу
|
|
9
|
+
*/
|
|
10
10
|
blockName?: Blocks;
|
|
11
11
|
/**
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
* Номер пари
|
|
13
|
+
*/
|
|
14
14
|
lesson: number;
|
|
15
15
|
/**
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
* Тип аудиторій який є в даному корпусі
|
|
17
|
+
*/
|
|
18
18
|
roomType?: string;
|
|
19
19
|
/**
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
* Кількість місць не менше ніж
|
|
21
|
+
*/
|
|
22
22
|
size_min?: number;
|
|
23
23
|
/**
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
* Кількість місць не більше ніж
|
|
25
|
+
*/
|
|
26
26
|
size_max?: number;
|
|
27
27
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
* Дата аудиторії
|
|
29
|
+
*/
|
|
30
30
|
roomsDate: Date;
|
|
31
31
|
/**
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
* Наявніть доп. обладнання типу 1, 2, 3, 4, 5, 6, 7, 8
|
|
33
|
+
*/
|
|
34
34
|
dops: number[];
|
|
35
35
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
36
|
+
* Повертає список аудиторій
|
|
37
|
+
*
|
|
38
|
+
* @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* import { Audience } from "./audience.ts";
|
|
43
|
+
* const audience = new Audience();
|
|
44
|
+
* try {
|
|
45
|
+
* const audiences = await audience.getAudience();
|
|
46
|
+
* console.log("Аудиторії:", audiences); // Поверне список аудиторій
|
|
47
|
+
* } catch (err: any) {
|
|
48
|
+
* console.error(err.message);
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* У `err.message` може повертатися простий текст помилки,
|
|
54
|
+
* або об’єкт у форматі:
|
|
55
|
+
* ```JSON
|
|
56
|
+
* {
|
|
57
|
+
* "error_message": "Текст помилки",
|
|
58
|
+
* "errorcode": "Код помилки"
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* Де:
|
|
63
|
+
* - `error_message` - текст помилки відповідно до {@link scheduleErrors}
|
|
64
|
+
* - `errorcode` - код помилки відповідно до {@link scheduleErrors}
|
|
65
|
+
*/
|
|
66
66
|
getAudience(): Promise<AudienceRoom[]>;
|
|
67
67
|
private encodeCP1251;
|
|
68
68
|
}
|
package/dist/audience.js
CHANGED
|
@@ -6,72 +6,72 @@ import fetch from 'cross-fetch';
|
|
|
6
6
|
*/
|
|
7
7
|
export class Audience {
|
|
8
8
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
* Назва корпусу
|
|
10
|
+
*/
|
|
11
11
|
blockName;
|
|
12
12
|
/**
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
* Номер пари
|
|
14
|
+
*/
|
|
15
15
|
lesson = 1;
|
|
16
16
|
/**
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
* Тип аудиторій який є в даному корпусі
|
|
18
|
+
*/
|
|
19
19
|
roomType;
|
|
20
20
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
* Кількість місць не менше ніж
|
|
22
|
+
*/
|
|
23
23
|
size_min;
|
|
24
24
|
/**
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
* Кількість місць не більше ніж
|
|
26
|
+
*/
|
|
27
27
|
size_max;
|
|
28
28
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
* Дата аудиторії
|
|
30
|
+
*/
|
|
31
31
|
roomsDate = new Date();
|
|
32
32
|
/**
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
* Наявніть доп. обладнання типу 1, 2, 3, 4, 5, 6, 7, 8
|
|
34
|
+
*/
|
|
35
35
|
dops = [];
|
|
36
36
|
/**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
37
|
+
* Повертає список аудиторій
|
|
38
|
+
*
|
|
39
|
+
* @throws {Error} Якщо виникають проблеми з запитом або дані некоректні.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { Audience } from "./audience.ts";
|
|
44
|
+
* const audience = new Audience();
|
|
45
|
+
* try {
|
|
46
|
+
* const audiences = await audience.getAudience();
|
|
47
|
+
* console.log("Аудиторії:", audiences); // Поверне список аудиторій
|
|
48
|
+
* } catch (err: any) {
|
|
49
|
+
* console.error(err.message);
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* У `err.message` може повертатися простий текст помилки,
|
|
55
|
+
* або об’єкт у форматі:
|
|
56
|
+
* ```JSON
|
|
57
|
+
* {
|
|
58
|
+
* "error_message": "Текст помилки",
|
|
59
|
+
* "errorcode": "Код помилки"
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* Де:
|
|
64
|
+
* - `error_message` - текст помилки відповідно до {@link scheduleErrors}
|
|
65
|
+
* - `errorcode` - код помилки відповідно до {@link scheduleErrors}
|
|
66
|
+
*/
|
|
67
67
|
async getAudience() {
|
|
68
68
|
const date = this.roomsDate.toLocaleDateString('uk-UA', {
|
|
69
69
|
day: '2-digit',
|
|
70
70
|
month: '2-digit',
|
|
71
|
-
year: 'numeric'
|
|
71
|
+
year: 'numeric',
|
|
72
72
|
});
|
|
73
73
|
let dops = '';
|
|
74
|
-
this.dops.forEach(dop => {
|
|
74
|
+
this.dops.forEach((dop) => {
|
|
75
75
|
dops += `&dop_${dop}=yes`;
|
|
76
76
|
});
|
|
77
77
|
const response = await fetch(`https://dekanat.zu.edu.ua/cgi-bin/timetable_export.cgi?req_type=free_rooms_list&&block_name=${this.blockName !== undefined ? this.encodeCP1251(this.blockName) : ''}&size_min=${this.size_min !== undefined ? this.size_min : ''}&size_max=${this.size_max !== undefined ? this.size_max : ''}&room_type=${this.roomType !== undefined ? this.encodeCP1251(this.roomType) : ''}&begin_date=${date}&lesson=${this.lesson}${dops}&req_format=json&coding_mode=UTF8&bs=%D1%F4%EE%F0%EC%F3%E2%E0%F2%E8+%E7%E0%EF%E8%F2`);
|
|
@@ -79,12 +79,14 @@ export class Audience {
|
|
|
79
79
|
throw new Error(`HTTP error ${response.status}: ${response.statusText}`);
|
|
80
80
|
const data = await response.json();
|
|
81
81
|
if (data.psrozklad_export.code !== '0') {
|
|
82
|
-
throw new Error(JSON.stringify(data.psrozklad_export.error) ||
|
|
82
|
+
throw new Error(JSON.stringify(data.psrozklad_export.error) || 'Unknown error');
|
|
83
83
|
}
|
|
84
84
|
return data.psrozklad_export.free_rooms.rooms;
|
|
85
85
|
}
|
|
86
86
|
encodeCP1251(str) {
|
|
87
87
|
const buf = iconv.encode(str, 'win1251');
|
|
88
|
-
return Array.from(buf)
|
|
88
|
+
return Array.from(buf)
|
|
89
|
+
.map((b) => '%' + b.toString(16).toUpperCase().padStart(2, '0'))
|
|
90
|
+
.join('');
|
|
89
91
|
}
|
|
90
92
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Discipline, Disciplines, Data, Scores } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Клас кабінету студента
|
|
4
|
+
* @category Cabinet
|
|
5
|
+
*/
|
|
6
|
+
export declare class Cabinet {
|
|
7
|
+
/**
|
|
8
|
+
* Прізвище користувача
|
|
9
|
+
*/
|
|
10
|
+
login: string;
|
|
11
|
+
/**
|
|
12
|
+
* Пароль від кабінету студента
|
|
13
|
+
*/
|
|
14
|
+
password: string;
|
|
15
|
+
/**
|
|
16
|
+
* ID сесії користувача
|
|
17
|
+
*/
|
|
18
|
+
sesID?: string;
|
|
19
|
+
/**
|
|
20
|
+
* GUID сесії з cookie
|
|
21
|
+
*/
|
|
22
|
+
sessGUID?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Семестр для пошуку оцінок (0 - перший, 1 - другий)
|
|
25
|
+
*/
|
|
26
|
+
semester: 0 | 1;
|
|
27
|
+
/**
|
|
28
|
+
* Список дисциплін {@link Discipline}
|
|
29
|
+
*/
|
|
30
|
+
disciplines: Discipline[];
|
|
31
|
+
/**
|
|
32
|
+
* Данні студента {@link Data}
|
|
33
|
+
*/
|
|
34
|
+
data?: Data;
|
|
35
|
+
/**
|
|
36
|
+
* Оціки з усіх предметів {@link Scores}
|
|
37
|
+
*/
|
|
38
|
+
allScores?: Scores[];
|
|
39
|
+
/**
|
|
40
|
+
* Конструктор
|
|
41
|
+
* @param login - Прізвище користувача
|
|
42
|
+
* @param password - Пароль
|
|
43
|
+
*/
|
|
44
|
+
constructor(login: string, password: string);
|
|
45
|
+
/**
|
|
46
|
+
* Авторизація
|
|
47
|
+
*/
|
|
48
|
+
auth(login?: string, password?: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Базове значення семестру
|
|
51
|
+
*/
|
|
52
|
+
private setSemester;
|
|
53
|
+
/**
|
|
54
|
+
* Отримання всіх данних
|
|
55
|
+
*/
|
|
56
|
+
loadData(): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Відновлення сесії
|
|
59
|
+
*/
|
|
60
|
+
setSession(sesID: string, sessGUID: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* Перевірка валідності сесії
|
|
63
|
+
*/
|
|
64
|
+
isValidSession(): Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* Отримати дисципліни поточного семестру студента
|
|
67
|
+
* @returns Масив дисциплін {@link Disciplines}
|
|
68
|
+
*/
|
|
69
|
+
getDisciplines(): Promise<Disciplines>;
|
|
70
|
+
/**
|
|
71
|
+
* Отримати анкетні данні студента
|
|
72
|
+
* @returns Об'єкт {@link ata}
|
|
73
|
+
*/
|
|
74
|
+
getData(): Promise<Data>;
|
|
75
|
+
/**
|
|
76
|
+
* Отримати оцінки з всіх предметів
|
|
77
|
+
*/
|
|
78
|
+
getAllScores(semester?: 0 | 1): Promise<Scores[]>;
|
|
79
|
+
}
|