Асинхронный клиент для «Сетевого города». Дневник, оценки, домашние задания, объявления — всё программно, без браузера.
Репозиторий: https://github.com/Vladcom4iiik/netschoolpy
Ключевые слова: Сетевой город, SGO, дневник, оценки, домашние задания, Госуслуги, ESIA, QR, API.
Документация к проекту находится в папке docs/. Для локального просмотра:
pip install mkdocs mkdocs-material
mkdocs servepip install netschoolpy
# Для отображения QR-кода в терминале (опционально):
pip install netschoolpy[qr]import asyncio
from netschoolpy import NetSchool
async def main():
async with NetSchool("https://sgo.example.ru") as ns:
await ns.login("ИвановИ", "password", "Школа №1")
diary = await ns.diary()
asyncio.run(main())Программный вход через Госуслуги — без браузера. Поддерживает SMS и TOTP (приложение-аутентификатор) в качестве второго фактора.
async with NetSchool("https://sgo.example.ru") as ns:
await ns.login_via_gosuslugi(
esia_login="+79001234567", # телефон, email или СНИЛС
esia_password="your_password",
)
diary = await ns.diary()При MFA код из SMS/TOTP будет запрошен через input().
Если esia_login / esia_password не указаны, они тоже запрашиваются через input().
Вход без ввода логина и пароля — нужно отсканировать QR-код в мобильном приложении «Госуслуги».
async def show_qr(qr_data: str):
"""qr_data — deep-link gosuslugi://auth/signed_token=..."""
import qrcode
qrcode.make(qr_data).save("qr.png")
print("Отсканируйте QR в приложении Госуслуги!")
async with NetSchool("https://sgo.example.ru") as ns:
await ns.login_via_gosuslugi_qr(
qr_callback=show_qr, # вызовется после генерации QR
qr_timeout=120, # секунд ожидания сканирования
)
diary = await ns.diary()qr_callback— async/sync функция, получает deep-linkgosuslugi://auth/signed_token=...для кодирования в QR. Если не указан — QR печатается в stdout (pip install qrcode).qr_timeout— таймаут ожидания сканирования (по-умолчанию 120 сек).
# По accessToken из localStorage SGO:
await ns.login_with_token("eyJ...")
# По session-store из localStorage:
await ns.login_with_session_store('{"accessToken":"eyJ..."}')
# По Cookie-строке из DevTools:
await ns.login_with_cookies("NSSESSIONID=abc123")После любого входа автоматически запускается фоновая задача, которая каждые 5 минут пингует сервер, не давая сессии истечь.
# Изменить интервал (в секундах):
ns.set_keepalive_interval(120) # каждые 2 минуты
# Отключить keep-alive:
ns.set_keepalive_interval(0)При вызове logout() keep-alive останавливается автоматически.
async with NetSchool("https://sgo.example.ru") as ns:
await ns.login(...)
diary = await ns.diary() # дневник (текущая неделя)
diary = await ns.diary(start, end) # дневник за период
overdue = await ns.overdue() # просроченные задания
announcements = await ns.announcements() # объявления
attachments = await ns.attachments(...) # вложения к заданию
info = await ns.school_info() # информация о школе
await ns.download_attachment(id, buffer) # скачать вложение
await ns.download_profile_picture(id, buf) # аватар пользователя© 2026 Vladcom4iiik. Все права защищены. Только личное, некоммерческое использование. Подробнее — LICENSE.