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

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

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

Как обойти капчу на сайте auth.gmx.net

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

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

auth.gmx.net — это страница входа в почту GMX. Капча появляется не всегда, решение принимает сервер после первого шага.

Здесь стоит CaptchaFox, и работать с ней сложнее, чем на странице регистрации. Основные отличия приведены ниже.

Первое: у страницы входа два ключа сайта вместо одного. Один для варианта с галочкой, другой для варианта с ползунком. Какой из них будет использован, решает сервер для каждой сессии, поэтому ключ нужно брать со страницы, а не вписывать в код заранее.

Второе: GMX подключает капчу со своего адреса s.uicdn.com, а не с сервера самой CaptchaFox. Из-за этого в задачу нужно передать параметр apiServer. Без него токен придёт в обычном формате, а сайту нужен токен с префиксом MAM_.

Третье: на этой странице нет формы, которую вы отправляете сами. Страница отдаёт токен в функцию обратного вызова, а дальше отправляет его своим запросом. Поэтому подстановка токена в скрытое поле здесь ничего не даст.

Параметры задачи

Для решения используется тип задачи CaptchaFoxTask.

Параметр Тип Обязательный Описание
type String Да Должен быть установлен в CaptchaFoxTask
websiteURL String Да Адрес страницы входа: https://auth.gmx.net/login
websiteKey String Да Ключ сайта. У страницы входа их два, нужный берётся со страницы
apiServer String Да для GMX Адрес сборки капчи: https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/. Формально поле необязательное, но без него токен придёт в неверном формате
userAgent String Да User-Agent браузера. Должен совпадать с реальным
proxyType String Да Тип прокси: http, socks4 или socks5
proxyAddress String Да IP-адрес прокси-сервера или имя хоста
proxyPort Число Да Порт прокси-сервера
proxyLogin String Нет Логин для авторизации на прокси
proxyPassword String Нет Пароль для авторизации на прокси

Как найти параметры

Оба ключа сайта лежат в самой странице, в теге script с идентификатором view-properties. Открывать инструменты разработчика не обязательно, достаточно посмотреть исходный код страницы и найти строку captchaSiteKeys:

json Copy
{
  "captchaSiteKeys": {
    "captchaFox": {
      "oneClick": "sk_MkbSHwQwyv1NxVi2fogWFiHu2hx6q",
      "slide": "sk_uVvZFK06t1rgOKEXgJafrEXI4f9e4"
    },
    "recaptcha": "6LeKN00rAAAAAI_EfKCvVDrPPyXihxkRmB6dIhKZ"
  }
}

Ключ oneClick относится к варианту с галочкой, ключ slide — к варианту с ползунком. Внутри страницы эти варианты называются ONE_CLICK и SLIDE. Третий ключ, recaptcha, к CaptchaFox отношения не имеет: у GMX есть и запасной вариант с reCAPTCHA, но это отдельная задача и отдельный тип запроса.

Заранее выбрать один из двух ключей нельзя — какой понадобится, станет понятно только после первого шага входа. Надёжнее забрать ключ у самой страницы в момент, когда она рисует капчу. Как это сделать, показано в примере с Playwright.

Адрес сборки капчи виден на вкладке «Сеть» (Network). Отфильтруйте запросы по captchafox и посмотрите, откуда грузится api.js. У GMX это https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/api.js — путь до имени файла и есть значение apiServer. Тот же адрес используется на странице регистрации GMX и на mail.com.

User-Agent берите тот, которым открываете сайт. В скрипте его удобно взять прямо из браузера, не переписывая руками.

Примеры кода

Python + requests

Отправка задачи и опрос результата без дополнительных библиотек. В примере взят ключ варианта с галочкой; если на вашей сессии страница показала ползунок, подставьте второй ключ.

python Copy
import time

import requests

API_KEY = "ВАШ_API_КЛЮЧ"
WEBSITE_KEY = "sk_MkbSHwQwyv1NxVi2fogWFiHu2hx6q"
API_SERVER = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/"
USER_AGENT = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
              "(KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")

task = {
    "type": "CaptchaFoxTask",
    "websiteURL": "https://auth.gmx.net/login",
    "websiteKey": WEBSITE_KEY,
    "apiServer": API_SERVER,
    "userAgent": USER_AGENT,
    "proxyType": "http",
    "proxyAddress": "1.2.3.4",
    "proxyPort": 8080,
    "proxyLogin": "user23",
    "proxyPassword": "p4$w0rd",
}

created = requests.post(
    "https://api.rucaptcha.com/createTask",
    json={"clientKey": API_KEY, "task": task},
    timeout=30,
).json()

if created.get("errorId") != 0:
    raise RuntimeError(f"Задача не создана: {created}")

task_id = created["taskId"]
print("Задача создана:", task_id)

for _ in range(24):
    time.sleep(5)
    result = requests.post(
        "https://api.rucaptcha.com/getTaskResult",
        json={"clientKey": API_KEY, "taskId": task_id},
        timeout=30,
    ).json()

    if result.get("status") == "ready":
        token = result["solution"]["token"]
        print("Токен получен:", token[:20], "…")
        break

    if result.get("errorId") != 0:
        raise RuntimeError(f"Ошибка: {result}")
else:
    raise RuntimeError("Решение не пришло за отведённое время")

Проверьте начало токена: он должен начинаться с MAM_. Если префикса нет, значит, задача ушла без apiServer или с неверным значением.

Python + Playwright

Скрипт открывает страницу входа, вводит адрес почты, дожидается шага с капчей, забирает у страницы ключ сайта, отправляет задачу и передаёт токен обратно странице.

