Looking for international version of our service? Go to 2captcha.com

Логотип «RuCaptcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как обойти MTCaptcha на сайте TraceParts

Джерри Слиман
Джерри Слиман

Технический специалист

TraceParts (traceparts.com) — это платформа для инженеров, на которой производители публикуют бесплатные 3D-модели, CAD-файлы и 2D-чертежи промышленных компонентов; сервисом пользуются несколько миллионов зарегистрированных инженеров и дизайнеров. Для защиты формы регистрации от автоматизации и ботов сайт использует систему MTCaptcha.

Эта капча представляет собой интерактивный виджет, который оценивает поведение пользователя. Для успешного решения через API v2 необходимо извлечь публичный ключ сайта (sitekey) и передать его вместе с полным URL страницы. В этом руководстве мы разберем, как найти эти параметры, отправить задачу и корректно внедрить полученный токен.

Для отправки задачи через современный API v2 используется эндпоинт createTask. Объект task должен содержать следующие параметры:

Параметр Тип Обязательный Описание
type String Да Тип задачи: MtCaptchaTaskProxyless или MtCaptchaTask
websiteURL String Да Полный URL страницы, где находится капча
websiteKey String Да Публичный ключ сайта MTCaptcha (начинается с MTPublic-)

Параметры для MTCaptcha являются статическими для конкретной страницы и легко извлекаются из исходного кода.

  • Откройте сайт https://www.traceparts.com/ru/sign-up в браузере.
  • Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Elements.
  • Нажмите Ctrl+F (или Cmd+F) и выполните поиск по слову mtcaptchaConfig.
  • В отличие от многих реализаций MTCaptcha, здесь ключ находится не в атрибуте data-sitekey, а задаётся в блоке inline-скрипта, ещё до загрузки клиентской библиотеки MTCaptcha:
html Copy
<script type="text/javascript">
var mtcaptchaConfig = {
  "sitekey": "MTPublic-Ia4y1KBYt",
  "lang": "ru",
  "widgetSize": "mini"
};
</script>
  • Значение sitekey (в данном примере MTPublic-Ia4y1KBYt) является вашим websiteKey.
  • Скопируйте полный URL из адресной строки браузера. Это будет ваш websiteURL.

Пример отправки задачи и опроса результата с использованием библиотеки requests через эндпоинты API v2.

python Copy
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://www.traceparts.com/ru/sign-up'
WEBSITE_KEY = 'MTPublic-Ia4y1KBYt'

# 1. Создание задачи через API v2
url = 'https://api.rucaptcha.com/createTask'
headers = {
    'Content-Type': 'application/json'
}
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "MtCaptchaTaskProxyless",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY
    }
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
if result.get('errorId') == 0:
    task_id = result.get('taskId')
    print(f"Задача создана, ID: {task_id}")

    # 2. Получение результата через API v2
    res_url = 'https://api.rucaptcha.com/getTaskResult'
    while True:
        time.sleep(5)  # Пауза между запросами

        res_payload = {
            "clientKey": API_KEY,
            "taskId": task_id
        }

        res_response = requests.post(res_url, headers=headers, json=res_payload).json()

        if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
            print("Капча успешно решена!")
            token = res_response['solution']['token']
            print(f"Токен: {token}")
            break
        elif res_response.get('errorId') != 0:
            print(f"Ошибка: {res_response.get('errorDescription')}")
            break
        else:
            continue
else:
    print(f"Ошибка создания задачи: {result.get('errorDescription')}")

Пример автоматизации, который динамически извлекает sitekey со страницы, отправляет задачу через API v2 и внедряет токен.

python Copy
from playwright.sync_api import sync_playwright
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://www.traceparts.com/ru/sign-up'

def solve_mtcaptcha():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()

        try:
            page.goto(TARGET_URL)

            # Ожидаем появления виджета MTCaptcha
            page.wait_for_selector('.mtcaptcha', timeout=10000)

            # Извлекаем sitekey из объекта mtcaptchaConfig на странице
            site_key = page.evaluate("() => window.mtcaptchaConfig ? window.mtcaptchaConfig.sitekey : null")

            if not site_key:
                raise Exception("Не удалось найти sitekey MTCaptcha на странице.")

            print(f"Найден sitekey: {site_key}")

            # Отправка в API v2
            api_url = 'https://api.rucaptcha.com/createTask'
            headers = {'Content-Type': 'application/json'}
            payload = {
                "clientKey": API_KEY,
                "task": {
                    "type": "MtCaptchaTaskProxyless",
                    "websiteURL": page.url,
                    "websiteKey": site_key
                }
            }

            task_response = requests.post(api_url, headers=headers, json=payload).json()
            if task_response.get('errorId') != 0:
                raise Exception(f"Ошибка создания задачи: {task_response.get('errorDescription')}")

            task_id = task_response.get('taskId')

            # Ожидание решения через getTaskResult
            res_url = 'https://api.rucaptcha.com/getTaskResult'
            token = None
            for _ in range(20):
                time.sleep(5)
                res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
                if res.get('status') == 'ready':
                    token = res['solution']['token']
                    break
                if res.get('errorId') != 0:
                    print(f"Ошибка API: {res.get('errorDescription')}")
                    break

            if token:
                print(f"Токен получен: {token}")

                # Внедрение токена в форму
                # Токен передаётся в скрытое поле mtcaptcha-verifiedtoken;
                # на странице также есть отдельное поле captchaToken рядом с кнопкой отправки
                page.evaluate(f"""
                    let input = document.querySelector('#mtcaptcha-verifiedtoken-1');
                    if (input) {{
                        input.value = "{token}";
                    }}
                    let hiddenToken = document.querySelector('#captchaToken');
                    if (hiddenToken) {{
                        hiddenToken.value = "{token}";
                    }}

                    if (typeof window._mtcaptchaOnVerified === 'function') {{
                        window._mtcaptchaOnVerified("{token}");
                    }}
                """)
                print("Токен внедрен в DOM.")
            else:
                print("Не удалось получить токен.")

        except Exception as e:
            print(f"Ошибка: {e}")
        finally:
            browser.close()

if __name__ == '__main__':
    solve_mtcaptcha()

В некоторых случаях, если стандартный метод MTCaptcha сталкивается с трудностями или специфическими защитами, можно попробовать альтернативный вариант решения с помощью нашего метода Обычной капчи (Normal Captcha).

Если виджет MTCaptcha отображает классическое текстовое или символьное изображение для ввода, вы можете сделать скриншот этого элемента с помощью Playwright или Selenium и отправить его на распознавание как обычную капчу. После получения текстового ответа его можно ввести в поле ввода капчи с помощью эмуляции нажатий клавиш.

Документация по методу Normal Captcha: https://rucaptcha.com/api-docs/normal-captcha

Ошибка / Проблема Причина Решение
ERROR_WRONG_USER_KEY Неверный или пустой API-ключ. Проверьте правильность копирования ключа из панели управления.
ERROR_ZERO_BALANCE Недостаточно средств на балансе. Пополните баланс аккаунта.
ERROR_CAPTCHA_UNSOLVABLE Капча не может быть решена (например, истекло время или неверные параметры). Убедитесь, что websiteKey и websiteURL скопированы точно. Не используйте устаревшие значения.
Токен не принимается формой Неверное имя поля для внедрения или отсутствие вызова callback. Проверьте исходный код страницы. Убедитесь, что вы внедряете токен в поле mtcaptcha-verifiedtoken (и дублируете его в captchaToken), и при необходимости вызываете функцию проверки.