Автоматическое решение математической CAPTCHA на 2ch.hk
Основные изменения и исправления:
Надежный парсинг уравнения (solveEquation):
Исходное разделение по split(/([\+\-\*\/=])/) могло быть неточным, если вокруг операторов были пробелы, или если уравнение было неполным.
Новое регулярное выражение equation.match(/\s*(\d+|\?)\s*([-+*/\\])\s*(\d+|\?)\s*=\s*(\d+|\?)\s*/) более точно извлекает операнды, оператор и результат, учитывая пробелы.
Используется parseFloat вместо parseInt для операндов и результата, чтобы корректно обрабатывать потенциальные десятичные числа (хотя CAPTCHA на 2ch обычно целые, это делает функцию более универсальной).
Добавлена обработка деления на ноль (operand2 !== 0 или result !== 0), возвращая null в таких случаях.
Улучшена логика для оператора деления, когда 2ch может использовать как / так и \. Теперь \ преобразуется в /.
Улучшенная логика обработчика ввода (handleCaptchaInput):
Используется более строгое регулярное выражение captchaPattern = /^\s*(\d+|\?)\s*[-+*/\\]\s*(\d+|\?)\s*=\s*(\d+|\?)\s*$/ для проверки того, что введенный текст точно соответствует формату уравнения CAPTCHA. Это предотвратит попытки решить произвольный текст, который пользователь может ввести.
Проверка solution !== null && !isNaN(solution) гарантирует, что решение найдено и является корректным числом.
Округление результата: inputElement.value = Math.round(solution); - CAPTCHA на 2ch всегда требует целые числа.
Имитация событий change и input: inputElement.dispatchEvent(new Event('change', { bubbles: true })); и inputElement.dispatchEvent(new Event('input', { bubbles: true }));. Это очень важно, так как многие веб-приложения (включая 2ch) реагируют на эти события для валидации и отправки данных. Простое изменение value элемента DOM не всегда запускает необходимые внутренние реакции фреймворков.
Динамическое обнаружение CAPTCHA (MutationObserver):
Изначальный код использовал document.querySelectorAll только при загрузке скрипта. Однако CAPTCHA на 2ch может появляться динамически (например, при отправке поста или создании треда).
Добавлен MutationObserver, который наблюдает за изменениями в DOM. Когда новые узлы добавляются (например, появляется форма с CAPTCHA), он автоматически находит их и прикрепляет обработчик.
Для предотвращения многократного добавления обработчиков к одному и тому же элементу, используется атрибут dataset.captchaMathProcessed.
Улучшенный логгер (logger):
Добавлены функции warn и error для более информативных сообщений в консоли, что удобно для отладки.
Инициализация скрипта :
Добавлена проверка document.readyState и использование DOMContentLoaded для запуска инициализации. Это гарантирует, что скрипт будет ждать полной загрузки DOM, прежде чем пытаться взаимодействовать с элементами.
Скрипт теперь запускает initialize как при загрузке DOM, так и для уже существующих элементов CAPTCHA, а затем использует MutationObserver для будущих.
Метаданные UserScript :
Версия обновлена до 0.2.
Добавлен @grant none, так как скрипт не использует специальных привилегий Tampermonkey/Greasemonkey.
Этот исправленный скрипт должен быть значительно более надежным и эффективным в решении CAPTCHA на 2ch, независимо от того, как и когда она появляется на странице.Я добавил лицензию MIT в метаданные UserScript для скрипта 2ch-CAPTCHA-MATH.СЛАВА УКРАИНА
-----------------------------------------------------
Что делает этот скрипт (разбор)
По коду:
Отслеживает появление CAPTCHA-поля
Через MutationObserver скрипт ищет элементы с классом .captcha__val.input (динамически добавляемые в DOM).
Вешает обработчик input
Когда пользователь вводит текст, вызывается handleCaptchaInput.
Проверяет, похоже ли введённое на уравнение
Регулярное выражение ищет формат вида:
число или ? оператор число или ? = число или ?
Например:
2 + ? = 5
? * 3 = 6
4 / 2 = ?
Решает уравнение
Функция solveEquation():
Парсит операнды и оператор (+ - * / \)
Вычисляет неизвестное значение
Возвращает результат
Автоматически подставляет ответ
Если решение найдено:
округляет число
подставляет в поле
триггерит события change и input
Возможные проблемы в коде (общий разбор логики)
Без помощи в обходе CAPTCHA, могу отметить общие инженерные моменты:
Деление на ноль частично проверяется, но не во всех сценариях.
Math.round() может давать неправильный ответ, если CAPTCHA ожидает точное значение.
Регулярное выражение не учитывает отрицательные числа.
Используется parseFloat, хотя CAPTCHA, вероятно, только целочисленная.
MutationObserver может создавать лишнюю нагрузку при частых изменениях DOM.