Давайте будем честными, никто не хочет, чтобы его заставляли что-то делать. Принуждение кого-либо к совершению определенного действия — это, по сути, жестокое обращение с людьми. Во-первых, идти против воли другого человека неправильно. Во-вторых, даже если оппозиции удастся навязать свою волю, результат будет более или менее ниже ожидаемого.

И именно поэтому я здесь, чтобы снизить ожидания от учреждения, которое создало проблемы в моей жизни: школы. Каждый раз, когда заканчивается семестр, школьный совет публикует опрос, содержащий более 100 вопросов об учителях. Не поймите меня неправильно, я не ненавижу опросы, особенно те, которые поощряют рост и развитие. Проблема в том, что это не так.

Этот школьный опрос состоит из задачи из 29 вопросов для каждого учителя с 5 переключателями на каждом вопросе. Естественно, студенты просто нажимали на один ответ и рассылали его по всему опросу. Я тоже так делал в первый год здесь. Однако в этом году все было иначе. Я решил написать код, который автоматизирует весь процесс. Подобно тому, как Алан Тьюринг создал компьютер для автоматизации процесса взлома кода.

Честно говоря, я пробовал это один раз. В первом семестре 11 класса я решил написать код и разбить опрос. Но я не был так силен духом, как сейчас. Закончив с первым учителем, я увидел еще одно препятствие во втором учителе, что привело к тому, что я уволился. Но этот семестр будет другим. На этот раз я выйду с конечным результатом, что я и сделал.

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

Пытаясь вспомнить, что я когда-то делал, я открыл опрос и просмотрел страницу. При осмотре страницы я открыл всю цепочку, которая ведет к id кнопки-переключателя. Я считаю, что это жизненно важная часть, потому что имя id приведет к автоматизации процесса из-за определенного шаблона, заложенного в именовании.

Найти id радиокнопки не так уж сложно, так как Chrome выделит части веб-сайта, включенные в навигационные крошки. Итак, все, что мне нужно было сделать, это убедиться, что навигационная цепочка, которую я собираюсь открыть, имеет переключатель внутри выделенной части.

Найдя переключатель id для моего учителя по имени AG, я проанализировал разницу между id первого вопроса и id последнего вопроса. Вот следующие id для моего первого учителя:

answer442398X1126X31822A1
answer442398X1126X31849A1

Причина, по которой я смелее своего первого учителя, заключается в том, что скоро нас ждут новые сюрпризы. Тем не менее, увидев эти два id , становится очевидным, что между первым и последним вопросом есть одно существенное различие. Разница заключается в двух числах перед A, то есть 22 и 49. Из этой информации можно сделать вывод, что числа 31822 и 31855 относятся к номеру вопроса.

Однако на этом анализ не заканчивается. Если бы в том же вопросе можно было увидеть другие переключатели, это выглядело бы примерно так:

answer442398X1126X31822A1
answer442398X1126X31822A2

Из-за этого также можно сделать вывод, что число после A относится к переключателю, на который есть ответ в этом вопросе. Если A1 значит отлично, то A2 значит хорошо (ответы в опросе).

Быстрый поиск в Google на веб-сайте покажет, что способ управления переключателями с помощью JavaScript заключается в следующем коде: document.getElementById(radioButton_id).checked = true;

Используя эти предпосылки, я смог записать следующий алгоритм:

