Эта статья была полезной?
Как использовать `strtoupper` с 2captcha для обхода текстовых капч
Инженер технической поддержки
Введение
При работе с сервисом 2captcha для распознавания простых капч (normal или textcaptcha) часто возникает ситуация: воркер возвращает ответ в который не соответствует заранее известному регистру, а целевой сайт требует строгого формата. Функция strtoupper() (или mb_strtoupper() для UTF-8) позволяет нормализовать ответ перед отправкой в форму. Ниже пошаговый алгоритм интеграции.
Шаг 1. Настройте параметр regsense в запросе к 2captcha
По умолчанию 2captcha использует case-sensitive распознавание (regsense=1). Если ваш целевой сайт не требует точного соответствия регистра, отправляйте запрос с regsense=0. Это даёт следующие преимущества:
- Ускоряет обработку задачи воркерами.
- Снижает процент возвратов на доработку.
- Позволяет вам самостоятельно привести результат к нужному виду на выходе.
Пример отправки задачи (PHP cURL):
$params = [
'key' => 'YOUR_2CAPTCHA_KEY',
'method' => 'normal',
'body' => base64_encode($captchaImage),
'regsense' => 0,
'languagepool' => 'ru', // Направит задачу исполнителям, знающим нужный алфавит
'json' => 1
];
$ch = curl_init('https://2captcha.com/in.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
$taskId = $response['request'] ?? null;
curl_close($ch);
Шаг 2. Получите ответ и примените нормализацию
После получения статуса OK от res.php вы получите строку ответа. Обратите внимание: если в in.php вы использовали json=1, то в запросе к res.php этот параметр тоже нужно передать явно, иначе сервис вернёт формат OK|ответ. Опрос результата лучше делать с интервалом 5–10 секунд до получения готового ответа.
Пример обработки ответа:
$answer = trim($captchaResultFrom2captcha);
// Для латиницы достаточно strtoupper(), для кириллицы/UTF-8 обязательно mb_strtoupper()
$normalized = mb_strtoupper($answer, 'UTF-8');
Шаг 3. Встройте нормализацию в отправку формы
Используйте $normalized как значение поля капчи в POST/GET запросе к целевому сайту.
Шаг 4. Учитывайте особенности приведения регистра в разных языках
Стандартная strtoupper() в PHP игнорирует символы за пределами ASCII. При работе с многоязычными капчами важно выбирать правильную функцию в зависимости от языка программирования и кодировки.
Сравнение функций приведения к верхнему регистру
| Язык | Функция/Метод | Особенности |
|---|---|---|
| PHP | strtoupper($text) | Только ASCII, латиница |
| PHP | mb_strtoupper($text, 'UTF-8') | Кириллица, Юникод, требуется mbstring |
| Python | text.upper() | Работает с Юникодом из коробки |
| C# | text.ToUpper() | Базовая версия |
| C# | text.ToUpper(CultureInfo) | С указанием локали |
| Ruby | text.upcase | Базовая версия |
| Ruby | text.upcase(:unicode) | Для Unicode символов |
| JavaScript | text.toUpperCase() | Работает с большинством символов |
| Java | text.toUpperCase() | Базовая версия |
| Java | text.toUpperCase(Locale) | С указанием локали |
Ключевые рекомендации:
- PHP: Всегда используйте mb_strtoupper($text, 'UTF-8') для капч с кириллицей или смешанным алфавитом. Убедитесь, что расширение mbstring включено в php.ini.
- Python/JavaScript: Методы .upper() и .toUpperCase() работают с Юникодом по умолчанию, но могут иметь нюансы с некоторыми спецсимволами (например, немецкая ß → SS в Python).
- C#/Java: При работе с интернациональными капчами указывайте локаль (
CultureInfo.InvariantCultureилиLocale.ENGLISH), чтобы избежать неожиданных преобразований. - Ruby: Для полной поддержки Юникода используйте upcase(:unicode).
Шаг 5. Тестирование и логирование
Добавьте простую проверку: сравнивайте $answer и $normalized. Если они отличаются, записывайте в лог. Это поможет отловить сайты, которые всё-таки чувствительны к регистру, несмотря на ваши ожидания.
Итоговый чек-лист перед запуском
- На целевом сайте проверена регистронезависимость.
- В запросе к 2captcha установлен
regsense=0. - Для многоязычных капч добавлен
languagepool. - В коде используется
mb_strtoupper($text, 'UTF-8'). - Ответ проходит
trim()до примененияstrtoupper. - Настроено логирование расхождений регистров.
- Проведён тест на 30–50 реальных капчах.