Новый метод работы аддона для Решу ЕГЭ

UPD: больше не работает прикол

В прошлом посте мы рассмотрели краткую историю создания аддона “Инструменты и Ответы для Решу ЕГЭ” и старый принцип его работы, теперь пришло время рассказать какие изменения он претерпел и как работает его новая версия.

Перемены в жизни аддона “Инструменты и Ответы для Решу ЕГЭ”

Где-то 2 месяца назад я получил e-mail:

вот это письмо

и сразу принялся проверять работоспособность аддона, как оказалось, он и вправду перестал работать. Сайт стал возвращать ошибки, если поля “stat_id” (уникальный номер запущенного теста, присваиваемый при каждой новой попытке) и “test_id” (номер теста) не соответствовали значениям, которые ожидал сайт.

Сначала я просто сдался, убрал аддон из магазина и уже смирился с тем, что прийдется снова гуглить ответы, но спустя несколько недель меня настиг неожиданный порыв мотивации и я начал искать новые интересные свойства API сайта.

Поиски новых методов

Я обследовал огромную часть сайта, узнал немало интересных вещей о принципах его работы (отдельный пост про приколы API будет потом) и выделил для себя три возможных пути получения ответов:

  1. Найти способ преобразовывать ID заданий внутри теста в обычные ID заданий (если открыть код элемента в тесте, то можно заметить, что тела заданий имеют уникальные ID, которые не соответствуют их другим ID, с помощью которых можно было бы искать сами задания и ответы к ним)
  2. Обнаружить способ клонировать контрольные работы или же задания из них себе с раздел “Учителю”
  3. Придумать еще один метод, который заставил бы сайт отдать верные ответы при решении контрольной работы

Третий путь, скорее всего, был наиболее сложным, ведь там я даже не задумывался о том, что пустые работы, которые бы отправлялись с целью получения ответов, были бы видны учителю. Была возможность создать бота, который бы так отсылал работы и возвращал ответы, но я решил подольше остановиться на 2 первых способах.

Много дней ушло на исследования первого способа, но я так и не смог найти ни одного метода, который бы мог превратить ID заданий внутри теста в их обычный ID, поэтому я занялся вторым путём, который, к сожалению, тоже ни к чему не привел.

Но потом я заметил, что каждый раз после завершения ввода ответа внутри теста на сервер отправляется запрос:

1
https://ege.sdamgia.ru/test?a=save_part&ajax=1

внутри которого есть форма:

1
stat_id={{stat_id}}&name=answer_{{номер задания}}_{{его вторичный id}}&answer[]={{ответ}}

Это снова настроило меня на первый путь, ведь наверняка эти запросы что-то куда-то сохраняют, а, возможно, оттуда можно будет увидеть и оригинальный ID вопроса.

stat_id и раздел статистики

Я решил обратить внимание на раздел “Моя статистика”. Я не надеялся на многое, ведь те запросы, о которых я говорил ранее, в первую очередь сохраняли данные для удобства пользователя - если тест перезагрузить, эти сохраненные ответы вернутся туда, куда вы их ранее записывали. Но факт того, что задание считалось как “неверно выполненное” в каталоге после этого запроса (это я заметил списывая варианты вручную), давал немного уверенности в том, что эти вопросы сохраняются на сайте куда-то еще.

Итак, “stat_id” используется как раз для загрузки ранее сделанных заданий перезагруженного варианта, но присутствие там слова “stat” указывает также на его связь с разделом статистики. Эта мысль помогла мне заметить, что все варианты, которые я мог посмотреть в статистике, загружались по запросу, который брал в аргументы тот самый “stat_id”.

Тесты, которые еще не решены, не высвечиваются в меню статистики, а контрольные работы там можно смотреть только после проверки учителя, но если взять “stat_id” из теста, который решается в данный момент, и подать запрос самостоятельно, то можно получить список всех заданий варианта с их исходными ID, но только те, с которыми был отправлен запрос сохранения и только в том порядке, в котором эти запросы были отправлены.

Новый принцип работы аддона

Теперь аддон запускает в контексте самой страницы теста скрипт, который с помощью Fetch API создает запросы на сохранение заданий (с заданиями части C понадобилось поработать отдельно, они не хотели сохранятся сразу как части A и B), потом просто открывает страницу статистики для значения “stat_id” данного теста. Новый режим авторешения даже не открывает лишних вкладок, решает все прямо внутри страницы.

Исходный код тут: https://github.com/hyperClink/new-tools-for-reshu-ege

Бонус: как списать (почти) любой вариант самостоятельно

  1. По порядку в каждое поле для ответа введите символ, не забудьте после этого выйти из данного поля (в каком порядке были введены ответы, в таком и будут даны верные ответы на вопросы)
  2. Перезагрузите страницу
  3. Выберите “Продолжить начатый вариант” из появившегося окна
  4. Скопируйте значение “continue” из адресной строки
  5. В разделе “Моя статистика” нажмите на любую из дат выполненных вами тестов (если таковых нет, просто отошлите пустой тренировочный вариант)
  6. Замените значение “test” на скопированное ранее значение “continue”
  7. Готово! Все задания с решениями перед вами.