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

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

Как обойти CaptchaFox с помощью Playwright

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

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

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

В этом руководстве мы пройдём весь путь в Playwright на Python: найдём ключ сайта, отправим задачу в API RuCaptcha и получим токен. У CaptchaFox есть особенность, из-за которой обход чаще всего и не работает с первого раза: у капчи два разных сервера, и токены у них разные. Разберём, как понять, какой нужен вам.

Что понадобится

  • Python 3.7 или выше
  • Установленный Playwright
  • Аккаунт и API-ключ от RuCaptcha
  • URL целевой страницы
  • Прокси. Для CaptchaFox он обязателен, без него метод не работает

Шаг 1. Установка зависимостей

Установите библиотеки и браузеры Playwright:

bash Copy
pip install playwright 2captcha-python
playwright install chromium

Шаг 2. Инициализация браузера и переход на страницу

Прокси для CaptchaFox обязателен, без него запрос не пройдет. Тот же прокси поставьте и в браузер — сервис решает капчу с вашего адреса, и адреса должны совпадать. Второй обязательный параметр - User-Agent, он должен быть тем же, которым вы открываете сайт.

python Copy
from playwright.sync_api import sync_playwright

PROXY = {"server": "http://1.2.3.4:8080", "username": "user23", "password": "p4$w0rd"}

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

    page.goto("https://mysite.com/page/with/captchafox")
    page.wait_for_load_state("networkidle")

Шаг 3. Извлечение ключа сайта

У каждого сайта с CaptchaFox свой ключ, на странице он лежит в параметре key. Начинается с sk_ и выглядит так: sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G. Найти его можно в коде страницы или в сетевых запросах, которые она отправляет при загрузке.

Проще всего найти его поиском по коду страницы:

python Copy
import re

html = page.content()

match = re.search(r"sk_[A-Za-z0-9_-]+", html)
if match is None:
    raise RuntimeError("Ключ сайта не найден, поищите его во вкладке «Сеть»")

website_key = match.group(0)
page_url = page.url
user_agent = page.evaluate("navigator.userAgent")

print("Ключ сайта:", website_key)

Если в коде страницы ключа нет, откройте инструменты разработчика, вкладку «Сеть», перезагрузите страницу и найдите запрос к серверу капчи. Ключ будет в его параметрах.

Шаг 4. Выбор сервера капчи

У CaptchaFox два сервера, и токены у них разного формата:

  • https://cdn.captchafox.com/ — адрес по умолчанию;
  • https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/ — здесь токен приходит с префиксом MAM_.

Сайт принимает токен только от своего сервера, поэтому в запросе нужно указать тот же адрес, с которым работает страница. Посмотрите во вкладке «Сеть», откуда она грузит скрипт капчи.

python Copy
api_server = "https://cdn.captchafox.com/"

if page.locator('script[src*="s.uicdn.com"]').first.count() > 0:
    api_server = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/"

print("Сервер капчи:", api_server)

Шаг 5. Отправка задачи в API и получение токена

Задачу создаёт официальный Python SDK. Прокси и User-Agent здесь обязательные, а api_server передаётся, только если он отличается от значения по умолчанию.

python Copy
import os

from twocaptcha import TwoCaptcha

api_key = os.getenv('APIKEY_RUCAPTCHA', 'ВАШ_API_КЛЮЧ')

solver = TwoCaptcha(api_key, server='rucaptcha.com')

result = solver.captchafox(
    sitekey=website_key,
    pageurl=page_url,
    userAgent=user_agent,
    proxy={'type': 'HTTP', 'uri': 'user23:p4$w0rd@1.2.3.4:8080'},
    api_server=api_server
)

token = result['code']
print("Токен получен:", token)

В API поле называется websiteKey, в SDK — sitekey. Значение одно и то же. То же с адресом сервера: в API это apiServer, в SDK — api_server.

В ответе приходит один токен:

json Copy
{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "token": "7828075fb55ecbd9146745ee6f2bec475b88076d36e23050f1fb28359ffca15d"
    }
}

Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, отправьте запрос через curl или библиотеку requests. Тип задачи один — CaptchaFoxTask, прокси в нём тоже обязателен.

bash Copy
curl -X POST https://api.rucaptcha.com/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_API_КЛЮЧ",
    "task": {
      "type": "CaptchaFoxTask",
      "websiteURL": "https://mysite.com/page/with/captchafox",
      "websiteKey": "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
      "proxyType": "http",
      "proxyAddress": "1.2.3.4",
      "proxyPort": "8080",
      "proxyLogin": "user23",
      "proxyPassword": "p4$w0rd"
    }
  }'