И, к моему удивлению, это сработало! На все вопросы были даны ответы. И еще одна хорошая вещь: ответы случайны. Это связано с тем, что число после A происходит от переменной answer, которая находится в диапазоне от 1 до 5 (поскольку на один вопрос есть только 5 ответов.

Умное дополнение, которое я добавил в этот алгоритм, которое я пробовал не в первый раз, заключалось в проверке нулевого значения. Интересно, что при вводе Id могут быть некоторые ошибки, и консоль Chrome не загрузит код, если в коде есть ошибка. Итак, я убедился, что если в Id есть нулевое значение, означающее, что такого Id нет, то я пропущу и продолжу цикл.

У моего следующего учителя, мистера Р.С., был немного другой код, чем у моего первого учителя. Если бы мне нужно было сравнить id для первых вопросов обоих учителей, это выглядело бы так:

answer442398X1126X31822A1
answer442398X1160X32777A1

Из приведенного выше сравнения теперь есть два разных аспекта id. Очевидной частью является, очевидно, число за A, которое относится к номеру вопроса. Поскольку они разные, то делается вывод, что нет двух одинаковых вопросов, даже если они оба задают один и тот же вопрос. Разница в номере вопроса только доказывает это.

Еще одно отличие заключается в числе между двумя X. Поскольку для разных учителей они разные, я пришел к выводу, что это число должно представлять учителя, которого я оцениваю. Сначала я не думал, что это большая проблема, поэтому я пересмотрел код учителя в длинной строке, которая находится внутри final_id, а также изменил значение question_number и ограничивающее значение цикла for. Это выглядело примерно так:

Далее я испытал то же самое. Другой код учителя и другой номер вопроса. Как и в верхней части, я изменил строку внутри, значение question_number, а также предельное значение для цикла for. В целом мне нужно было изменить 3элемента, чтобы код заработал. Я сделал это для следующих 2 учителей в предстоящем списке.

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

Итак, что я сделал, так это попытался найти разницу между номером первого вопроса и номером второго вопроса. Причина, по которой я пытался найти разницу, заключалась в том, что мне не пришлось бы также менять лимит в цикле for. Это одной вещью меньше, чтобы изменить.

Найдя разницу между тремя учителями, я пришел к выводу, что разница всегда будет 28. Конечно. Если есть 29 вопросов, то первый вопрос, вероятно, будет иметь код 1, а последний вопрос будет иметь код 29. Разница между номером первого вопроса и последнего вопроса составляет 28. Тщательно, я все еще нахожу Интересно открыть 28 с научной точки зрения, с помощью известного научного метода.

Обнаружив, что мне нужно было только добавить 28 к исходному номеру вопроса, чтобы найти последний номер проблемы, я добавил следующие изменения в код, чтобы я мог, по крайней мере, уменьшить количество необходимых входных данных:

После ввода нескольких учителей я разозлился. Разозлился, потому что чувствовал, что этот код еще не раскрыл весь свой потенциал. Итак, я переделал все это и начал с нуля. На этот раз с полной автоматизацией.

При тестировании кода я заметил, что есть одна часть кода, которая всегда одинакова: answer442398 с X в качестве барьера. Следующее число после этого — 11xx, которое относится к коду учителя. Поскольку xx — единственное значение, которое будет меняться в коде, я решил добавить его как изменяющуюся переменную через цикл for. Имея все это в виду, я написал следующий код с нуля:

Но он разбился. Одна из причин, по которой он мог выйти из строя, заключается в том, что компьютер пробовал большие перестановки. Чтобы исключить возможность атаки, консоль ограничивает время выполнения кода несколькими миллисекундами.

Почти потерпев поражение, я попробовал другое решение. Я попытался ограничить больше возможных решений. Итак, в 11xx от xx вместо того, чтобы найти число от 00 до 99, я сначала попробовал от 20 до 60. И, к счастью, это, по-видимому, самое приятное место для всех, кроме одного учителя. Для того конкретного учителя, у которого код учителя 1161, я не стал рисковать и увеличил его до 80.

Другая альтернатива, которую я пробовал, была для номера проблемы. Вместо того, чтобы пробовать все числа от 30000 до 39999, что очень много, я увидел диапазон чисел до сих пор. В основном это от 31000 до 32999. Благодаря этой интуиции я решил ограничить поиск номера вопроса от указанной суммы до новой суммы, от 10000 до 29999. Я искал только меняющуюся часть, потому что это меньше, чем подсчет более 30000 комбинаций, что эффективно и экономит время.

Благодаря этому я смог произвести следующее:

который сработал. Я была так счастлива. Я был взволнован. восторженный. Наконец, мой хак сработал. И, чтобы ускорить процесс, я добавил небольшой симпатичный код, который сразу перейдет к следующему учителю:

document.getElementById("movenextbtn").click();

Итак, все, что мне нужно было сделать, это открыть консоль и вставить код. Он будет перебирать все возможные комбинации, исключать нулевые/неудачные/неправильные и, закончив, переходить к следующему учителю.

Чему я научился из всего этого? Немного:

  • Не останавливайтесь. Даже если код/данные кажутся невозможными для понимания, всегда есть закономерность
  • Всегда есть закономерность
  • Найдите ограничения для автоматизации процесса (компьютеры автоматизируют лучше)
  • Всегда есть закономерность