Skip to main content

Bakaláři API v3 client

Baka(láři)
   API
------
Bakapi

Jednoduchý klient k API Bakalářů pro Python.

Changelog

0.3.1 (2026-01-06)

  • Odstraněna závislost na odebraném modulu cgi ze standardní knihovny.

0.3 (2020-10-27)

  • Nyní jsou defaultně používané timezone-aware datetimes. Pokud je token_valid_until timezone-unaware, předpokládá se že je v UTC.

  • Přidán volitelný parametr to k domácím úkolům, viz změny v API dokumentaci

0.2 (2020-10-13)

  • Umožnění vytvoření klienta bez hesla, pouze z refresh_tokenu, případně spolu s access_tokenem a jeho platností.

  • Přidán volitelný parametr since k domácím úkolům. Když není zadán, tak Bakaláři vrátí jen úkoly z posledních dvou měsíců (viz API dokumentace)

0.1 (2020-04-09)

První release

Dokumentace

The code is the documentation. (Pls naučte mě někdo Sphinx)

Modul obsahuje hlavní třídu BakapiUser.

Konstruktor vždy vyžaduje dva keyword argumenty: url a username. Dále vyžaduje buď password, které je okamžitě použito k získání access_tokenu, nebo refresh_token, volitelně spolu s access_token a token_valid_until. Ty jsou uloženy a token je v případě potřeby obnoven až při prvním API požadavku.

Metody instancí BakapiUser

send_request(endpoint, method="GET", **kwargs) zkontroluje platnost access_tokenu, případně ho obnoví. Poté pošle požadavek s autorizačním headrem. kwargs jsou předány metodě requests.request.
Vrací requests.Response

query_api(endpoint, method="GET", **kwargs) volá send_request, pouze navíc ověřuje, že dostala validní JSON odpověď.
Vrací naparsovaná data jako dict

get_user_info() získá informace o uživateli, vrací dict tak, jak ho dostane od Bakalářů. Vypadá zhruba takto:

{'UserUID': '...',
 'Class': <trida>,
 'FullName': '...',
 'SchoolOrganizationName': '...',
 'SchoolType': None,
 'UserType': 'student',
 'UserTypeText': 'žák',
 'StudyYear': 1,
 'EnabledModules': [
    {'Module': '<nazev modulu>', 'Rights': ['...']}
  ],
 'SettingModules': {'...?'}
}

Známé názvy modulů:
Komens, Absence, Events, Marks, Timetable, Substitutions, Subjects, Homeworks, Gdpr

Třída je jednoduchý dict, vypadá takto:

{'Id': '...', 'Abbrev': '...', 'Name': '...'}

get_homework() získá seznam všech úkolů, vrací dict tak, jak ho dostane od Bakalářů. Přijímá volitelný parametr since, kterým lze omezit datum, od kterého jsou brané úkoly. Může být datetime.date, datetime.datetime nebo "YYYY-MM-DD". Odpověď vypadá takto:

{"Homeworks": [
    <ukoly>
  ]
}

Každý úkol vypadá zhruba takto:

{'ID': '...',
 'DateAward': '0001-01-01T00:00:00+01:00',
 'DateControl': None,
 'DateDone': '0001-01-01T00:00:00+01:00',
 'DateStart': '0001-01-01T00:00:00+01:00',
 'DateEnd': '0001-01-01T00:00:00+01:00',
 'Content': '...',
 'Notice': '',
 'Done': True,
 'Closed': True,
 'Electronic': False,
 'Hour': 6,
 'Class': <trida>,
 'Group': <skupina>,
 'Subject': <predmet>,
 'Teacher': <ucitel>,
 'Attachments': [<prilohy>]}

Třída, skupina, předmět a učitel jsou jednoduchý dict, viz třída u get_user_info()

Každá příloha vypadá takto:

{'Id': '...',
     'Name': '...',
     'Type': 'mime/type'}

get_received_komens_messages() získá seznam všech přijatých zpráv v Komens, vrací dict tak, jak ho dostane od Bakalářů. Vypadá takto:

{"Messages": [
    <zpravy>
  ]
}

