Небольшой модуль для работы с dnevnik.ru на python
Привет, Хабр. Это моя первая статья, и сегодня я хочу рассказать вам про свой первый модуль на 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 странице библиотеки