Главное здесь — маленький скрипт, который запускается в браузере ещё до загрузки страницы. Он подменяет функцию captchafox.render на свою: своя запоминает настройки виджета и передаёт работу настоящей функции. В этих настройках лежит и ключ сайта, и функция, которой потом нужно отдать токен.

python Copy
import os

from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha

API_KEY = os.getenv("APIKEY_RUCAPTCHA", "ВАШ_API_КЛЮЧ")
TARGET_URL = "https://auth.gmx.net/login"
API_SERVER = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/"
EMAIL = "ВАШ_АДРЕС@gmx.net"

PROXY_BROWSER = {"server": "http://1.2.3.4:8080", "username": "user23", "password": "p4$w0rd"}
PROXY_API = {"type": "HTTP", "uri": "user23:[email protected]:8080"}

INTERCEPT = """
window.__cfOptions = null;
let stored = undefined;
Object.defineProperty(window, 'captchafox', {
    configurable: true,
    get() { return stored; },
    set(value) {
        const render = value.render;
        value.render = (container, options) => {
            window.__cfOptions = options;
            return render(container, options);
        };
        stored = value;
    },
});
"""

solver = TwoCaptcha(API_KEY, server="rucaptcha.com")

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, proxy=PROXY_BROWSER)
    page = browser.new_page()
    page.add_init_script(INTERCEPT)

    try:
        page.goto(TARGET_URL)
        page.wait_for_load_state("networkidle")

        page.fill('input[name="username"]', EMAIL)
        page.click("#button-next")

        page.wait_for_function("window.__cfOptions !== null", timeout=30000)
        website_key = page.evaluate("window.__cfOptions.sitekey")
        user_agent = page.evaluate("navigator.userAgent")
        print("Ключ сайта:", website_key)

        result = solver.captchafox(
            sitekey=website_key,
            pageurl=TARGET_URL,
            userAgent=user_agent,
            proxy=PROXY_API,
            api_server=API_SERVER,
        )
        token = result["code"]
        print("Токен получен:", token[:20], "…")

        page.evaluate("""(token) => {
            if (!window.__cfOptions || typeof window.__cfOptions.onVerify !== 'function') {
                throw new Error('Функция обратного вызова капчи не найдена');
            }
            window.__cfOptions.onVerify(token);
        }""", token)

        print("Токен передан странице, дальше идёт шаг с паролем")

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

Если страница пропустила капчу и сразу показала поле пароля, ожидание завершится по времени. Это не ошибка скрипта: сервер решил, что проверка не нужна.

Как использовать полученный токен (Функция обратного вызова)

На странице регистрации GMX токен достаточно положить в скрытое поле и отправить форму. На странице входа так не получится.

Виджет CaptchaFox и здесь создаёт скрытое поле — textarea с именем cf-captcha-response внутри блока cf-widget-ИДЕНТИФИКАТОР. Но страница входа его не читает и никакой формы не отправляет. Вместо этого она передаёт в виджет функцию обратного вызова onVerify, и когда капча решена, виджет вызывает эту функцию с токеном. Дальше страница сама собирает запрос:

json Copy
{
  "captcha": {
    "response": "MAM_...",
    "siteKey": "sk_MkbSHwQwyv1NxVi2fogWFiHu2hx6q"
  },
  "sessionId": "идентификатор сессии входа"
}

и отправляет его методом POST на адрес captchafox-verification своего сервиса.

Отсюда два вывода. Записывать токен в скрытое поле бессмысленно — его никто не прочитает. И собирать этот запрос самому тоже не нужно: проще вызвать ту же функцию, которую страница уже подготовила, и дать ей сделать всё остальное. Именно так и сделано в примере с Playwright выше.

В ответе на свой запрос страница получает поле flowState. Значение SUCCESS означает, что проверка пройдена, FAILED — что вход не удался, ONGOING — что нужен ещё один шаг. Тип следующего шага приходит в поле nextStep. Там может оказаться и пароль, и ещё одна капча: сайт вправе показать вторую проверку подряд, в том числе reCAPTCHA вместо CaptchaFox.

Частые ошибки и решения

Ошибка / Проблема Причина Решение
Сайт отвечает HTTP 424 Токен пришёл в стандартном формате, без префикса MAM_ Передайте в задачу apiServer со значением https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/
Токен начинается не с MAM_ Параметр apiServer не передан или указан неверно Проверьте значение и сверьте с адресом, с которого страница грузит скрипт капчи
Токен принят сервисом, но вход не проходит Использован ключ не того варианта: у страницы их два Берите ключ из настроек виджета в момент отрисовки, а не из кода
Капча решена, но на странице ничего не происходит Токен записан в скрытое поле, а страница его не читает Передайте токен в функцию обратного вызова onVerify
Ожидание капчи завершается по времени Сервер решил, что проверка не нужна, и сразу показал поле пароля Обрабатывайте оба варианта: с капчей и без неё
Задача уходит без прокси В proxy передан пустой словарь или None SDK молча отбрасывает такие значения. Передавайте заполненный словарь: для CaptchaFox прокси обязателен
После решённой капчи страница показывает вторую В ответе пришло flowState со значением ONGOING и новый шаг в nextStep Повторите решение для нового ключа. Если пришла reCAPTCHA, используйте метод для reCAPTCHA
Скрипт не прочитал настройки виджета Он запустился уже после загрузки страницы Запускайте его через add_init_script, до перехода на страницу

Полезные ссылки