Привет, Хабр. Это моя первая статья, и сегодня я хочу рассказать вам про свой первый модуль на python. Называется он dnevnikru. Я написал его для облегчения работы с сайтом дневника. Работает модуль по принципу парсера, а не получает данные через API.
Идея написать такой модуль пришла мне после идеи написать телеграм бота для просмотра оценок и домашних заданий из Дневника.ру, так как смотреть успеваемость в телефоне с браузера неудобно, а функционал приложения платный.
Почему не через API?
Это сделано потому что Администрация Дневника отказывает разработчикам в предоставлении доступа к API.
Конечно, функционал этого модуля не сравнится с функционалом, предоставляемым официальным API. Я добавил только самые необходимые функции, о которых я расскажу ниже.
Как этим пользоваться?
Сам модуль находится в github репозитории. Также, я залил модуль на PyPi. Для установки нужно прописать в терминале:
pip install dnevnikru
Мануал по использованию и описание методов есть на wiki странице
Доступные методы
На момент написания статьи, я реализовал 5 методов.
homework - Получение домашних заданий за определенный период
marks - Получение оценок за четверть (семестр)
searchpeople - Поиск людей по Вашей школе (Среди учителей, учеников, работников. Можно искать по имени, классу, ФИО)
birthdays - Дни рождения людей из Вашей школы
week - Возвращает результаты недели (расписание, посещаемость, пройденные темы и так далее)
Подробнее о методах:
homework
Принимает 4 необязательных параметра
datefrom - С какой даты отобразить Д/З (в формате dd.mm.yyyy). По умолчанию стоит текущий день.
dateto - До какой даты отобразить Д/З (в формате dd.mm.yyyy). По умолчанию +10 дней к datefrom
days - На сколько дней вперед отобразить (Используется когда ни datefrom, ни dateto не указаны, либо когда указан только datefrom)
studyYear - учебный год (Используется для просмотра домашних заданий прошлых лет)
Возвращает словарь с домашними заданиями.
Пример
from dnevnikru import Dnevnik from pprint import pprint dn = Dnevnik(login="login", password="password") pprint(dn.homework(days=2))
{'homeworkCount': 9, 'homework': (('Алгебра и НА', 'п.1', 'Сегодня 2 урок'), ('Алгебра и НА', 'п.2', 'Сегодня 2 урок'), ('Геометрия', 'п.52', 'Сегодня 4 урок'), ('Инф. и ИКТ', '§1.8.3, с.92-94', 'Сегодня 5 урок'), ('Инф. и ИКТ', '§1.8.3, с.94-95', 'Сегодня 5 урок'), ('Алгебра и НА', 'п.2 № № 8, 11, 12,16,чет 19 (2)', '21 октября 2021 3 урок'), ('Геометрия', '№ 456 разобрать№ 455, 457, 462', '21 октября 2021 4 урок'), ('Рус. язык', 'Пар.79-80.Словарный диктант.Приложение 2.(абажур-алюминий).', '21 октября 2021 5 урок'), ('Род.язык', 'Итоговое по первому направлению!Сочинение!Принести черновик!', '21 октября 2021 6 урок'))}
marks
Принимает 2 необязательных параметра
index - Год обучения. По умолчанию вернется текущий год
period - Период. Если ничего не передать - вернется текущий период.
Возвращает кортеж списков с оценками, количеством пропусков, пропусков по болезни и вообще все данные, которые отображает таблица
Пример
from dnevnikru import Dnevnik from pprint import pprint dn = Dnevnik(login="login", password="password") pprint(dn.marks())
(['1', 'Алгебра и НА', '555', '0', '6', '3', '2', ''], ['2', 'Англ. язык', '555', '0', '6', '2', '4,5', ''], ['3', 'Биология', '', '0', '0', '0', '', ''], ['4', 'Геометрия', '555', '0', '4', '3', '4', ''], ['5', 'Инф. и ИКТ', '555', '0', '10', '6', '', ''], ['6', 'ИПД', '555', '0', '2', '1', '', ''], ['7', 'История', '555', '0', '3', '2', '3', ''], ['8', 'Литература', '555', '0', '15', '2', '', ''], ['9', 'ОБЖ', '555', '0', '1', '1', '5', ''], ['10', 'Реш. физ. задач', '555', '0', '2', '1', '', ''], ['11', 'Реш.задач по матем', '555', '0', '2', '1', '', ''], ['12', 'Род.язык', '555', '0', '1', '1', '', ''], ['13', 'Рус. язык', '555', '0', '2', '1', '4', ''], ['14', 'Физика', '555', '0', '14', '6', '3,5', ''], ['15', 'Физкультура', '555', '0', '8', '3', '', ''], ['16', 'Химия', '555', '0', '4', '1', '', ''])
Отметки находятся только во 2 элементе (Начиная с 0 элемента)
searchpeople
Принимает 3 необязательных параметра
group - Группа среди которой нужно искать людей. По умолчанию пустое значение, будет искать среди всех (all). Доступные группы - 'all', 'students', 'staff', 'director', 'management', 'teachers', 'administrators'
name - Поиск по имени. Можно вводить имя, фамилию, ФИО. Разные форматы.
grade - Поиск по классу. Опять же, можно использовать разные форматы. Например: "11Б", "8 Г", "9.1" - для тех, у кого в школе не буквы, а цифры.
Возвращает словарь с людьми
Пример
from dnevnikru import Dnevnik from pprint import pprint dairy = Dnevnik("login", "password") birthdays = dairy.birthdays(day=9, month=5)
{'peopleCount': 8, 'people': (('З***а Александра Сергеевна', 'Ученик'), ('К***в Александр Юрьевич', 'Родитель'), ('К***а Юлия Александровна', 'Ученик'), ('К***в Андрей Александрович', 'Родитель'), ('К***а Елена Александровна', 'Родитель'), ('С***я Ольга Александровна', 'Родитель'), ('С***а Александр Иванович', 'Ученик'), ('С***а Иван Александрович', 'Родитель'))}
Фамилии скрыл в целях конфиденциальности
birthdays
Принимает 3 необязательных параметра
day (int) - день (по умолчанию текущая дата)
month (int) - месяц
group - Группа среди которой нужно искать людей. По умолчанию пустое значение, будет искать среди всех (all). Доступные группы - 'all', 'students', 'staff', 'class'
Пример
from dnevnikru import Dnevnik from pprint import pprint dairy = Dnevnik("login", "password") birthdays = dairy.birthdays(day=9, month=5)
{'birthdaysCount': 3, 'birthdays': ('П***в Александр Павлович', 'К***а Софья Михайловна', 'П***в Ярослав Иванович')}
week
Позволяет получить результаты недели (информация берется от сюда http://dnevnik.ru/currentprogress/choose?userComeFromSelector=True)
Принимает 2 необязательных параметра:
info - тип результатов (Доступные типы - "themes", "attendance", "marks", "schedule", "homeworks") (По умолчанию schedule, т.е. расписание)
weeks - Сдвиг по неделям (По умолчанию 0, т.е. текущая неделя. Для прошедших недель используется отрицательное число)
Пример
from dnevnikru import Dnevnik from pprint import pprint dairy = Dnevnik("login", "password") schedule = dairy.week()
{'student': 'Владимир Путин, МБОУ СОШ № 1, 7-А, 2021 / 2022, с 18.10 по ' '24.10', 'schedule': {'понедельник': ('Реш. физ. задач', 'Англ. язык', 'Реш.задач по матем', 'Химия', 'Физика'), 'вторник': ('Физика', 'Физика', 'Литература', 'Литература', 'История', 'Физкультура'), 'среда': ('История', 'Алгебра и НА', 'Физкультура', 'Геометрия', 'Инф. и ИКТ', 'Инф. и ИКТ'), 'четверг': ('Физика', 'Физика', 'Алгебра и НА', 'Геометрия', 'Рус. язык', 'Род.язык'), 'пятница': ('Англ. язык', 'ИПД', 'Алгебра и НА', 'Алгебра и НА', 'Литература', 'Физкультура'), 'суббота': ('Физика', 'Англ. язык', 'ОБЖ', 'Инф. и ИКТ', 'Инф. и ИКТ'), 'воскресенье': ()}}
Итог
Для меня эта библиотека стала первым опытом написания «открытых» проектов, поэтому, если Вы обнаружили какие-то баги/некачественный код/ и прочее, что можно исправить - сообщайте. Я буду только рад улучшить свой проект. Всем удачи.
UPD: Библиотека периодически обновляется, поэтому актуальная информация доступна на wiki странице библиотеки