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

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

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

Как обойти Funcaptcha

Ник Макбейн
Ник Макбейн

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

Введение

Funcaptcha (Arkose Labs) — одна из самых капризных капч: интерактивные задачи, динамическая генерация, постоянные обновления защиты. Мы заметили, что когда парсер начинает сыпать ERROR_CAPTCHA_UNSOLVABLE, в 80% случаев дело не в коде, а в трёх вещах: устаревшем blob, неправильном userAgent или отсутствии репортов.

Разберём, как настроить обмен с RuCaptcha, чтобы капча решалась стабильно и баланс не утекал впустую.


Шаг 1. Что нужно собрать

Пять параметров критичны. Если хотя бы один некорректен — задача уйдёт в UNSOLVABLE.

Параметр Зачем Где взять
websitePublicKey Идентификатор капчи В коде страницы или запросах к arkoselabs.com
websiteURL Адрес страницы Адресная строка браузера
userAgent Строка браузера для имитации сессии navigator.userAgent в консоли DevTools
data[blob] Временный токен сессии См. Шаг 2
proxy IP-адрес для привязки сессии Ваш прокси-сервер (см. Шаг 3)

Шаг 2. Как получить data[blob]

Blob живёт 1–5 минут и одноразовый. Без него или с просроченным — ошибка гарантирована.

Через Network (надёжнее)

  1. DevTools (F12) → вкладка Network
  2. Фильтр: fc|arkose|enforcement
  3. Ищем запрос enforcement.abc123... или fc/api
  4. В Preview находим "blob"
json Copy
"blob": "B7A24B7D-15EF-41...D3F5"

Через консоль

javascript Copy
console.log(
  document.querySelector('iframe[src*="arkoselabs"]')
    .contentWindow.document.body.innerHTML
    .match(/"blob":"([^"]+)"/)[1]
);

Важно: Не переиспользуйте blob — Arkose это детектит.


Шаг 3. Настройка прокси

Arkose Labs жёстко проверяет IP-репутацию. Дата-центры часто блокируются сразу, поэтому для Funcaptcha критически важно использовать резидентные прокси.

Формат для API: отдельные поля (см. Шаг 4)

Правила:

  • Прокси должен совпадать по гео с websiteURL (если сайт US — прокси US).
  • userAgent и прокси должны принадлежать одной сессии (не смешивайте Chrome/WIN с прокси, который использовался для Firefox/LINUX).
  • Для массовых задач ротируйте прокси, но не меняйте их в середине сессии капчи.

Совет: Нет своего прокси? RuCaptcha предоставляет доступ к пулу резидентных прокси, оптимизированных для работы с капчами. Подключите их в личном кабинете.


Шаг 4. Отправка задачи (API v2)

Работаем только с JSON-форматом. Он стабильнее, возвращает структурированные ошибки и поддерживает расширенные параметры.

Создание задачи

Эндпоинт: POST https://api.rucaptcha.com/createTask

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "FunCaptchaTask",
        "websiteURL": "https://target-site.com/page",
        "websitePublicKey": "YOUR_PUBLIC_KEY",
        "proxyType": "http",
        "proxyAddress": "1.2.3.4",
        "proxyPort": "8080",
        "proxyLogin": "user23",
        "proxyPassword": "p4$w0rd",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
        "data": {
            "blob": "B7A24B7D-15EF-41...D3F5"
        }
    }
}

Ответ придёт сразу: {"errorId":0,"taskId":"123456789"}. Сохраняйте taskId.

Получение результата

Опрашивайте каждые 5–10 секунд:

Эндпоинт: POST https://api.rucaptcha.com/getTaskResult

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "taskId": "123456789"
}

Успешный ответ:

json Copy
{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
    }
}

Шаг 5. Отправка токена на сайт

Полученный token нужно передать целевому сайту. Способ зависит от реализации, но есть два стандартных сценария.

Вариант 1: Инъекция в скрытое поле (JS)

Большинство сайтов хранят токен в скрытом input. Находим его и подставляем значение перед отправкой формы.

javascript Copy
// Находим поле (название может отличаться: funcaptcha_token, arkose_token и т.п.)
const tokenInput = document.querySelector('input[name*="funcaptcha"], input[name*="arkose"]');
if (tokenInput) {
    tokenInput.value = "ВАШ_ТОКЕН_ИЗ_API";
    // Отправляем форму
    tokenInput.closest('form').submit();
}

Вариант 2: Прямой POST на эндпоинт проверки

Если сайт использует AJAX-верификацию, отправляем токен напрямую на URL проверки.

python Copy
import requests

verify_url = "https://target-site.com/api/verify-captcha"
payload = {
    "funcaptcha_token": "ВАШ_ТОКЕН_ИЗ_API",
    "csrf_token": "CSRF_ИЗ_СЕССИИ"  # если требуется
}

