Основные изменения и исправления:
Надежный парсинг уравнения (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.СЛАВА УКРАИНА