Každá zpráva vypadá zhruba takto:

{'$type': 'GeneralMessage',
 'Id': '...',
 'Title': 'Obecná zpráva',
 'Text': '...',
 'SentDate': '0001-01-01T00:00:00+01:00',
 'Sender': <odesilatel>,
 'Attachments': [<prilohy>],
 'Read': True,
 'LifeTime': 'ToRead',
 'DateFrom': None,
 'DateTo': None,
 'Confirmed': True,
 'CanConfirm': False,
 'Type': 'OBECNA',
 'CanAnswer': True,
 'Hidden': False,
 'CanHide': True,
 'RelevantName': '...',
 'RelevantPersonType': 'teacher|administrator|...?'}

Odesílatel je jednoduchý dict, viz třída u get_user_info()

Pro formát přílohy viz úkoly.

download_attachment(attachment_id) stáhne přílohu s daným ID.
Vrací dvojici filename, urllib3.response.HTTPResponse

Dokumentace endpointů je průběžně vytvářena v repozitáři bakalari-api/bakalari-api-v3

Ukázky

Použití přímo

>>> from bakapi import BakapiUser
>>> u = BakapiUser(url="https://bakalari.skola.cz", username="jan_novak", password="honzikovoHeslo")
>>> u.get_homework()
{'Homeworks': [
  {'ID': 'ABCDEFG',
   '...': '...',
   'Attachments': [
     {'Id': 'EFAAAAG',
      'Name': 'Ukol.doc',
      'Type': 'application/msword'}]
  },
  '...'
]}
>>> with open("Ukol.doc", "wb") as fh:
...   fh.write(u.download_attachment("EFAAAAG")[1].read())

Použití jako Mixin

Knihovnu lze také použít jako Mixin do vaší vlastní classy uživatele.

Pokud například chcete ve své aplikaci ukládat data do databáze pomocí SQLAlchemy, vytvořte classu uživatel takto:

class User(BakapiUser, DeclarativeBase):
    id = Column(Integer, primary_key=True, autoincrement=True)

    # API používá tyto properties:
    url = Column(String)
    username = Column(String)
    token_valid_until = Column(DateTime)
    refresh_token = Column(String)
    access_token = Column(String)

    # další data, která používá vaše aplikace
    more_data = Column(String)

u = User(
    url="https://bakalari.skola.cz",
    username="jan_novak",
    password="honzikovoHeslo",
    more_data="neco"
)
  • Je důležité, aby BakapiUser byl v seznamu inherited classes první, protože on předává nepotřebné init parametry. Ostatní classy to ale dělat nemusí (a právě např. DeclarativeBase to nedělá).
  • Nemusíte definovat metodu __init__, ale pokud ji definujete, musí volat super().__init__()
  • Konstruktor příjímá povinné keyword argumenty (viz začátek). Cokoliv dalšího pošle dál

Pro pochopení doporučuji tuto StackOverflow answer

Release files for bakapi 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bakapi 0.3.1
File Size Uploaded
bakapi-0.3.1.tar.gz 7.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bakapi 0.3.1
File Interpreter ABI Platform
bakapi-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 14.0 kB

Release files / bakapi-0.3.1.tar.gz

Download URL bakapi-0.3.1.tar.gz
Size 7.0 kB
Tags Source
SHA-256 checksum
How to use checksums
55b893f2cb2f3c2fed0946bfa24b905a8b70c98d02e772118daa48a7e0559bf8
BLAKE2b-256 checksum
How to use checksums
e399d13c50cf8d0a839a2c3d1584ae244d793fb90872b366e1276f221e8e9f3d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.11

Release files / bakapi-0.3.1-py3-none-any.whl

Download URL bakapi-0.3.1-py3-none-any.whl
Size 7.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5fd933de9e3b731fd4d073d736c1daa19ef2d6c8c20b3d82a990c1252a404892
BLAKE2b-256 checksum
How to use checksums
17b62b0acf817e083515fa651912ff73fbad8f5cf3b99bc24340b379525e6002
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.11

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3

2 release files

0.2

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page