Эта статья была полезной?
Как обойти капчу на сайте 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
{
"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
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
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
{
"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, до перехода на страницу |
Полезные ссылки
- Документация API по CaptchaFox: https://rucaptcha.com/api-docs/captchafox
- Как обойти CaptchaFox: https://rucaptcha.com/p/captchafox-solver
- CaptchaFox на register.gmx.net: https://rucaptcha.com/h/how-to-solve-captchafox-captcha-on-registergmxnet
- CaptchaFox на signup.mail.com: https://rucaptcha.com/h/how-to-solve-captchafox-captcha-on-signupmailcom
- Решение reCAPTCHA v2: https://rucaptcha.com/api-docs/recaptcha-v2
- Работа с прокси: https://rucaptcha.com/api-docs/proxy
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://rucaptcha.com/h?category=sites