87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
import requests
|
|
from bs4 import BeautifulSoup
|
|
import datetime
|
|
|
|
from DB import UseDB
|
|
|
|
|
|
def fetch_timetable_data(group_id: int) -> BeautifulSoup | None:
|
|
base_url = "https://timetable.pallada.sibsau.ru/timetable/group/"
|
|
response = requests.get(f"{base_url}{group_id}")
|
|
if response.status_code == 200:
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
return soup
|
|
return None
|
|
|
|
|
|
def extract_week_data(soup: BeautifulSoup, shift: int) -> dict:
|
|
current_week_number = int(datetime.datetime.utcnow().isocalendar()[1])
|
|
current_day_of_week = datetime.datetime.now().weekday()
|
|
if current_day_of_week + shift > 6:
|
|
current_week_number += 1
|
|
week_tab_id = "week_1_tab" if current_week_number % 2 else "week_2_tab"
|
|
week_data: BeautifulSoup = soup.find('div', {"id": week_tab_id})
|
|
day_name = (
|
|
datetime.datetime.now() + datetime.timedelta(days=shift)
|
|
).strftime('%A').lower()
|
|
return parse_day_data(week_data.find('div', {"class": day_name}))
|
|
|
|
|
|
def parse_day_data(day_data: BeautifulSoup) -> dict:
|
|
schedule = {}
|
|
lines = day_data.find_all('div', {"class": "line"})
|
|
for line in lines:
|
|
time_slot = line.find('div', {"class": "hidden-xs"}).text.strip().replace("\n", "")
|
|
schedule[time_slot] = [
|
|
format_lesson_details(li.text)
|
|
for li in line.find_all('li')
|
|
]
|
|
return schedule
|
|
|
|
|
|
def format_lesson_details(lesson_text: str) -> str:
|
|
if "1 подгруппа" in lesson_text or "* подгруппа" in lesson_text:
|
|
lesson_text = f"⭐ {lesson_text} ⭐"
|
|
elif "2 подгруппа" in lesson_text:
|
|
lesson_text = f"☾ {lesson_text} ☾"
|
|
return lesson_text
|
|
|
|
|
|
def get_timetable_for_day(group_id: int, shift: int = 0) -> list[str]:
|
|
try:
|
|
soup = fetch_timetable_data(group_id)
|
|
if soup:
|
|
schedule = extract_week_data(soup, shift)
|
|
else:
|
|
schedule = get_data_in_database(group_id, shift)
|
|
formatted_schedule = []
|
|
for time_slot, lessons in schedule.items():
|
|
lessons_text = '\n'.join(lessons)
|
|
formatted_schedule.append(f"Время: {time_slot}\n{lessons_text}")
|
|
return formatted_schedule
|
|
except AttributeError:
|
|
return ["Похоже в этот день мы не учимся"]
|
|
|
|
|
|
def get_data_in_database(group_id: int, shift: int = 0) -> dict:
|
|
current_week_number = int(datetime.datetime.utcnow().isocalendar()[1])
|
|
current_day_of_week = datetime.datetime.now().weekday()
|
|
if current_day_of_week + shift > 6:
|
|
current_week_number += 1
|
|
week_tab_id = "week_1_tab" if current_week_number % 2 else "week_2_tab"
|
|
day_name = (
|
|
datetime.datetime.now() + datetime.timedelta(days=shift)
|
|
).strftime('%A').lower()
|
|
db = UseDB("saved_data")
|
|
response_data = db.find_document(
|
|
{
|
|
"group_id": group_id,
|
|
"week_tab_id": week_tab_id,
|
|
"day_name": day_name
|
|
}
|
|
)
|
|
response = {}
|
|
for i in response_data:
|
|
response[i["lesson_time"]] = [i["lesson_name"], i["lesson_author"], i["lesson_nav"]]
|
|
return response
|