Шаг 6. Внедрение токена и отправка формы

Определить нужное место для вставки токена можно за один проход вручную: пройдите капчу сами с открытой вкладкой «Сеть» и посмотрите, в каком поле или в каком запросе оказался токен.

Обычно вариантов два. Если на странице есть скрытое поле, запишите токен в него. Подставьте свой селектор вместо SELECTOR_TOKEN.

python Copy
page.evaluate("""(token) => {
    const field = document.querySelector('SELECTOR_TOKEN');
    if (!field) {
        throw new Error('Поле для токена на странице не найдено');
    }
    field.value = token;
}""", token)

Если поля нет, а капча вызывает функцию обратного вызова, вызовите её сами. Имя функции подставьте своё вместо CALLBACK.

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

Проверка нужна в обоих случаях: без неё скрипт отправит форму без токена и сообщит об успешной отправке.

Дальше отправьте форму. Селектор кнопки подставьте свой.

python Copy
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")

О результате стоит сообщить сервису. В SDK для этого есть метод report, в API — методы reportCorrect и reportIncorrect. Идентификатор задачи лежит в том же ответе, что и токен: solver.report(result['captchaId'], True).

Полный рабочий пример (Python)

python Copy
import os
import re

from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha

API_KEY = os.getenv('APIKEY_RUCAPTCHA', 'ВАШ_API_КЛЮЧ')
TARGET_URL = "https://mysite.com/page/with/captchafox"

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'}


def solve_captchafox():
    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()

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

            # 1. Ищем ключ сайта
            match = re.search(r"sk_[A-Za-z0-9_-]+", page.content())
            if match is None:
                raise RuntimeError("Ключ сайта не найден, поищите его во вкладке «Сеть»")

            website_key = match.group(0)
            user_agent = page.evaluate("navigator.userAgent")
            print("Ключ сайта:", website_key)

            # 2. Определяем сервер капчи
            api_server = "https://cdn.captchafox.com/"
            if page.locator('script[src*="s.uicdn.com"]').first.count() > 0:
                api_server = "https://s.uicdn.com/mampkg/@mamdev/core.frontend.libs.captchafox/"

            print("Сервер капчи:", api_server)

            # 3. Отправляем задачу в API
            print("Отправка задачи в API...")
            result = solver.captchafox(
                sitekey=website_key,
                pageurl=page.url,
                userAgent=user_agent,
                proxy=PROXY_API,
                api_server=api_server
            )
            token = result['code']
            print("Токен получен:", token)

            # 4. Здесь подставьте код из Шага 6 под своё поле или свою функцию

            # 5. Отправляем форму
            page.click("button[type='submit']")
            page.wait_for_load_state("networkidle")

            print("Форма отправлена.")
            page.wait_for_timeout(3000)  # Пауза для визуальной проверки

            # 6. Отчёт о результате. True, если сайт принял токен, иначе False
            solver.report(result['captchaId'], True)

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


if __name__ == "__main__":
    solve_captchafox()

Решение частых проблем

  • Сайт не принимает токен, хотя задача решена. Причин может быть несколько. Либо выбран не тот сервер капчи — проверьте Шаг 4, токен с префиксом MAM_ подойдёт только сайту, который работает со вторым сервером. Либо дело в прокси: сервис решает капчу с того адреса, который вы передали в запрос, поэтому браузер и API должны работать через один и тот же рабочий прокси.
  • Задача не создаётся или возвращается с ошибкой. Первым делом проверьте прокси. Пропустите type или uri - скрипт упадёт с KeyError.
  • Скрипт не находит капчу. Виджет может грузиться внутри iframe. Обращайтесь к его содержимому через page.frame_locator.

Если API вернул код ошибки, его описание есть на странице «Коды ошибок», ссылка в конце.

Заключение

Сложность CaptchaFox не в самой капче, а в том, что у неё два сервера и токены у них разного формата. Ошибётесь адресом — задача решится и деньги спишутся, а сайт решение не примет.

Отправляйте отчёты методами reportCorrect и reportIncorrect: по ним сервис определяет, какие решения не подошли.

Полное описание параметров метода — на странице документации: https://rucaptcha.com/api-docs/captchafox

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