- HTML 87.5%
- JavaScript 12.5%
| .pi | ||
| openspec | ||
| src | ||
| tests | ||
| .gitignore | ||
| example.html | ||
| package-lock.json | ||
| package.json | ||
| prompt.md | ||
| README.md | ||
Moodle grading scraper
Локальный Playwright-скрипт для сбора данных со страниц оценивания Moodle, выгрузки их в JSON и построения гистограммы распределения баллов по студентам.
Что умеет
- открывает видимый браузер для ручной авторизации в Moodle;
- сохраняет Playwright
storageStateв.auth/course-sgu.json; - обходит задания:
79115-79119→ максимум1079122-79132→ максимум2079134-79138→ максимум30
- обходит страницы
0-6; - парсит только страницу списка оценивания
action=grading; - нормализует записи в статусы
1-10; - считает эффективный балл по правилам просрочки;
- помечает эвристические случаи со 2-й попыткой;
- пишет итог в
output/moodle-grades.json; - строит HTML-гистограмму частот по суммарным баллам студентов в
output/moodle-grades-histogram.html.
Установка
npm install
npx playwright install chromium
Первый вход в Moodle
npm run auth
Что произойдёт:
- Откроется браузер Chromium.
- Ты вручную войдёшь в Moodle.
- Когда откроется страница оценивания, сессия будет сохранена в
.auth/course-sgu.json.
Сбор данных
npm run scrape
Дополнительно:
npm run scrape -- --force-login
npm run scrape -- --output output/custom.json
Проверка парсера на локальном примере
npm run scrape:fixture
npm test
Построение гистограммы баллов
После того как output/moodle-grades.json уже создан, можно построить отдельный HTML-отчёт:
npm run histogram
Дополнительно:
npm run histogram -- --input output/moodle-grades.json
npm run histogram -- --output output/moodle-grades-histogram.html
npm run histogram -- --input output/custom.json --output output/custom-report.html
По умолчанию скрипт:
- читает
output/moodle-grades.json; - пишет отчёт в
output/moodle-grades-histogram.html.
Смысл двух серий столбцов:
- верхние столбцы — сколько студентов уже имеют данную сумму баллов сейчас;
- нижние столбцы — сколько студентов могли бы иметь эту сумму, если бы все уже отправленные ими задания были зачтены правильно, но штрафы за просрочку сохранились.
Текущая сумма считается по формуле:
actualScore = max(0, min(moodleGradeValue ?? 0, effectiveScore))
Потенциальная сумма считается по формуле:
potentialScore = effectiveScore
То есть неотправленные задания не дают баллов ни в текущей, ни в потенциальной серии, а уже отправленные задания учитываются с тем же штрафом за просрочку, который был рассчитан при нормализации.
Формат результата
JSON содержит:
- метаданные запуска;
- summary по статусам и заданиям;
- массив
recordsс сырыми полями Moodle и нормализованными полями.
Для каждой записи экспортируются, в частности:
assignmentId,pageNumber,maxScore;studentId,studentName,email;statusSignals,statusText,latenessText;attemptNumber;moodleGradeValue,finalGradeText;statusId,statusDescription;visibleLatenessBand,appliedLatenessBand;effectiveScore;confidence,normalizationNote.
Эвристика для 2-й попытки
Так как детальная страница студента не используется, правило про вторую попытку определяется только по странице списка.
Сейчас применяется такое правило:
- если есть
attemptNumber > 0, - есть признак просрочки,
- и Moodle уже показывает полный максимальный балл,
то запись считается известным исключением: первая попытка была вовремя, позже дали доработку, и штраф за позднюю вторую попытку не применяется.
Во всех остальных случаях со 2-й попыткой запись помечается как heuristic.