Эта статья была полезной?
Как обойти CaptchaFox с помощью Playwright
Технический специалист
CaptchaFox обычно появляется на странице перед отправкой формы: пока проверка не пройдена, форму отправить нельзя. Пройденная проверка даёт токен, и сайт его сверяет.
В этом руководстве мы пройдём весь путь в Playwright на Python: найдём ключ сайта, отправим задачу в API RuCaptcha и получим токен. У CaptchaFox есть особенность, из-за которой обход чаще всего и не работает с первого раза: у капчи два разных сервера, и токены у них разные. Разберём, как понять, какой нужен вам.
Что понадобится
- Python 3.7 или выше
- Установленный Playwright
- Аккаунт и API-ключ от RuCaptcha
- URL целевой страницы
- Прокси. Для CaptchaFox он обязателен, без него метод не работает
Шаг 1. Установка зависимостей
Установите библиотеки и браузеры Playwright:
bash
pip install playwright 2captcha-python
playwright install chromium
Шаг 2. Инициализация браузера и переход на страницу
Прокси для CaptchaFox обязателен, без него запрос не пройдет. Тот же прокси поставьте и в браузер — сервис решает капчу с вашего адреса, и адреса должны совпадать. Второй обязательный параметр - User-Agent, он должен быть тем же, которым вы открываете сайт.
python
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
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
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
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
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "7828075fb55ecbd9146745ee6f2bec475b88076d36e23050f1fb28359ffca15d"
}
}
Альтернатива (прямой HTTP-запрос):
Если вы не используете SDK, отправьте запрос через curl или библиотеку requests. Тип задачи один — CaptchaFoxTask, прокси в нём тоже обязателен.
bash
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
page.evaluate("""(token) => {
const field = document.querySelector('SELECTOR_TOKEN');
if (!field) {
throw new Error('Поле для токена на странице не найдено');
}
field.value = token;
}""", token)
Если поля нет, а капча вызывает функцию обратного вызова, вызовите её сами. Имя функции подставьте своё вместо CALLBACK.
python
page.evaluate("""(token) => {
if (typeof CALLBACK !== 'function') {
throw new Error('Функция обратного вызова не найдена');
}
CALLBACK(token);
}""", token)
Проверка нужна в обоих случаях: без неё скрипт отправит форму без токена и сообщит об успешной отправке.
Дальше отправьте форму. Селектор кнопки подставьте свой.
python
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")
О результате стоит сообщить сервису. В SDK для этого есть метод report, в API — методы reportCorrect и reportIncorrect. Идентификатор задачи лежит в том же ответе, что и токен: solver.report(result['captchaId'], True).
Полный рабочий пример (Python)
python
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
Полезные ссылки
- Документация API RuCaptcha по CaptchaFox: https://rucaptcha.com/api-docs/captchafox
- Как обойти CaptchaFox: https://rucaptcha.com/p/captchafox-solver
- Работа с прокси: https://rucaptcha.com/api-docs/proxy
- Коды ошибок: https://rucaptcha.com/api-docs/error-codes
- Отладка: https://rucaptcha.com/api-docs/debugging
- Python SDK RuCaptcha на GitHub: https://github.com/2captcha/2captcha-python