Skip to main content

Библиотека для работы с API электронного журнала Кундолук (Кыргызстан), предоставляющая Python-интерфейс для получения расписания, оценок и учебной информации студентами.

Project description

Документация для библиотеки kundoluk_api

Обзор

Библиотека kundoluk_api предоставляет Python-интерфейс для взаимодействия с API электронного журнала "Кундолук" (Кыргызстан). Библиотека позволяет получать расписание уроков, оценки, домашние задания и другую информацию из системы.

⚠️ ВАЖНОЕ ПРИМЕЧАНИЕ: Данная библиотека работает только для аккаунтов студентов (учеников). Поддержка аккаунтов учителей и родителей не реализована.


Установка

pip install kundoluk_api

Быстрый старт

Аутентификация

from kundoluk_api.api import StudentClient

# Создание клиента
client = StudentClient(
    user_name="логин_ученика",  # Обычно ПИН
    password="пароль"
)

# Аутентификация
client.authenticate()

print(f"Аутентифицирован как: {client.account}")

Получение расписания

from datetime import date

# Расписание на сегодня
today = date.today()
schedule = client.get_daily_schedule(today)
if schedule.is_success and schedule.data:
    print(f"Расписание на {today}:")
    for lesson in schedule.data:
        print(f"  {lesson.start_time} - {lesson.subject}: {lesson.teacher}")

Основные компоненты

Клиенты

Библиотека предоставляет два типа клиентов:

  1. StudentClient - синхронный клиент
  2. AsyncStudentClient - асинхронный клиент (требует asyncio)

Модели данных

Все данные представлены в виде датаклассов:

  • KundolukAccount - информация об ученике
  • DailySchedule / DailySchedules - расписание на день/период
  • Lesson - информация об уроке
  • Mark / Marks - оценки
  • QuarterMark / QuarterMarks - четвертные оценки
  • И другие вспомогательные модели

Подробное использование

Инициализация клиента

from kundoluk_api.api import StudentClient, AsyncStudentClient

# Синхронный клиент
sync_client = StudentClient(
    user_name="username",
    password="password",
    user_agent="MyApp/1.0",  # Опционально
    device="android"  # Опционально
)

# Асинхронный клиент
async_client = AsyncStudentClient(
    user_name="username",
    password="password"
)

Получение информации об аккаунте

После аутентификации доступна информация об ученике:

client.authenticate()
account = client.account

print(f"ФИО: {account.last_name} {account.first_name} {account.mid_name}")
print(f"Класс: {account.grade}{account.letter}")
print(f"Школа: {account.school.name_ru}")
print(f"ПИН: {account.pin_as_string}")

Работа с расписанием

На конкретный день

from datetime import date, timedelta

# Сегодня
schedule_today = client.get_daily_schedule(date.today())

# На конкретную дату
schedule = client.get_daily_schedule("2024-01-15")  # Можно передавать строку

if schedule.is_success and schedule.data:
    for lesson in schedule.data:
        print(f"{lesson.lesson_number}. {lesson.subject} ({lesson.start_time}-{lesson.end_time})")
        if lesson.task:
            print(f"   ДЗ: {lesson.task.name}")
        if lesson.marks:
            print(f"   Оценки: {lesson.marks}")

За период

start_date = date(2024, 1, 1)
end_date = date(2024, 1, 31)

schedule_range = client.get_schedule_range(start_date, end_date)

if schedule_range.is_success:
    for daily_schedule in schedule_range.data:
        print(f"\n{date.strftime(daily_schedule.date, '%d.%m.%Y')}:")
        for lesson in daily_schedule.lessons[:3]:  # Первые 3 урока
            print(f"  - {lesson.subject}")

С оценками за четверть

# Получить расписание с оценками за 1 четверть
schedule_with_marks = client.get_schedule_with_marks(term=1, absent=False)

# Получить расписание с отметками об отсутствии за 2 четверть
schedule_with_absent = client.get_schedule_with_marks(term=2, absent=True)

Полное расписание (с оценками и ДЗ)

# На конкретный день (15 января)
full_day_schedule = client.get_full_schedule(day=15, month=1)

if full_day_schedule:
    for lesson in full_day_schedule:
        print(f"\n{lesson.subject}:")
        if lesson.marks:
            print(f"  Оценки: {', '.join(str(mark.value) for mark in lesson.marks)}")
        if lesson.task:
            print(f"  ДЗ: {lesson.task.name}")

За всю четверть

# Полное расписание за 3 четверть
full_term_schedule = client.get_full_schedule_term(term=3)

if full_term_schedule:
    for day in full_term_schedule:
        print(f"\n{day.date}:")
        for lesson in day.lessons:
            if lesson.marks:
                print(f"  {lesson.subject}: оценки - {lesson.marks}")

Четвертные оценки

quarter_marks = client.get_all_quarter_mark()

if quarter_marks.is_success:
    for result in quarter_marks.data:
        if result.quarter_marks:
            for mark in result.quarter_marks:
                print(f"{mark.subject_name_ru}: {mark.quarter} четв. - {mark.quarter_mark}")

Смена пароля

# Смена пароля с указанием текущего
result = client.change_password(
    new_password="новый_пароль",
    current_password="старый_пароль"
)

if result.is_success:
    print("Пароль успешно изменен")
    # Пароль автоматически обновляется в клиенте
else:
    print(f"Ошибка: {result.message}")

Асинхронное использование

import asyncio
from kundoluk_api.api import AsyncStudentClient

