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

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

Как обойти CaptchaFox на сайте 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:p4$w0rd@1.2.3.4: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, до перехода на страницу

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