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

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

Как обойти Funcaptcha

Ник Макбейн

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

Введение

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

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


Шаг 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).
  • Для массовых задач ротируйте прокси, но не меняйте их в середине сессии капчи.

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


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

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

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

Эндпоинт: POST https://api.2captcha.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.2captcha.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.2captcha.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.2captcha.com/createTask"
GET_RESULT_URL = f"https://api.2captcha.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.