Обновления сентября 2025
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
__pycache__
|
__pycache__
|
||||||
lecture.json
|
lecture.json
|
||||||
result.txt
|
result.txt
|
||||||
|
custom.txt
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
День недели
|
||||||
|
Номер пары
|
||||||
|
Название занятия
|
||||||
|
Преподаватель
|
||||||
|
|
||||||
|
ВТ
|
||||||
|
6
|
||||||
|
Обеспечение антитеррористической защищенности объектов здравоохранения Российской Федерации
|
||||||
|
Окутина Н Н
|
||||||
-24
@@ -1,24 +0,0 @@
|
|||||||
ВТ
|
|
||||||
2
|
|
||||||
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
|
|
||||||
Сергеева Юлия Валерьевна
|
|
||||||
|
|
||||||
ВТ
|
|
||||||
3
|
|
||||||
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
|
|
||||||
Сергеева Юлия Валерьевна
|
|
||||||
|
|
||||||
ПТ
|
|
||||||
2
|
|
||||||
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
|
|
||||||
Сергеева Юлия Валерьевна
|
|
||||||
|
|
||||||
ПТ
|
|
||||||
3
|
|
||||||
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
|
|
||||||
Сергеева Юлия Валерьевна
|
|
||||||
|
|
||||||
ПТ
|
|
||||||
4
|
|
||||||
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
|
|
||||||
Сергеева Юлия Валерьевна
|
|
||||||
@@ -12,6 +12,44 @@ class Non200StatusCodeError(Exception):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.message}. Код статуса: {self.status_code}"
|
return f"{self.message}. Код статуса: {self.status_code}"
|
||||||
|
|
||||||
|
class ResultFileWriter:
|
||||||
|
def __init__(self, filename):
|
||||||
|
self.filename = filename
|
||||||
|
self.file = None
|
||||||
|
self.last_auditorium = ""
|
||||||
|
self.last_day_of_week = ""
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.file = open(self.filename, "w", encoding="utf-8")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
if self.file:
|
||||||
|
self.file.close()
|
||||||
|
|
||||||
|
def write_lecture(self, lecture, url):
|
||||||
|
"""Записывает информацию о лекции в файл"""
|
||||||
|
if lecture['auditorium'] != self.last_auditorium:
|
||||||
|
if self.last_auditorium != "":
|
||||||
|
self._write_line("\n========================\n")
|
||||||
|
self._write_line(lecture['auditorium'] + "\n")
|
||||||
|
self.last_auditorium = lecture['auditorium']
|
||||||
|
self.last_day_of_week = ""
|
||||||
|
|
||||||
|
if lecture['day_of_week'] != self.last_day_of_week:
|
||||||
|
prefix = f" {lecture['day_of_week']} "
|
||||||
|
self.last_day_of_week = lecture['day_of_week']
|
||||||
|
else:
|
||||||
|
prefix = " " * 6
|
||||||
|
|
||||||
|
self._write_line(f"{prefix} #{lecture['pair_number']} - {lecture['name']}\n")
|
||||||
|
self._write_line(" " * 12 + url + "\n")
|
||||||
|
|
||||||
|
def _write_line(self, line):
|
||||||
|
"""Вспомогательный метод для записи строки в файл"""
|
||||||
|
self.file.write(line)
|
||||||
|
self.file.flush() # Принудительно сбрасываем буфер
|
||||||
|
|
||||||
def do_request(name, start, end):
|
def do_request(name, start, end):
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
"https://ulsu.ru/oto/api/production/external/createKtalkMeeting.php",
|
"https://ulsu.ru/oto/api/production/external/createKtalkMeeting.php",
|
||||||
@@ -30,7 +68,7 @@ def do_request(name, start, end):
|
|||||||
"stateScreenSharePolicy": "false",
|
"stateScreenSharePolicy": "false",
|
||||||
"pinCode": "false"
|
"pinCode": "false"
|
||||||
},
|
},
|
||||||
headers={ \
|
headers={
|
||||||
"Referer": "https://ulsu.ru/oto/ktalk/"
|
"Referer": "https://ulsu.ru/oto/ktalk/"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -39,37 +77,23 @@ def do_request(name, start, end):
|
|||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
data = response.json()
|
data = response.json()
|
||||||
return f"https://{data['meetingData']['global']['space']}.ktalk.ru/{data['createdMeeting']['roomName']}"
|
return f"https://{data['meetingData']['global']['space']}.ktalk.ru/{data['createdMeeting']['roomName']}"
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise Non200StatusCodeError(response.status_code, "Ответ сервера: " + response.text)
|
raise Non200StatusCodeError(response.status_code, "Ответ сервера: " + response.text)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
lines = []
|
|
||||||
|
|
||||||
with open("lecture.json", "r", encoding="utf-8") as f:
|
with open("lecture.json", "r", encoding="utf-8") as f:
|
||||||
lectures = json.load(f)
|
lectures = json.load(f)
|
||||||
|
|
||||||
last_auditorium = ""
|
# Используем контекстный менеджер для работы с файлом
|
||||||
last_day_of_week = ""
|
with ResultFileWriter("result.txt") as writer:
|
||||||
|
|
||||||
for lecture in tqdm.tqdm(lectures):
|
for lecture in tqdm.tqdm(lectures):
|
||||||
|
try:
|
||||||
url = do_request(lecture['name'], lecture['start'], lecture['end'])
|
url = do_request(lecture['name'], lecture['start'], lecture['end'])
|
||||||
|
writer.write_lecture(lecture, url)
|
||||||
if lecture['auditorium'] != last_auditorium:
|
except Exception as e:
|
||||||
if last_auditorium != "":
|
# Записываем информацию об ошибке в файл
|
||||||
lines.append("\n========================\n")
|
error_line = f"\nОШИБКА при обработке лекции '{lecture['name']}': {str(e)}\n\n"
|
||||||
lines.append(lecture['auditorium'] + "\n")
|
writer._write_line(error_line)
|
||||||
last_auditorium = lecture['auditorium']
|
print(f"Произошла ошибка: {e}")
|
||||||
last_day_of_week = ""
|
# Продолжаем обработку следующих лекций
|
||||||
|
continue
|
||||||
if lecture['day_of_week'] != last_day_of_week:
|
|
||||||
prefix = f" {lecture['day_of_week']} "
|
|
||||||
last_day_of_week = lecture['day_of_week']
|
|
||||||
else:
|
|
||||||
prefix = " " * 6
|
|
||||||
|
|
||||||
lines.append(f"{prefix} #{lecture['pair_number']} - {lecture['name']}\n")
|
|
||||||
lines.append(" " * 12 + url + "\n")
|
|
||||||
|
|
||||||
with open("result.txt", "w", encoding="utf-8") as f:
|
|
||||||
f.writelines(lines)
|
|
||||||
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"first_week": "2025-01-06",
|
"first_week": "2025-09-01",
|
||||||
"week": [
|
"week": [
|
||||||
"ПН",
|
"ПН",
|
||||||
"ВТ",
|
"ВТ",
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
],
|
],
|
||||||
"aliases": {
|
"aliases": {
|
||||||
"Введение в НОК": "Введение в специальности Н.О.К.",
|
"Введение в НОК": "Введение в специальности Н.О.К.",
|
||||||
"Проф.электив. Введение в специальность стоматология": "Предпрофессиональный электив. Введение в специальность Стоматология"
|
"Проф.электив. Введение в специальность стоматология": "Предпрофессиональный электив. Введение в специальность Стоматология" ,
|
||||||
|
"Абделбаги Мохаммат абба нана": "Абделбаги Махаммат абба нана"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+41
-7
@@ -5,6 +5,7 @@ import json
|
|||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
|
import os
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
|
|
||||||
@lru_cache(None)
|
@lru_cache(None)
|
||||||
@@ -167,12 +168,13 @@ class Lecture:
|
|||||||
|
|
||||||
return self.select_variant(teacher, variants, True)
|
return self.select_variant(teacher, variants, True)
|
||||||
def process_lecture(self) -> str:
|
def process_lecture(self) -> str:
|
||||||
parts = re.split(" {5,}", self.input_lecture)
|
# parts = re.split(" {5,}", self.input_lecture)
|
||||||
|
lecture, _ = find_teacher_by_date(self.input_lecture, self.date)
|
||||||
|
|
||||||
if self.teacher_index < len(parts):
|
# if self.teacher_index < len(parts):
|
||||||
lecture = parts[self.teacher_index]
|
# lecture = parts[self.teacher_index]
|
||||||
else:
|
# else:
|
||||||
lecture = parts[0]
|
# lecture = parts[0]
|
||||||
|
|
||||||
if lecture in self.struct.settings["aliases"].keys():
|
if lecture in self.struct.settings["aliases"].keys():
|
||||||
lecture = self.struct.settings["aliases"][lecture]
|
lecture = self.struct.settings["aliases"][lecture]
|
||||||
@@ -228,8 +230,9 @@ class Lecture:
|
|||||||
class Structure(metaclass=Singleton):
|
class Structure(metaclass=Singleton):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
print("Подключение Google Sheets...", end=" ")
|
print("Подключение Google Sheets...", end=" ")
|
||||||
gc = gspread.oauth()
|
# gc = self.load_gspread()
|
||||||
self.document = gc.open_by_key("1srtrHkwbTCfvxyeDtb_ca4RMx8W1kxgUQ-MAIumamVA")
|
# self.document = gc.open_by_key("1srtrHkwbTCfvxyeDtb_ca4RMx8W1kxgUQ-MAIumamVA")
|
||||||
|
self.document = self.load_gspread()
|
||||||
print("Готово.")
|
print("Готово.")
|
||||||
|
|
||||||
print("Загрузка настроек...", end=" ")
|
print("Загрузка настроек...", end=" ")
|
||||||
@@ -254,6 +257,25 @@ class Structure(metaclass=Singleton):
|
|||||||
|
|
||||||
print("Данные загружены!")
|
print("Данные загружены!")
|
||||||
|
|
||||||
|
def load_gspread(self) -> gspread.Spreadsheet:
|
||||||
|
try:
|
||||||
|
gc = gspread.oauth()
|
||||||
|
except:
|
||||||
|
self.remove_auth_data()
|
||||||
|
gc = gspread.oauth()
|
||||||
|
|
||||||
|
try:
|
||||||
|
return gc.open_by_key("1srtrHkwbTCfvxyeDtb_ca4RMx8W1kxgUQ-MAIumamVA")
|
||||||
|
except:
|
||||||
|
self.remove_auth_data()
|
||||||
|
return gc.open_by_key("1srtrHkwbTCfvxyeDtb_ca4RMx8W1kxgUQ-MAIumamVA")
|
||||||
|
|
||||||
|
def remove_auth_data(self):
|
||||||
|
appdata_path = os.environ.get('APPDATA')
|
||||||
|
file_path = os.path.join(appdata_path, "gspread", "authorized_user.json")
|
||||||
|
os.remove(file_path)
|
||||||
|
|
||||||
|
|
||||||
def get_json(self, type, sub_type=None) -> dict:
|
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={})
|
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]
|
return resp.json()[type if sub_type is None else sub_type]
|
||||||
@@ -336,6 +358,14 @@ class Structure(metaclass=Singleton):
|
|||||||
# Проходим по данным
|
# Проходим по данным
|
||||||
for row_index in range(0, len(data), 2): # Шаг 2, так как каждая пара строк — это одна пара в расписании
|
for row_index in range(0, len(data), 2): # Шаг 2, так как каждая пара строк — это одна пара в расписании
|
||||||
lecture_row = data[row_index] # Строка с названием лекции
|
lecture_row = data[row_index] # Строка с названием лекции
|
||||||
|
|
||||||
|
if row_index + 1 == len(data):
|
||||||
|
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
||||||
|
print(f"Ошибка с данными, row_index = {row_index + 1} не существует!")
|
||||||
|
print(data)
|
||||||
|
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
||||||
|
continue
|
||||||
|
|
||||||
teacher_row = data[row_index + 1] # Строка с преподавателем
|
teacher_row = data[row_index + 1] # Строка с преподавателем
|
||||||
|
|
||||||
# Номер пары
|
# Номер пары
|
||||||
@@ -345,6 +375,10 @@ class Structure(metaclass=Singleton):
|
|||||||
for col_index, (lecture, teacher) in enumerate(zip(lecture_row, teacher_row)):
|
for col_index, (lecture, teacher) in enumerate(zip(lecture_row, teacher_row)):
|
||||||
if lecture.strip() and teacher.strip(): # Если есть и название лекции, и преподаватель
|
if lecture.strip() and teacher.strip(): # Если есть и название лекции, и преподаватель
|
||||||
day_of_week = days_of_week[col_index] # День недели
|
day_of_week = days_of_week[col_index] # День недели
|
||||||
|
|
||||||
|
# if col_index > 3:
|
||||||
|
# continue
|
||||||
|
|
||||||
lectures.append(Lecture(auditorium, day_of_week, pair_number, lecture, teacher))
|
lectures.append(Lecture(auditorium, day_of_week, pair_number, lecture, teacher))
|
||||||
|
|
||||||
lectures = sorted(lectures, key=lambda x: (x.day_of_week_i, x.pair_number))
|
lectures = sorted(lectures, key=lambda x: (x.day_of_week_i, x.pair_number))
|
||||||
|
|||||||
Reference in New Issue
Block a user