No description
  • HTML 87.5%
  • JavaScript 12.5%
Find a file
2026-04-26 00:25:47 +04:00
.pi feat: Init commit 2026-04-26 00:25:47 +04:00
openspec feat: Init commit 2026-04-26 00:25:47 +04:00
src feat: Init commit 2026-04-26 00:25:47 +04:00
tests feat: Init commit 2026-04-26 00:25:47 +04:00
.gitignore feat: Init commit 2026-04-26 00:25:47 +04:00
example.html feat: Init commit 2026-04-26 00:25:47 +04:00
package-lock.json feat: Init commit 2026-04-26 00:25:47 +04:00
package.json feat: Init commit 2026-04-26 00:25:47 +04:00
prompt.md feat: Init commit 2026-04-26 00:25:47 +04:00
README.md feat: Init commit 2026-04-26 00:25:47 +04:00

Moodle grading scraper

Локальный Playwright-скрипт для сбора данных со страниц оценивания Moodle, выгрузки их в JSON и построения гистограммы распределения баллов по студентам.

Что умеет

  • открывает видимый браузер для ручной авторизации в Moodle;
  • сохраняет Playwright storageState в .auth/course-sgu.json;
  • обходит задания:
    • 79115-79119 → максимум 10
    • 79122-79132 → максимум 20
    • 79134-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

Что произойдёт:

  1. Откроется браузер Chromium.
  2. Ты вручную войдёшь в Moodle.
  3. Когда откроется страница оценивания, сессия будет сохранена в .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.