Обновления сентября 2025

This commit is contained in:
2025-10-08 10:24:08 +04:00
parent 4ef3e1d25f
commit 5022309848
7 changed files with 607 additions and 562 deletions
+1
View File
@@ -1,3 +1,4 @@
__pycache__ __pycache__
lecture.json lecture.json
result.txt result.txt
custom.txt
+9
View File
@@ -0,0 +1,9 @@
День недели
Номер пары
Название занятия
Преподаватель
ВТ
6
Обеспечение антитеррористической защищенности объектов здравоохранения Российской Федерации
Окутина Н Н
-24
View File
@@ -1,24 +0,0 @@
ВТ
2
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
Сергеева Юлия Валерьевна
ВТ
3
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
Сергеева Юлия Валерьевна
ПТ
2
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
Сергеева Юлия Валерьевна
ПТ
3
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
Сергеева Юлия Валерьевна
ПТ
4
Методика сохранения и укрепления традиционных российских духовно-нравственных ценностей и профилактики деструктивной идеологии
Сергеева Юлия Валерьевна
+53 -29
View File
@@ -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,46 +68,32 @@ 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/"
} }
) )
if response.status_code == 200: if response.status_code == 200:
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
View File
@@ -1,5 +1,5 @@
{ {
"first_week": "2025-01-06", "first_week": "2025-09-01",
"week": [ "week": [
"ПН", "ПН",
"ВТ", "ВТ",
@@ -10,6 +10,7 @@
], ],
"aliases": { "aliases": {
"Введение в НОК": "Введение в специальности Н.О.К.", "Введение в НОК": "Введение в специальности Н.О.К.",
"Проф.электив. Введение в специальность стоматология": "Предпрофессиональный электив. Введение в специальность Стоматология" "Проф.электив. Введение в специальность стоматология": "Предпрофессиональный электив. Введение в специальность Стоматология" ,
"Абделбаги Мохаммат абба нана": "Абделбаги Махаммат абба нана"
} }
} }
+41 -7
View File
@@ -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))