From a35f91e57adbb07d4d73a4495982a0ce74c14475 Mon Sep 17 00:00:00 2001 From: kozhilya Date: Fri, 7 Mar 2025 14:52:59 +0400 Subject: [PATCH] init --- .gitignore | 1 + 1.txt | 1014 +++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 32 ++ settings.json | 11 + structure.py | 201 ++++++++++ util.py | 75 ++++ 6 files changed, 1334 insertions(+) create mode 100644 .gitignore create mode 100644 1.txt create mode 100644 main.py create mode 100644 settings.json create mode 100644 structure.py create mode 100644 util.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/1.txt b/1.txt new file mode 100644 index 0000000..dc211af --- /dev/null +++ b/1.txt @@ -0,0 +1,1014 @@ +==== Payload ==== + +name: Физика [Костишко Б.М.] (08:00 9.3.2025) +desc: Встреча создана средствами API (Copyright © 2023 Kravenrus) +startAt: 2025-03-09T08:00:00.000+04:00 +endAt: 2025-03-09T09:20:00.000+04:00 +stateAnonymous: true +stateSessionHalls: false +stateLobby: false +stateSip: false +stateAutoRecording: true +stateAudioPolicy: false +stateVideoPolicy: false +stateScreenSharePolicy: false +pinCode: false + + +==== Respronse ==== +{ + "createdRoom": { + "roomName": "1741338986", + "title": "\u0424\u0438\u0437\u0438\u043a\u0430 [\u041a\u043e\u0441\u0442\u0438\u0448\u043a\u043e \u0411.\u041c.] (08:00 9.3.2025)", + "description": "\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API (Copyright \u00a9 2023 Kravenrus)", + "sessionHalls": [], + "enableSessionHall": false, + "disableHallsMoves": false, + "enableLobby": false, + "stageConferenceId": "1741338986.stage_97349bec2dc46c9b0daf425a32370e447392edf4bac05174a8d31e546027ee02", + "moderators": [ + { + "userType": "normal", + "login": "880c31ad-a521-4261-b853-789df2869508", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0422\u043e\u0447\u043a\u0430 \u043a\u0438\u043f\u0435\u043d\u0438\u044f", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "880c31ad-a521-4261-b853-789df2869508", + "post": "", + "avatarUrl": "\/api\/file\/TAYRZRK0oOWtoY6VoN5Lpp7byOkpGZWS", + "profileUrl": "https:\/\/ulsu.ru\/ru\/", + "hasMobilePhone": true, + "mobilePhone": "79021216032", + "hasInnerPhone": false, + "innerPhone": "", + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "93440047-acf4-4073-a36f-1037b762ff95", + "hasEmail": true, + "email": null, + "firstname": "\u041a\u0438\u0440\u0438\u043b\u043b", + "surname": "\u0417\u0432\u044f\u0433\u0438\u043d", + "patronymic": "\u0410\u043b\u0435\u043a\u0441\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "93440047-acf4-4073-a36f-1037b762ff95", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79374521576", + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440", + "surname": "\u0420\u0430\u0433\u0438\u043d\u043e\u0432", + "patronymic": "\u0410\u043d\u0434\u0440\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79279820060", + "hasInnerPhone": false, + "innerPhone": "", + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "hasEmail": true, + "email": null, + "firstname": "\u041c\u0430\u043a\u0441\u0438\u043c", + "surname": "\u0413\u0440\u0438\u0448\u0438\u043d", + "patronymic": "\u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79021216032", + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043d\u0442\u043e\u043d", + "surname": "\u041a\u0430\u0440\u0430\u0432\u0430\u043d\u043d\u043e\u0432", + "patronymic": "\u0412\u0438\u043a\u0442\u043e\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79084918820", + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "hasEmail": true, + "email": null, + "firstname": "\u0414\u0430\u043d\u0438\u0438\u043b", + "surname": "\u0421\u0430\u0432\u0435\u043b\u044c\u0435\u0432", + "patronymic": "\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79377570239", + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "2 \u043a\u043e\u0440\u043f\u0443\u0441 40 \u0430\u0443\u0434", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": "", + "hasInnerPhone": false, + "innerPhone": "", + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "hasEmail": true, + "email": null, + "firstname": "\u0418\u0432\u0430\u043d", + "surname": "\u0414\u043e\u0440\u0430\u0448\u0435\u0432", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": "", + "hasInnerPhone": false, + "innerPhone": "", + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "hasEmail": true, + "email": null, + "firstname": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "post": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "avatarUrl": "\/api\/file\/IGgV34q46iSfCEFP3eP4D7hUE7cOhB68", + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": "79935826032", + "hasInnerPhone": false, + "innerPhone": "", + "avatarInfo": null, + "status": "unknown", + "removed": false + } + ], + "anonymousModerators": [], + "allowAnonymous": true, + "anonymousAccessExpirationDate": "2025-03-09T05:20:00Z", + "audioPolicy": "disabled", + "useSsrcRewriting": false, + "videoPolicy": "disabled", + "screenSharePolicy": "disabled", + "securityType": "none", + "pinCode": null, + "isModerator": true, + "conferenceId": "1741338986_1c40af8cebdd92fba87d9be1e1dabf63e6a77e694fe83ece6a6f28246613b8f9", + "sipSettings": { + "sipNumber": "", + "sipUri": null, + "phoneNumbers": [] + }, + "usersOnline": 0, + "onlineUsers": [], + "roomStream": null, + "simultaneousTranslation": { + "enabled": false, + "languagePairs": [] + }, + "chatChannelSettings": { + "enabled": true, + "allowedUsers": null + } + }, + "createdMeeting": { + "calendarSource": "talk", + "busyType": "busy", + "subject": "\u0424\u0438\u0437\u0438\u043a\u0430 [\u041a\u043e\u0441\u0442\u0438\u0448\u043a\u043e \u0411.\u041c.] (08:00 9.3.2025)", + "description": "

\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API (Copyright \u00a9 2023 Kravenrus)<\/p>", + "start": "2025-03-09T04:00:00+00:00", + "end": "2025-03-09T05:20:00+00:00", + "location": null, + "organizer": { + "user": { + "userType": "normal", + "login": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "hasEmail": true, + "email": null, + "firstname": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "post": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "avatarUrl": "\/api\/file\/IGgV34q46iSfCEFP3eP4D7hUE7cOhB68", + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0423\u043b\u0413\u0423 \u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c ", + "mailbox": "ktalk.teacher@ulsu.ru", + "type": "user", + "status": "accepted" + }, + "requiredAttendees": [ + { + "user": { + "userType": "normal", + "login": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "hasEmail": true, + "email": null, + "firstname": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "post": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "avatarUrl": "\/api\/file\/IGgV34q46iSfCEFP3eP4D7hUE7cOhB68", + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0423\u043b\u0413\u0423 \u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c ", + "mailbox": "ktalk.teacher@ulsu.ru", + "type": "user", + "status": "accepted" + } + ], + "optionalAttendees": [ + { + "user": { + "userType": "normal", + "login": "880c31ad-a521-4261-b853-789df2869508", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0422\u043e\u0447\u043a\u0430 \u043a\u0438\u043f\u0435\u043d\u0438\u044f", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "880c31ad-a521-4261-b853-789df2869508", + "post": "", + "avatarUrl": "\/api\/file\/TAYRZRK0oOWtoY6VoN5Lpp7byOkpGZWS", + "profileUrl": "https:\/\/ulsu.ru\/ru\/", + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0422\u043e\u0447\u043a\u0430 \u043a\u0438\u043f\u0435\u043d\u0438\u044f \u0423\u043b\u0413\u0423 ", + "mailbox": "oto@ulsu.ru", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "93440047-acf4-4073-a36f-1037b762ff95", + "hasEmail": true, + "email": null, + "firstname": "\u041a\u0438\u0440\u0438\u043b\u043b", + "surname": "\u0417\u0432\u044f\u0433\u0438\u043d", + "patronymic": "\u0410\u043b\u0435\u043a\u0441\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "93440047-acf4-4073-a36f-1037b762ff95", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0417\u0432\u044f\u0433\u0438\u043d \u041a\u0438\u0440\u0438\u043b\u043b \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u0432\u0438\u0447", + "mailbox": "kirillzzzzzz@mail.ru", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440", + "surname": "\u0420\u0430\u0433\u0438\u043d\u043e\u0432", + "patronymic": "\u0410\u043d\u0434\u0440\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0420\u0430\u0433\u0438\u043d\u043e\u0432 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0410\u043d\u0434\u0440\u0435\u0435\u0432\u0438\u0447", + "mailbox": "raginovvv@gmail.com", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0423\u043b\u0413\u0423 \u0423\u043b\u0413\u0423 ", + "mailbox": "ostrecov1993@mail.ru", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "hasEmail": true, + "email": null, + "firstname": "\u041c\u0430\u043a\u0441\u0438\u043c", + "surname": "\u0413\u0440\u0438\u0448\u0438\u043d", + "patronymic": "\u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0413\u0440\u0438\u0448\u0438\u043d \u041c\u0430\u043a\u0441\u0438\u043c \u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0438\u0447", + "mailbox": "kravenrus@gmail.com", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043d\u0442\u043e\u043d", + "surname": "\u041a\u0430\u0440\u0430\u0432\u0430\u043d\u043d\u043e\u0432", + "patronymic": "\u0412\u0438\u043a\u0442\u043e\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u041a\u0430\u0440\u0430\u0432\u0430\u043d\u043d\u043e\u0432 \u0410\u043d\u0442\u043e\u043d \u0412\u0438\u043a\u0442\u043e\u0440\u043e\u0432\u0438\u0447", + "mailbox": "a.karavannov@gmail.com", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "hasEmail": true, + "email": null, + "firstname": "\u0414\u0430\u043d\u0438\u0438\u043b", + "surname": "\u0421\u0430\u0432\u0435\u043b\u044c\u0435\u0432", + "patronymic": "\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0421\u0430\u0432\u0435\u043b\u044c\u0435\u0432 \u0414\u0430\u043d\u0438\u0438\u043b \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u043e\u0432\u0438\u0447", + "mailbox": "daniilakiyama@gmail.com", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "2 \u043a\u043e\u0440\u043f\u0443\u0441 40 \u0430\u0443\u0434", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "2 \u043a\u043e\u0440\u043f\u0443\u0441 40 \u0430\u0443\u0434 \u0423\u043b\u0413\u0423 ", + "mailbox": "sistuk@inbox.ru", + "type": "user", + "status": "unknown" + }, + { + "user": { + "userType": "normal", + "login": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "hasEmail": true, + "email": null, + "firstname": "\u0418\u0432\u0430\u043d", + "surname": "\u0414\u043e\u0440\u0430\u0448\u0435\u0432", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + "name": "\u0414\u043e\u0440\u0430\u0448\u0435\u0432 \u0418\u0432\u0430\u043d ", + "mailbox": "greed.fofan@gmail.com", + "type": "user", + "status": "unknown" + } + ], + "isAllDayEvent": false, + "isCancelled": false, + "enableAutoRecording": true, + "onlineUsersCount": 0, + "onlineUsers": [], + "roomName": "1741338986", + "stream": null, + "room": { + "roomName": "1741338986", + "title": "\u0424\u0438\u0437\u0438\u043a\u0430 [\u041a\u043e\u0441\u0442\u0438\u0448\u043a\u043e \u0411.\u041c.] (08:00 9.3.2025)", + "description": "\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API (Copyright \u00a9 2023 Kravenrus)", + "sessionHalls": [], + "enableSessionHall": false, + "disableHallsMoves": false, + "enableLobby": false, + "stageConferenceId": null, + "moderators": [ + { + "userType": "normal", + "login": "880c31ad-a521-4261-b853-789df2869508", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0422\u043e\u0447\u043a\u0430 \u043a\u0438\u043f\u0435\u043d\u0438\u044f", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "880c31ad-a521-4261-b853-789df2869508", + "post": "", + "avatarUrl": "\/api\/file\/TAYRZRK0oOWtoY6VoN5Lpp7byOkpGZWS", + "profileUrl": "https:\/\/ulsu.ru\/ru\/", + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "93440047-acf4-4073-a36f-1037b762ff95", + "hasEmail": true, + "email": null, + "firstname": "\u041a\u0438\u0440\u0438\u043b\u043b", + "surname": "\u0417\u0432\u044f\u0433\u0438\u043d", + "patronymic": "\u0410\u043b\u0435\u043a\u0441\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "93440047-acf4-4073-a36f-1037b762ff95", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440", + "surname": "\u0420\u0430\u0433\u0438\u043d\u043e\u0432", + "patronymic": "\u0410\u043d\u0434\u0440\u0435\u0435\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "cc8110d7-0e2d-43b4-b107-23e16856abf5", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "e6911211-b7b9-403f-aff3-bc2b397513b5", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "hasEmail": true, + "email": null, + "firstname": "\u041c\u0430\u043a\u0441\u0438\u043c", + "surname": "\u0413\u0440\u0438\u0448\u0438\u043d", + "patronymic": "\u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "d8e60a5d-c726-4a8c-b5db-1d5ede8c90af", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "hasEmail": true, + "email": null, + "firstname": "\u0410\u043d\u0442\u043e\u043d", + "surname": "\u041a\u0430\u0440\u0430\u0432\u0430\u043d\u043d\u043e\u0432", + "patronymic": "\u0412\u0438\u043a\u0442\u043e\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "76e288bd-383b-4b15-8a6f-3bb5e048368c", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "hasEmail": true, + "email": null, + "firstname": "\u0414\u0430\u043d\u0438\u0438\u043b", + "surname": "\u0421\u0430\u0432\u0435\u043b\u044c\u0435\u0432", + "patronymic": "\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u043e\u0432\u0438\u0447", + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "2dd4a357-28e4-4a6a-a25a-4bb4f3aece4b", + "post": null, + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "hasEmail": true, + "email": null, + "firstname": "\u0423\u043b\u0413\u0423", + "surname": "2 \u043a\u043e\u0440\u043f\u0443\u0441 40 \u0430\u0443\u0434", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "9bb46587-09c5-45f0-8db7-a00a04c04484", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "hasEmail": true, + "email": null, + "firstname": "\u0418\u0432\u0430\u043d", + "surname": "\u0414\u043e\u0440\u0430\u0448\u0435\u0432", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "18f0481c-c21c-492e-a80c-d894a0b39a60", + "post": "", + "avatarUrl": null, + "profileUrl": null, + "hasMobilePhone": false, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + }, + { + "userType": "normal", + "login": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "hasEmail": true, + "email": null, + "firstname": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "surname": "\u0423\u043b\u0413\u0423", + "patronymic": null, + "department": null, + "disabled": false, + "deletedBySelf": false, + "features": null, + "roles": null, + "roleInfos": null, + "key": "1c0be116-2ebb-4cb2-8a05-6c2902cbbfa9", + "post": "\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c", + "avatarUrl": "\/api\/file\/IGgV34q46iSfCEFP3eP4D7hUE7cOhB68", + "profileUrl": null, + "hasMobilePhone": true, + "mobilePhone": null, + "hasInnerPhone": false, + "innerPhone": null, + "avatarInfo": null, + "status": "unknown", + "removed": false + } + ], + "anonymousModerators": [], + "allowAnonymous": true, + "anonymousAccessExpirationDate": "2025-03-10T05:20:00Z", + "audioPolicy": "disabled", + "useSsrcRewriting": false, + "videoPolicy": "disabled", + "screenSharePolicy": "disabled", + "securityType": "none", + "pinCode": null, + "isModerator": true, + "conferenceId": "1741338986_1c40af8cebdd92fba87d9be1e1dabf63e6a77e694fe83ece6a6f28246613b8f9", + "sipSettings": null, + "usersOnline": 0, + "onlineUsers": [], + "roomStream": null, + "simultaneousTranslation": { + "enabled": false, + "languagePairs": [] + }, + "chatChannelSettings": { + "enabled": true, + "allowedUsers": null + } + }, + "onlineMeetingUrl": null, + "externalMeeting": null, + "id": "67cab96feb7e74e2426d5f1b", + "isRecurring": false, + "recurrence": null, + "isPrivate": false + }, + "meetingData": { + "global": { + "space": "ulsu" + }, + "settings": { + "stateAnonymous": true, + "stateSessionHalls": false, + "stateLobby": false, + "stateSip": false, + "stateAutoRecording": true, + "stateAudioPolicy": "disabled", + "stateVideoPolicy": "disabled", + "stateScreenSharePolicy": "disabled", + "maxVideoQuality": "0", + "pinCode": "" + }, + "name": "\u0424\u0438\u0437\u0438\u043a\u0430 [\u041a\u043e\u0441\u0442\u0438\u0448\u043a\u043e \u0411.\u041c.] (08:00 9.3.2025)", + "desc": "\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API (Copyright \u00a9 2023 Kravenrus)", + "startAt": "2025-03-09T08:00:00.000+04:00", + "endAt": "2025-03-09T09:20:00.000+04:00", + "anonymousExpDate": "2025-03-09T09:20:00.000+04:00" + } +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..8a8a2cf --- /dev/null +++ b/main.py @@ -0,0 +1,32 @@ +from structure import Structure + +struct = Structure() + + + +week = struct.get_week_number() + +lectures = [] + +for worksheet in struct.get_worksheets(): + print(worksheet.title + "...") + range_name = struct.find_range(worksheet, week == 1) + part = struct.get_lectures_from_range(worksheet, range_name) + lectures.extend(part) + break + +print("===============================================================") + +for lecture in lectures: + + print(f"{lecture['auditorium']} / {lecture['day_of_week']} / #{lecture['pair_number']} / {lecture['lecture']} / {lecture['teacher']}") + + t = struct.find_teachers(lecture['teacher']) + l = struct.find_disciplines(lecture['lecture']) + + print("[Преподаватель] ", lecture['teacher'], "->", t) + print("[Предмет] ", lecture['lecture'], "->", l) + + lecture["start"], lecture["end"] = struct.get_lecture_time(lecture['day_of_week'], lecture['pair_number']) + + print(lecture) diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..661eb5f --- /dev/null +++ b/settings.json @@ -0,0 +1,11 @@ +{ + "first_week": "2025-01-06", + "week": [ + "ПН", + "ВТ", + "СР", + "ЧТ", + "ПТ", + "СБ" + ] +} \ No newline at end of file diff --git a/structure.py b/structure.py new file mode 100644 index 0000000..8345b57 --- /dev/null +++ b/structure.py @@ -0,0 +1,201 @@ +import gspread +import requests +from datetime import datetime, timedelta +import json +import random +import time +from util import find_in_list + +class Structure: + def __init__(self): + print("Подключение Google Sheets...", end=" ") + gc = gspread.oauth() + self.document = gc.open_by_key("1srtrHkwbTCfvxyeDtb_ca4RMx8W1kxgUQ-MAIumamVA") + print("Готово.") + + print("Загрузка настроек...", end=" ") + with open("settings.json", 'r', encoding='utf-8') as file: + self.settings = json.load(file) + print("Готово.") + + print("Загрузка списка преподавателей...", end=" ") + self.teachers = list(map(lambda a: a["name"], self.get_json("teachers"))) + print("Готово.") + + print("Загрузка списка дисциплин...", end=" ") + self.disciplines = list(map(lambda a: a["name"], self.get_json("disciplines"))) + print("Готово.") + + print("Загрузка расписания...", end=" ") + self.calls = self.get_json("calls", "schedule") + print("Готово.") + + print("Данные загружены!") + + + def get_json(self, type, sub_type=None) -> dict: + resp = requests.get(url="https://ulsu.ru/oto/api/production/internal/getEnterpriseData.php?type=" + type, params={}) + return resp.json()[type if sub_type is None else sub_type] + + def get_week_number(self, target_date=None): + if target_date is None: + target_date = self.get_monday() + + target_date = datetime.strptime(target_date, "%Y-%m-%d") + first_week_start_date = datetime.strptime(self.settings["first_week"], "%Y-%m-%d") + + return ((target_date - first_week_start_date).days // 7) % 2 + 1 + + def get_monday(self): + today = datetime.today() + days_until_next_monday = (7 - today.weekday()) % 7 + + # Если сегодня понедельник, days_until_next_monday будет 0, поэтому добавляем 7 дней + # if days_until_next_monday == 0: + # days_until_next_monday = 7 + + # Вычисляем дату следующего понедельника + next_monday = today + timedelta(days=days_until_next_monday) + + # Возвращаем дату в формате "%Y-%m-%d" + return next_monday.strftime("%Y-%m-%d") + + + def get_worksheets(self): + return self.document.worksheets() + + def get_document_data(self, worksheet, range_name=None, max_retries=5, initial_backoff=1, maximum_backoff=32): + retries = 0 + while retries < max_retries: + try: + if range_name is None: + return worksheet.get_all_values() + else: + return worksheet.get(range_name) + except gspread.exceptions.APIError as e: + retries += 1 + if retries == max_retries: + raise e + + backoff = min(initial_backoff * (2 ** (retries - 1)) + random.random(), maximum_backoff) + time.sleep(backoff) + + + def find_range(self, worksheet, first_week=True): + def check(cell): + if first_week: + return "1 неделя" in cell or "I неделя" in cell + else: + return "2 неделя" in cell or "II неделя" in cell + + all_values = self.get_document_data(worksheet) + + week_row = None + for i, row in enumerate(all_values): + for j, cell in enumerate(row): + if check(cell): + week_row = i + 1 + break + if week_row is not None: + break + + for row in range(week_row, worksheet.row_count + 1): + cell_value = all_values[row][0] + if cell_value == "1": + return "C%d:H%d" % (row+1, row+16) + + def get_lectures_from_range(self, worksheet, range_name): + # Получаем название аудитории из названия листа + auditorium = worksheet.title + + # Получаем данные из указанного диапазона + data = self.get_document_data(worksheet, range_name) + + + if len(data) < 2: + return [] + + # Дни недели + days_of_week = self.settings["week"] + day_order = {day: idx for idx, day in enumerate(days_of_week)} # Словарь для порядка дней + + # Список для хранения лекций + lectures = [] + + # Проходим по данным + for row_index in range(0, len(data), 2): # Шаг 2, так как каждая пара строк — это одна пара в расписании + lecture_row = data[row_index] # Строка с названием лекции + teacher_row = data[row_index + 1] # Строка с преподавателем + + # Номер пары + pair_number = (row_index // 2) + 1 + + # Проходим по дням недели (столбцам) + for col_index, (lecture, teacher) in enumerate(zip(lecture_row, teacher_row)): + if lecture.strip() and teacher.strip(): # Если есть и название лекции, и преподаватель + day_of_week = days_of_week[col_index] # День недели + lectures.append({ + "auditorium": auditorium, + "day_of_week": day_of_week, + "pair_number": pair_number, + "lecture": lecture, + "teacher": teacher + }) + + lectures = sorted(lectures, key=lambda x: (day_order[x["day_of_week"]], x["pair_number"])) + + return lectures + + + + def find_teachers(self, short_name): + return find_in_list(short_name, self.teachers) + + def find_disciplines(self, short_name): + return find_in_list(short_name, self.disciplines) + + + def get_lecture_time(self, day_of_week, pair_number, monday=None): + """ + Возвращает время начала и окончания лекции для указанного дня недели и номера пары. + + :param day_of_week: День недели (0 - понедельник, 1 - вторник, ..., 6 - воскресенье). + :param pair_number: Номер пары (начиная с 1). + :return: Кортеж (start_time, end_time) в формате "2025-03-09T08:00:00.000+04:00". + """ + if monday is None: + monday = datetime.strptime(self.get_monday(), "%Y-%m-%d") + + # Определяем дату для указанного дня недели + target_date = monday + timedelta(days=self.settings["week"].index(day_of_week)) + + # Находим время для указанной пары + for call in self.calls: + if call["lesson"] == pair_number: + start_time = datetime.fromisoformat("2025-01-01T" + call["start_time"]) + end_time = datetime.fromisoformat("2025-01-01T" + call["end_time"]) + + # Объединяем дату и время + start_datetime = target_date.replace( + hour=start_time.hour, + minute=start_time.minute, + second=start_time.second, + microsecond=0, + tzinfo=start_time.tzinfo + ) + end_datetime = target_date.replace( + hour=end_time.hour, + minute=end_time.minute, + second=end_time.second, + microsecond=0, + tzinfo=end_time.tzinfo + ) + + # Форматируем результат + return ( + start_datetime.isoformat(timespec="milliseconds"), + end_datetime.isoformat(timespec="milliseconds") + ) + + # Если пара не найдена + raise ValueError(f"Пара с номером {pair_number} не найдена.") \ No newline at end of file diff --git a/util.py b/util.py new file mode 100644 index 0000000..f764db3 --- /dev/null +++ b/util.py @@ -0,0 +1,75 @@ +import re +from functools import lru_cache + +@lru_cache(None) +def partialize(s): + s = s.lower().replace("ё", "е") + p = re.split("[. ]+", s) + return list(filter(lambda a: a, p)) + +def test_short(short: str, full: str) -> bool: + short_parts = partialize(short) + full_parts = partialize(full) + + for i in range(min(len(short_parts), len(full_parts))): + if not full_parts[i].startswith(short_parts[i]): + return False + + return True + +def find_in_list(short, full_list): + result = [] + + for item in full_list: + if test_short(short, item): + result.append(item) + + if len(result) == 1: + return result[0] + elif short in result: + return short + else: + return result + +def find_teacher_by_date(input_string, target_date): + """ + Ищет преподавателя по целевой дате в строке с датами и ФИО. + + :param input_string: Строка с датами и ФИО преподавателей. + :param target_date: Целевая дата в формате "%d.%m". + :return: ФИО преподавателя, связанного с целевой датой, или None, если дата не найдена. + """ + # Преобразуем целевую дату в формат "%d.%m" + target_date_str = target_date#.strftime("%d.%m") + + # Регулярное выражение для поиска дат в формате "%d.%m" + date_pattern = re.compile(r"\d{2}\.\d{2}") + + # Разделяем строку на строки по переносам + lines = re.split(" {5,}", input_string) + + # Проходим по каждой строке + for line in lines: + # Разделяем строку на даты и ФИО + parts = line.strip().split() + + # Извлекаем даты и ФИО + dates = [] + teacher = "" + for part in parts: + if date_pattern.fullmatch(part.replace(",", "")): # Убираем запятые, если они есть + dates.append(part.replace(",", "")) # Убираем запятые, если они есть + else: + teacher += part + " " # Собираем ФИО + + # Проверяем, есть ли целевая дата в списке дат + if target_date_str in dates: + return teacher.strip() # Возвращаем ФИО преподавателя + + # Если дата не найдена + return None + +if __name__ == "__main__": + # print(test_short("кузнецов в.н.", "Кузнецов Владимир Николаевич")) + s = " 10.02, 24.02, 10.03 Абдусалямова Л.И . 27.01, 07.04 Голубцова Т.С. 24.03 Шаршова С.М. " + print(find_teacher_by_date(s, "10.03")) \ No newline at end of file