Давайте будем честными, никто не хочет, чтобы его заставляли что-то делать. Принуждение кого-либо к совершению определенного действия — это, по сути, жестокое обращение с людьми. Во-первых, идти против воли другого человека неправильно. Во-вторых, даже если оппозиции удастся навязать свою волю, результат будет более или менее ниже ожидаемого.
И именно поэтому я здесь, чтобы снизить ожидания от учреждения, которое создало проблемы в моей жизни: школы. Каждый раз, когда заканчивается семестр, школьный совет публикует опрос, содержащий более 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();
Итак, все, что мне нужно было сделать, это открыть консоль и вставить код. Он будет перебирать все возможные комбинации, исключать нулевые/неудачные/неправильные и, закончив, переходить к следующему учителю.
Чему я научился из всего этого? Немного:
- Не останавливайтесь. Даже если код/данные кажутся невозможными для понимания, всегда есть закономерность
- Всегда есть закономерность
- Найдите ограничения для автоматизации процесса (компьютеры автоматизируют лучше)
- Всегда есть закономерность