Эта статья была полезной?
Как обойти MTCaptcha
Каратель в IT картеле
Введение
MTCaptcha — это современная система защиты от автоматизированных запросов, которая применяется на многих веб-ресурсах и в мобильных приложениях. В отличие от классических текстовых или графических капч, MTCaptcha работает на основе токенов: виджет анализирует поведение пользователя в реальном времени, и в случае успешной проверки возвращает криптографический токен mtcaptcha-verifiedtoken, который необходимо передать на сервер целевого сайта для подтверждения легитимности запроса.
В данном руководстве мы подробно разберём, как автоматизировать прохождение MTCaptcha через API, какие параметры требуются, как интегрировать решение в Python-скрипты и что делать, если стандартный токенный метод не подходит.
Как работает MTCaptcha
| Характеристика | Описание |
|---|---|
| Тип проверки | Токеновая (JavaScript-виджет) |
| Визуальный элемент | Текстовая капча, невидимая проверка или адаптивный вызов |
| Механизм защиты | Сбор поведенческих сигналов, анализ футпринтов, proof-of-work, Threat SPECT |
| Результат проверки | Генерация одноразового токена mtcaptcha-verifiedtoken |
| Срок жизни токена | Минимум 50 секунд, обычно до 120 секунд |
MTCaptcha предлагает несколько режимов работы:
- Modern Mini — компактный виджет для форм
- Invisible Captcha — полностью невидимая проверка для большинства пользователей
- Adaptive Complexity — динамическое усложнение задачи при подозрении на бота
Обязательные параметры для отправки задачи
Для корректной работы необходимо передать минимальный набор параметров. В зависимости от выбора типа задачи, структура может немного отличаться.
Базовые параметры (для всех типов)
| Свойство | Тип | Обязательно | Описание |
|---|---|---|---|
| type | String | Да | Тип задачи: MtCaptchaTaskProxyless или MtCaptchaTask |
| websiteURL | String | Да | Полный URL страницы, где отображается виджет капчи |
| websiteKey | String | Да | Публичный ключ сайта (SiteKey), извлекается из исходного кода страницы |
Параметры прокси (только для MtCaptchaTask)
| Свойство | Тип | Обязательно | Описание |
|---|---|---|---|
| proxyType | String | Да | Протокол: http, https, или socks5 |
| proxyAddress | String | Да | IP-адрес или доменное имя прокси-сервера |
| proxyPort | Integer | Да | Порт прокси-сервера |
| proxyLogin | String | Нет | Логин для авторизации (если требуется) |
| proxyPassword | String | Нет | Пароль для авторизации (если требуется) |
Тип
MtCaptchaTaskProxylessрекомендуется для сайтов без жёсткой привязки к IP. ТипMtCaptchaTaskобязателен, если целевой ресурс валидирует совпадение IP между запросом к капче и отправкой формы.
Пошаговая инструкция: интеграция с API
Шаг 1. Извлечение websiteKey
- Откройте целевой сайт в браузере и нажмите
F12для открытия инструментов разработчика - Перейдите во вкладку Elements (или Inspector)
- Найдите контейнер капчи. Обычно он выглядит так:
html
<!-- MTCaptcha Anchor DOM -->
<div class="mtcaptcha" data-mtcaptcha-site-key="MTPublic-ExampleKey123"></div>
Или в конфигурации скрипта:
html
<script>
var mtcaptchaConfig = {
"sitekey": "MTPublic-ExampleKey123"
};
</script>
- Скопируйте значение
sitekey. Это и есть вашwebsiteKey.
Если ключ не находится в разметке, откройте вкладку Network, перезагрузите страницу и отфильтруйте запросы по слову
mtcaptcha. Частоsitekeyпередаётся в параметрах инициализации скрипта.
Шаг 2. Создание задачи
Отправьте POST-запрос на эндпоинт создания задачи:
https://api.2captcha.com/createTask
Пример тела запроса (без прокси):
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"task": {
"type": "MtCaptchaTaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "MTPublic-ExampleKey123"
}
}
Пример тела запроса (с прокси):
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"task": {
"type": "MtCaptchaTask",
"websiteURL": "https://example.com/login",
"websiteKey": "MTPublic-ExampleKey123",
"proxyType": "http",
"proxyAddress": "198.51.100.10",
"proxyPort": 8080,
"proxyLogin": "user",
"proxyPassword": "secret"
}
}
Шаг 3. Получение taskId
В случае успешного приёма задачи сервер вернёт:
json
{
"errorId": 0,
"taskId": "a1b2c3d4e5f6g7h8i9j0"
}
Сохраните taskId для последующего опроса.
Шаг 4. Опрос результата
Периодически отправляйте POST-запрос на:
https://api.2captcha.com/getTaskResult
Тело запроса:
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"taskId": "a1b2c3d4e5f6g7h8i9j0"
}
Успешный ответ:
json
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "v1(8f3a1c,7b2d9e,MTPublic-ExampleKey123,4a5b6c7d8e9f0...)"
},
"cost": "0.00299",
"ip": "198.51.100.10",
"createTime": 1714489200,
"endTime": 1714489212
}
Шаг 5. Использование токена в целевом запросе
Полученный токен необходимо передать на сайт в скрытом поле формы mtcaptcha-verifiedtoken:
html
<input type="hidden" name="mtcaptcha-verifiedtoken" value="v1(8f3a1c,7b2d9e,...)">
Или в теле POST-запроса:
javascript
fetch("https://example.com/api/verify", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: `mtcaptcha-verifiedtoken=v1(8f3a1c,7b2d9e,...)&username=test&password=123`
});
Токен одноразовый и имеет короткий срок жизни (минимум 50 секунд). Отправляйте его в целевой запрос сразу после получения.
Примеры кода на Python
Вариант 1: Чистый Python (библиотека requests)
python
import requests
import time
API_KEY = "ВАШ_API_КЛЮЧ"
CREATE_URL = "https://api.2captcha.com/createTask"
RESULT_URL = "https://api.2captcha.com/getTaskResult"
def solve_mtcaptcha(url: str, sitekey: str, proxy: dict = None) -> str:
task = {
"clientKey": API_KEY,
"task": {
"type": "MtCaptchaTaskProxyless" if not proxy else "MtCaptchaTask",
"websiteURL": url,
"websiteKey": sitekey
}
}
if proxy:
task["task"].update({
"proxyType": proxy.get("type", "http"),
"proxyAddress": proxy["address"],
"proxyPort": proxy["port"],
"proxyLogin": proxy.get("login"),
"proxyPassword": proxy.get("password")
})
# Создание задачи
resp = requests.post(CREATE_URL, json=task).json()
if resp["errorId"] != 0:
raise RuntimeError(f"Ошибка создания задачи: {resp}")
task_id = resp["taskId"]
# Ожидание решения
for _ in range(24): # до 120 секунд
time.sleep(5)
res = requests.post(RESULT_URL, json={
"clientKey": API_KEY,
"taskId": task_id
}).json()
if res["status"] == "ready":
return res["solution"]["token"]
if res["errorId"] != 0:
raise RuntimeError(f"Ошибка решения: {res}")
raise TimeoutError("Превышено время ожидания решения")
# Пример использования
token = solve_mtcaptcha(
url="https://example.com/login",
sitekey="MTPublic-ExampleKey123"
)
print(f"Готовый токен: {token}")
Вариант 2: Официальная Python-библиотека
Установка: pip install 2captcha-python
python
from twocaptcha import TwoCaptcha
solver = TwoCaptcha('ВАШ_API_КЛЮЧ')
# Решение без прокси
result = solver.mtcaptcha(
websiteURL='https://example.com/login',
websiteKey='MTPublic-ExampleKey123'
)
print(f"Токен: {result['code']}")
# Решение с прокси
result = solver.mtcaptcha(
websiteURL='https://example.com/login',
websiteKey='MTPublic-ExampleKey123',
proxyType='http',
proxyAddress='198.51.100.10',
proxyPort='8080',
proxyLogin='user',
proxyPassword='secret'
)
print(f"Токен: {result['code']}")
Исходный код библиотеки: GitHub
Альтернативный метод: если токен не работает
В некоторых конфигурациях целевой сайт может отклонять токен, полученный через стандартный API, или виджет может отображать нестандартный графический/текстовый вызов. Если у вас не получается решить капчу с помощью токенов, вы можете воспользоваться альтернативным методом решения: Простая капча
Когда использовать этот метод:
- Сайт не принимает токен, полученный через API
- MTCaptcha отображается как изображение с текстом
- Требуется распознать текстовую капчу, встроенную в виджет
Как это работает:
- С помощью автоматизации браузера (Selenium, Playwright, Puppeteer) делается скриншот области с капчей
- Изображение кодируется в Base64
- Отправляется задача типа
ImageToTextTask - Полученный текст используется как ответ в соответствующее поле формы
Пример запроса:
json
{
"clientKey": "ВАШ_API_КЛЮЧ",
"task": {
"type": "ImageToTextTask",
"body": "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAA...",
"phrase": false,
"case": false,
"numeric": 0
}
}
Пример на Python:
python
import base64
from twocaptcha import TwoCaptcha
solver = TwoCaptcha('ВАШ_API_КЛЮЧ')
# Из файла
result = solver.normal('screenshot.png')
print(f"Ответ: {result['code']}")
# Из Base64-строки
with open('screenshot.png', 'rb') as f:
b64 = base64.b64encode(f.read()).decode()
result = solver.normal(b64)
print(f"Ответ: {result['code']}")
Этот подход полезен для нестандартных реализаций виджета, устаревших версий защиты или ситуаций, когда серверная валидация ожидает именно текстовый ввод.
Обработка ошибок и рекомендации
Частые коды ошибок
| Код ошибки | Причина | Решение |
|---|---|---|
| ERROR_WRONG_USER_KEY | Неверный API-ключ | Проверьте ключ в личном кабинете |
| ERROR_NO_SLOT_AVAILABLE | Нет свободных воркеров | Повторите запрос через 10–15 секунд |
| ERROR_CAPTCHA_UNSOLVABLE | Невозможно решить текущий экземпляр | Обновите websiteKey, смените прокси или используйте альтернативный метод |
| ERROR_BAD_PARAMETERS | Ошибка в структуре JSON или отсутствующие поля | Сверьте запрос с документацией |
| ERROR_ZERO_BALANCE | Недостаточно средств | Пополните баланс аккаунта |
Практические советы по стабильности
Синхронизируйте контекст запроса
MTCaptcha может привязывать токен к User-Agent, заголовкам и IP. Отправляйте целевой запрос с теми же параметрами, с которыми создавалась задача.
Соблюдайте тайминги
Токен действителен минимум 50 секунд, обычно до 120 секунд. Не добавляйте задержки между получением решения и отправкой формы.
Обрабатывайте динамические sitekey
На некоторых сайтах ключ генерируется при каждой загрузке. Перед созданием задачи всегда парсите свежую версию страницы .
Реализуйте ретраи
Сетевые ошибки и временная нагрузка на сервис — норма. Добавляйте 2–3 повторные попытки с экспоненциальной задержкой.
Эмулируйте человеческое поведение
Даже с валидным токеном сайт может отклонить запрос при подозрении на бота. Используйте реалистичные заголовки, случайные паузы между действиями и избегайте отправки пакетных запросов без ротации параметров.
Полезные ссылки
- Документация API
- Python-библиотека для интеграции
- Демо-страница
- Альтернативный метод
- FAQ и поддержка
Заключение
Автоматическое прохождение MTCaptcha сводится к корректному извлечению websiteKey, отправке задачи в API и быстрой подстановке полученного токена в поле mtcaptcha-verifiedtoken. Главный фактор успеха — соблюдение контекста: токен должен использоваться в тех же условиях, в которых он был сгенерирован.
Если стандартный токенный метод не проходит валидацию, переключитесь на распознавание изображения через метод ImageToTextTask. Это надёжный резервный вариант для сложных или нестандартных реализаций защиты.
Начинайте интеграцию с тестовых страниц, логируйте ответы сервера и добавляйте механизмы повторных попыток — так вы обеспечите стабильную работу автоматизации даже при изменениях в логике защиты.