Эта статья была полезной?
Как обойти 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 (надёжнее)
- DevTools (F12) → вкладка Network
- Фильтр: fc|arkose|enforcement
- Ищем запрос enforcement.abc123... или fc/api
- В Preview находим "blob"
json
"blob": "B7A24B7D-15EF-41...D3F5"
Через консоль
javascript
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
{
"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
{
"clientKey": "YOUR_API_KEY",
"taskId": "123456789"
}
Успешный ответ:
json
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
}
}
Шаг 5. Отправка токена на сайт
Полученный token нужно передать целевому сайту. Способ зависит от реализации, но есть два стандартных сценария.
Вариант 1: Инъекция в скрытое поле (JS)
Большинство сайтов хранят токен в скрытом input. Находим его и подставляем значение перед отправкой формы.
javascript
// Находим поле (название может отличаться: 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
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
// Инструкция обычно находится в заголовке задачи
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
{
"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
{
"status": 1,
"request": "click:3"
}
Число после click: — количество кликов, которые нужно эмулировать на странице. Для задач с несколькими правильными ответами формат может быть click:2,5,7.
Как эмулировать клики на странице
После получения ответа необходимо программно кликнуть по нужным ячейкам сетки. Большинство Funcaptcha используют сетку 2x2, 3x3 или 4x4.
javascript
// Пример для сетки 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. Репорты
Репорт = возврат баланса + обучение системы.
Когда отправлять:
- Сайт отклонил правильный ответ
- Воркер промахнулся
- Новый тип задачи
Как:
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
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 требует внимания к деталям, но при правильной настройке становится предсказуемой. Ключевые принципы стабильного решения:
- Свежесть данных — blob живёт минуты, publicKey может измениться после обновления сайта. Всегда извлекайте параметры из актуальной сессии.
- Единство сессии — userAgent, прокси, cookie и geo должны соответствовать друг другу. Рассинхронизация — частая причина UNSOLVABLE.
- Резервный план — если стандартный метод с blob не работает, GridTask позволяет обойти ограничения через визуальное распознавание.
- Обратная связь — репорты не только возвращают баланс, но и помогают системе адаптироваться к новым типам задач.
- Тестирование — прежде чем запускать массовую автоматизацию, проверьте цепочку на 20–30 запросах с логированием каждого этапа.
Funcaptcha продолжает эволюционировать, но подход, основанный на актуальных параметрах, синхронизированной сессии и готовности переключаться между методами, обеспечивает надёжность даже в условиях частых обновлений защиты.
Рекомендуемый порядок внедрения:
- Настройте получение blob и базовую отправку задачи
- Протестируйте подстановку токена на целевом сайте
- Добавьте обработку ошибок и логирование
- Внедрите механизм репортов для возврата баланса
- Реализуйте GridTask как резервный метод на случай сбоев основного
- Настройте мониторинг и алерты при росте ошибок
Поэтапная отладка сэкономит время и баланс в долгосрочной перспективе, а модульная архитектура кода позволит быстро адаптироваться к изменениям в защите Arkose Labs.