async def main():
    client = AsyncStudentClient(user_name="username", password="password")
    
    # Аутентификация
    await client.authenticate()
    
    # Получение расписания
    schedule = await client.get_daily_schedule("2024-01-15")
    
    # Параллельное получение данных
    marks_task = client.get_schedule_with_marks(1, absent=False)
    homework_task = client.get_schedule_with_homework(1)
    
    marks, homework = await asyncio.gather(marks_task, homework_task)
    
    # Работа с результатами...

asyncio.run(main())

Обработка ошибок

Типы исключений:

  • KundolukError - базовое исключение библиотеки
  • APIError - ошибки от сервера (4xx, 5xx)
  • ValidationError - неверный логин/пароль
  • AuthError - истекшая или отсутствующая сессия

Предупреждения (Warnings)

Библиотека использует систему предупреждений Python для обработки незначительных проблем:

Типы предупреждений:

  • ModelWarning - общие проблемы с моделями
  • DateParseWarning - ошибки парсинга дат
  • EnumMissingWarning - неизвестные значения в перечислениях
  • MissingFieldWarning - отсутствующие поля в JSON
  • И другие

Утилиты

Работа с учебным годом

from kundoluk_api.utils.school_year import get_quarter, get_date_in_school_year

# Определение четверти для даты
date_obj = date(2024, 10, 15)
quarter = get_quarter(date_obj)  # Вернет 1
quarter_nearest = get_quarter(date_obj, nearest=True)  # Вернет ближайшую четверть

# Получение даты в контексте учебного года
school_date = get_date_in_school_year(month=9, day=1)  # 1 сентября текущего учебного года

Перечисления (Enums)

Типы оценок

from kundoluk_api.enums import MarkType

mark_type = MarkType.GENERAL  # Обычная оценка
mark_type = MarkType.HOMEWORK  # Домашняя работа
mark_type = MarkType.CONTROL  # Контрольная работа

Типы посещаемости

from kundoluk_api.enums import AbsentType

absent_type = AbsentType.PRESENT  # Присутствовал
absent_type = AbsentType.ABSENT  # Отсутствовал
absent_type = AbsentType.LATE  # Опоздал

Примеры использования

Пример 1: Получение всех оценок за неделю

def get_week_grades(client, start_date):
    """Получить все оценки за неделю, начиная с start_date"""
    end_date = start_date + timedelta(days=6)
    
    schedule = client.get_schedule_range(start_date, end_date)
    if not schedule.is_success:
        return []
    
    all_marks = []
    for day_schedule in schedule.data:
        for lesson in day_schedule.lessons:
            if lesson.marks:
                for mark in lesson.marks:
                    all_marks.append({
                        'date': day_schedule.date,
                        'subject': lesson.subject.name_ru if lesson.subject else None,
                        'mark': mark.value,
                        'type': mark.mark_type.value
                    })
    
    return all_marks

Пример 2: Статистика посещаемости

def attendance_statistics(client, term):
    """Статистика посещаемости за четверть"""
    schedule = client.get_schedule_with_marks(term, absent=True)
    if not schedule.is_success:
        return None
    
    stats = {'present': 0, 'absent': 0, 'late': 0}
    
    for day_schedule in schedule.data:
        for lesson in day_schedule.lessons:
            if lesson.marks:
                for mark in lesson.marks:
                    if mark.absent_type == AbsentType.PRESENT:
                        stats['present'] += 1
                    elif mark.absent_type == AbsentType.ABSENT:
                        stats['absent'] += 1
                    elif mark.absent_type == AbsentType.LATE:
                        stats['late'] += 1
    
    return stats

Пример 3: Асинхронный сбор всех данных

async def get_all_student_data(client):
    """Получить все данные студента за текущий учебный год"""
    tasks = []
    
    # Сбор данных за все четверти
    for quarter in range(1, 5):
        tasks.append(client.get_full_schedule_term(quarter))
    
    tasks.append(client.get_all_quarter_mark())
    
    results = await asyncio.gather(*tasks, return_exceptions=True)
    
    # Обработка результатов...
    return results

Ограничения и известные проблемы

  1. Только для студентов: Библиотека не поддерживает аккаунты учителей и родителей.
  2. Текущий учебный год: Некоторые методы работают только в рамках текущего учебного года.
  3. Ограничения API: Библиотека зависит от ограничений оригинального API Кундолук.
  4. Неполные данные: Не все поля всегда заполнены сервером.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kundoluk_api-0.1.1.tar.gz (30.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kundoluk_api-0.1.1-py3-none-any.whl (42.2 kB view details)

Uploaded Python 3

File details

Details for the file kundoluk_api-0.1.1.tar.gz.

File metadata

  • Download URL: kundoluk_api-0.1.1.tar.gz
  • Upload date:
  • Size: 30.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for kundoluk_api-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b02423c5de63c7b8e6ba1785081b145984ed9614fb78598d751153ec0ed1d118
MD5 b3dacfb95a140d9fc6d5b5519b407dc9
BLAKE2b-256 02de07b0eb98ab291b6e5081fbc638953c9c050de754630f86a1f483fbaf00fd

See more details on using hashes here.

File details

Details for the file kundoluk_api-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: kundoluk_api-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 42.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for kundoluk_api-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6a4792487e0c523c2ddee055880f906a4a3fc449566392f5b0cb14c323b8d7d0
MD5 3b8ca5b978e4b1504447ef4c29dc326b
BLAKE2b-256 a7de5b29fdacbd7d87703cac0f2d48b2fd7dce962d1fd76aeb1356dcafc3be14

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page