headers = {
    "User-Agent": "Mozilla/5.0...",
    "Cookie": "session_id=abc123"  # та же сессия, что и при получении blob
}

response = requests.post(verify_url, json=payload, headers=headers)
print(response.json())

Как узнать точное поле/URL: Откройте DevTools → Network → совершите ручное решение капчи → найдите запрос, который уходит после клика Verify. Скопируйте имя поля и эндпоинт.


Шаг 6. Ошибка ERROR_CAPTCHA_UNSOLVABLE

Воркер не прошёл проверку. Частые причины:

  • Blob устарел → берём новый
  • websitePublicKey/URL не те → копируем из актуальной страницы
  • userAgent пустой или не совпадает с прокси → синхронизируем сессию
  • Прокси заблокирован Arkose → меняем на резидентный
  • Новый тип капчи → шлём репорт

Лайфхак: если ошибка при правильных параметрах, подождите 60–90 сек. Иногда Arkose проводит фоновую проверку сессии.

Причина Решение
Старый blob Обновить, получить новый
Неверный websitePublicKey Скопировать из DOM
Рассинхрон proxy/userAgent Привести к одной сессии
Новый тип задачи Отправить репорт

Логируйте ответы от getTaskResult — через неделю увидите паттерны ошибок.


Шаг 7. Альтернативные методы: подробное руководство по GridTask

Бывает так, что получить токен для Funcaptcha становится непреодолимой задачей ввиду сложной реализации капчи на сайте: динамическая подгрузка iframe, обфускация параметров или блокировка извлечения blob. В этом случае стоит прибегнуть к альтернативному методу решения — сеткой (GridTask).

Когда использовать GridTask вместо стандартного метода

  • Сайт не позволяет извлечь blob из-за CSP или обфускации
  • Капча загружается внутри кросс-доменного iframe с ограниченным доступом
  • Вы работаете с мобильной версией сайта, где структура запросов отличается
  • Стандартный метод возвращает UNSOLVABLE несмотря на корректные параметры
  • Вы автоматизируете взаимодействие с несколькими доменами и хотите универсальное решение

Как работает GridTask

Вместо токена blob вы передаёте полное изображение капчи и текстовую инструкцию на английском языке. Система использует компьютерное зрение и человеческую верификацию для определения координат клика.

Пошаговый алгоритм

1. Получите изображение капчи

  • В DevTools → Network найдите запрос к https://client-api.arkoselabs.com/rtig/image... или https://*.arkoselabs.com/fc/gc/?...
  • Ответ содержит изображение в формате PNG/JPG — скачайте его
  • Конвертируйте в base64 (для Python: base64.b64encode(image_data).decode())
  • Убедитесь, что изображение не обрезано — должна быть видна вся область с заданиями

2. Получите текстовую инструкцию

javascript Copy
// Инструкция обычно находится в заголовке задачи
var taskElement = document.querySelector('.sc-1io4bok-0, .challenge-text, [class*="instruction"]');
var taskText = taskElement ? (taskElement.textContent || taskElement.innerText).trim() : '';
  • Инструкция должна быть на английском! Если сайт на другом языке — переведите ключевую часть
  • Примеры корректных инструкций:
    • pick the image where the darts add up to 8
    • select all pictures with bicycles
    • click on the animal that lives in water

3. Отправьте задачу

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "GridTask",
        "body": "/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXxpZgAA...",
        "comment": "pick the image where the darts add up to 8",
        "imgType": "funcaptcha"
    }
}

Дополнительные параметры (опционально):

  • softId — идентификатор вашего софта для статистики
  • callbackUrl — URL для получения результата через webhook

4. Получите и обработайте ответ

json Copy
{
    "status": 1,
    "request": "click:3"
}

Число после click: — количество кликов, которые нужно эмулировать на странице. Для задач с несколькими правильными ответами формат может быть click:2,5,7.

Как эмулировать клики на странице

После получения ответа необходимо программно кликнуть по нужным ячейкам сетки. Большинство Funcaptcha используют сетку 2x2, 3x3 или 4x4.

javascript Copy
// Пример для сетки 3x3
const clicks = "3"; // или "2,5,7" для нескольких кликов
const indices = clicks.split(',').map(Number);

// Находим контейнер с вариантами ответов
const gridContainer = document.querySelector('.rc-imageselect-table, [class*="grid"], .challenge-body');
const cells = gridContainer.querySelectorAll('img, .rc-imageselect-tile, [role="button"]');

indices.forEach(index => {
    if (cells[index - 1]) {
        cells[index - 1].click();
    }
});

// После кликов часто нужно нажать кнопку Подтвердить
setTimeout(() => {
    const verifyBtn = document.querySelector('.rc-button-submit, button[type="submit"], [class*="verify"]');
    if (verifyBtn) verifyBtn.click();
}, 500);

Типичные ошибки и решения

