Добрый день, айтишники. Где-то год назад примерно, я учился в автошколе, где каждый день решали тесты на сайте пдд. И чисто ради интереса, немного покопавшись, я написал скрипт, который выдает правильный ответ. Подробнее Сдаем экзамен ПДД на сайте без ошибок. Сейчас поговорим о недавно возникшей подобной ситуации. Один человек попросил меня посмотреть, есть ли такая недоработка на сайте Free tests creation and online testing - Master Test. Получив данные для входа, я начал внимательно изучать, как и куда ответы загружаются. В качестве теста, я взял предмет "МСС. Метрология 3 семестр", который я точно не знал. Начинаем тест и видим
Вроде все ок, обычный тест, согласны? Смотрим лог любимого расширения для хрома - Web Sniffer, и видим
Устанавливаем фильтр, чтобы лог отображал только POST запросы, которые отправлялись на master-test.net
Всего лишь один запрос, отлично. Смотрим параметры, которые передавались в запросе и адрес сайта, куда направлялся запрос
Запрос принимает, скрипт находящийся по этому адресу - https://master-test.net/ru/site/json/load-quiz.proxy. Видим что передавался всего лишь один параметр id со значением 104943. Эти цифры что-то напоминают, правда? Вернемся на тест и посмотрим на адресную строку
Посмотрите на конец адреса сайта, разве не одни и те же цифры? Значит id - это номер теста. Скорее всего, так сайт получает все данные для теста. Идем на любой REST API TEST и отправляем POST запрос. Я буду пользоваться самым удобным, Послать POST/GET запрос - Инструментарий Web и JavaScript разработчика. В качестве адреса указываем https://master-test.net/ru/site/json/load-quiz.proxy, выбираем метод POST, и заполняем поле для параметров.
id - служит как идентификатор теста, 104943 - номер теста. Отправляем запрос, и видим
Как мы видим, в ответ получаем JSON данные, только вместо обычного текста, мы получили юникод (UNICODE). Идем на сервис для декодирования юникода в текст.
Вставляем весь полученный текст из запроса в поле и нажимаем Convert.
Теперь легче читается, правда? Это JSON объект со всеми вопросами и ответами на них. Теперь нам нужно написать скрипт, который будет отправлять POST запрос на адрес с нужными параметрами, а также парсить JSON из полученного ответа. Если будем разбирать каждый шаг, то из статьи получится целая книга, поэтому моменты написания скрипта, я не буду показывать. В результате, у меня получился примерно такой скрипт
Заходим на тест, открываем консоль и вставляем скрипт, и конечно же жмем Enter
Отлично, как мы видим, скрипт работает. Попробуем ответить на все вопросы, каждый раз запуская скрипт. Итог
Скрипт помог нам решить тест со 100% правильными ответами. Мы конечно же могли бы, чтобы в вопросе подсвечивался правильный ответ, но мы ведь любим когда все просто, правда? Скрипт работает абсолютно на любом тесте с данного сайта. С вами был GoodSmile, на этом мы с вами прощаемся, до скорых встреч!
Устанавливаем фильтр, чтобы лог отображал только POST запросы, которые отправлялись на master-test.net
id - служит как идентификатор теста, 104943 - номер теста. Отправляем запрос, и видим
Вставляем весь полученный текст из запроса в поле и нажимаем Convert.
JavaScript:
var testNum = location.pathname.replace('/ru/quiz/testing/id/quiz/testing/id/', '');
var url = "https://master-test.net/ru/site/json/load-quiz.proxy"
var quizNum = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].href;
var quizTitle = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].children[0].getAttribute('qtip');
quizNum = quizNum.replace('https://master-test.net/ru/quiz/testing/id/quiz/testing/id/'+testNum+'#quiz_item_', '');
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var json = JSON.parse(xhr.responseText);
for ($i=0; $i < json.data.items.length; $i++)
{
if (quizTitle==json.data.items[$i].data.title)
alert(json.data.items[$i].data.correct_answer);
}
}
};
var data = 'id=' + testNum ;
xhr.send(data);
Заходим на тест, открываем консоль и вставляем скрипт, и конечно же жмем Enter
P.S. ВСЯ ИНФОРМАЦИЯ ПРЕДОСТАВЛЕНА ИСКЛЮЧИТЕЛЬНО В ОЗНАКОМИТЕЛЬНЫХ И ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