Загрузка данных


import asyncio
import aiohttp

LOGIN_URL = "https://msapi.top-academy.ru/api/v2/auth/login"

# Этот ключ пока считаем статичным для твоего колледжа/приложения,
# но лучше вытащить его из фронтенда (см. комментарий ниже)
APPLICATION_KEY = "6a56a5df2667e65aab73ce76d1dd737f7d1faef9c52e8b8c55ac75f565d8e8a6"

HEADERS = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "ru_RU, ru",
    "Content-Type": "application/json",
    "Origin": "https://journal.top-academy.ru",
    "Referer": "https://journal.top-academy.ru/",
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/128.0.0.0 Safari/537.36"
    ),
}


async def login(username: str, password: str) -> dict:
    payload = {
        "application_key": APPLICATION_KEY,
        "id_city": None,
        "username": username,
        "password": password,
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(LOGIN_URL, json=payload, headers=HEADERS) as resp:
            data = await resp.json()
            if resp.status != 200:
                raise RuntimeError(f"Login failed [{resp.status}]: {data}")
            return data


async def main():
    tokens = await login("Filip_dh03", "j27H8p0B")
    access_token = tokens["access_token"]
    refresh_token = tokens["refresh_token"]
    print("Успешный вход. user_role:", tokens.get("user_role"))
    print("Город:", tokens.get("city_data", {}).get("name"))
    # дальше access_token используешь как Bearer-токен для остальных запросов


if __name__ == "__main__":
    asyncio.run(main())