Проблема Решение
Изображение обрезано или низкого качества Делайте скриншот всей области капчи, убедитесь в разрешении не менее 300x300px
Инструкция на русском/другом языке Переведите только суть задания на английский, не дословно
Ответ приходит, но сайт не принимает Проверьте, что клики эмулируются по тем же координатам, что ожидает сайт; добавьте задержку между кликами
Низкая точность распознавания Уточните инструкцию: вместо выбери животных напишите select all images containing cats
Таймаут задачи GridTask решает дольше (до 60 сек), настройте увеличенный интервал опроса

Важно: Метод Funcaptcha_compare (для задач на сопоставление иконок) временно недоступен. Если ваш сайт использует этот тип — напишите в поддержку.

Подробнее о двух методах: https://rucaptcha.com/blog/funcaptcha-bypass-2-ways-solutions

Шаг 8. Репорты

Репорт = возврат баланса + обучение системы.

Когда отправлять:

  • Сайт отклонил правильный ответ
  • Воркер промахнулся
  • Новый тип задачи

Как:

Copy
POST https://api.rucaptcha.com/reportCorrect
{
    "clientKey": "YOUR_API_KEY",
    "taskId": "123456789"
}

Отправляйте в течение 30 секунд — иначе задача считается принятой.

Чек-лист

  • websitePublicKey актуален
  • websiteURL совпадает
  • userAgent и прокси принадлежат одной сессии
  • blob свежий (< 3 мин)
  • Токен подставляется в правильное поле/эндпоинт
  • Логи настроены
  • Репорты работают
  • Тест на 10–20 капчах пройден

Код

Готовые примеры реализации для популярных языков программирования доступны в официальном репозитории:
https://github.com/2captcha

Базовый пример на Python (стандартный метод с blob)

python Copy
import requests
import time

API_KEY = "YOUR_API_KEY"
CREATE_TASK_URL = f"https://api.rucaptcha.com/createTask"
GET_RESULT_URL = f"https://api.rucaptcha.com/getTaskResult"

def solve_funcaptcha(website_url, public_key, blob, user_agent, proxy):
    # Создаём задачу
    create_payload = {
        "clientKey": API_KEY,
        "task": {
            "type": "FunCaptchaTask",
            "websiteURL": website_url,
            "websitePublicKey": public_key,
            "proxyType": proxy["type"],
            "proxyAddress": proxy["address"],
            "proxyPort": proxy["port"],
            "proxyLogin": proxy.get("login"),
            "proxyPassword": proxy.get("password"),
            "userAgent": user_agent,
            "data": {"blob": blob}
        }
    }
    
    response = requests.post(CREATE_TASK_URL, json=create_payload)
    result = response.json()
    
    if result.get("errorId") != 0:
        raise Exception(f"Ошибка создания задачи: {result}")
    
    task_id = result["taskId"]
    
    # Опрашиваем результат
    while True:
        time.sleep(5)
        result_payload = {
            "clientKey": API_KEY,
            "taskId": task_id
        }
        response = requests.post(GET_RESULT_URL, json=result_payload)
        result = response.json()
        
        if result.get("status") == "ready":
            return result["solution"]["token"]
        elif result.get("errorId") != 0:
            raise Exception(f"Ошибка решения: {result}")

# Использование
token = solve_funcaptcha(
    website_url="https://target-site.com/page",
    public_key="YOUR_PUBLIC_KEY",
    blob="B7A24B7D-15EF-41...D3F5",
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
    proxy={
        "type": "http",
        "address": "1.2.3.4",
        "port": "8080",
        "login": "user",
        "password": "pass"
    }
)
print(f"Получен токен: {token[:50]}...")

Заключение

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

  1. Свежесть данных — blob живёт минуты, publicKey может измениться после обновления сайта. Всегда извлекайте параметры из актуальной сессии.
  2. Единство сессии — userAgent, прокси, cookie и geo должны соответствовать друг другу. Рассинхронизация — частая причина UNSOLVABLE.
  3. Резервный план — если стандартный метод с blob не работает, GridTask позволяет обойти ограничения через визуальное распознавание.
  4. Обратная связь — репорты не только возвращают баланс, но и помогают системе адаптироваться к новым типам задач.
  5. Тестирование — прежде чем запускать массовую автоматизацию, проверьте цепочку на 20–30 запросах с логированием каждого этапа.

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

Рекомендуемый порядок внедрения:

  1. Настройте получение blob и базовую отправку задачи
  2. Протестируйте подстановку токена на целевом сайте
  3. Добавьте обработку ошибок и логирование
  4. Внедрите механизм репортов для возврата баланса
  5. Реализуйте GridTask как резервный метод на случай сбоев основного
  6. Настройте мониторинг и алерты при росте ошибок

Поэтапная отладка сэкономит время и баланс в долгосрочной перспективе, а модульная архитектура кода позволит быстро адаптироваться к изменениям в защите Arkose Labs.