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

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

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

Как обойти Friendly Captcha

Как обойти Friendly Captcha

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

В этом руководстве мы разберём, как корректно обходить обе версии Friendly Captcha (v1 и v2) с помощью API, избегая типичных ошибок и обеспечивая стабильную работу ваших скриптов.


Что такое Friendly Captcha и как она работает

Friendly Captcha — это система защиты от ботов, основанная на криптографическом доказательстве выполнения работы (Proof-of-Work). В отличие от традиционных капч, она:

  • Работает в фоновом режиме без участия пользователя
  • Не использует cookies, fingerprinting или поведенческий анализ
  • Генерирует токен после выполнения вычислительной задачи на устройстве клиента

Для автоматизации это означает: чтобы получить валидный токен, необходимо либо эмулировать выполнение PoW-задачи, либо использовать специализированный сервис решения.


Зачем использовать API для обхода

Наш API берёт на себя всю сложность взаимодействия с капчей:

  1. Принимает параметры страницы (URL, ключ сайта, версию)
  2. Эмулирует или решает криптографическую задачу на стороне сервера
  3. Возвращает готовый токен для внедрения в форму или вызова callback-функции

Это позволяет интегрировать решение капчи в любые сценарии: парсинг, QA-тестирование, RPA-процессы.


Поддержка версий v1 и v2: в чём разница

Friendly Captcha эволюционирует, и важно корректно определять версию на целевом сайте.

Характеристика v1 v2
URL скрипта cdn.jsdelivr.net/npm/friendly-challenge@* cdn.friendlycaptcha.com/v2/*
Архитектура Монолитный виджет Модульная система с улучшенной безопасностью
Инициализация Автоматическая при загрузке DOM Требует явного вызова или настройки
Когда использовать Устаревшие внедрения (до 2024 г.) Новые сайты и обновления

Важно: Если параметр version не указан в запросе, API по умолчанию использует v1. Это может привести к ошибке на сайтах с v2.

Как определить версию на странице

Откройте DevTools → вкладка Sources или Network и найдите подключение скрипта:

html Copy
<!-- Friendly Captcha v1 -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/widget.module.min.js" type="module"></script>

<!-- Friendly Captcha v2 -->
<script src="https://cdn.friendlycaptcha.com/v2/widget.module.min.js" type="module"></script>

Также проверьте атрибуты контейнера:

html Copy
<div 
  class="frc-captcha" 
  data-apikey="2FZFEVS1FZCGQ9"
  data-callback="onCaptchaDone"
  data-solution-field-name="custom_solution_field"
></div>

Значение data-apikey — это ваш websiteKey для API-запроса.


Типы задач в API

Мы предлагаем два типа задач в зависимости от требований к прокси:

FriendlyCaptchaTaskProxyless

  • Не требует настройки прокси
  • Использует внутренний пул ротационных прокси
  • Идеален для большинства сценариев

FriendlyCaptchaTask

  • Позволяет указать свой прокси (HTTP / HTTPS/ SOCKS5)
  • Необходим для гео-таргетинга или авторизованных запросов
  • Требует передачи параметров proxyType, proxyAddress, proxyPort

Параметры запроса

Параметр Тип Обязателен Описание
type String Да FriendlyCaptchaTaskProxyless или FriendlyCaptchaTask
websiteURL String Да Полный URL страницы с капчей
websiteKey String Да Значение атрибута data-apikey
version String Нет "v1" или "v2" (по умолчанию v1)
moduleScript String Нет URL скрипта type="module" (повышает надёжность)
nomoduleScript String Нет URL резервного скрипта для старых браузеров
proxyType / proxyAddress / proxyPort String / Number Да* Только для типа FriendlyCaptchaTask

* Параметры прокси обязательны только при использовании FriendlyCaptchaTask.


Примеры API-запросов

Запрос для Friendly Captcha v1 (без прокси)

json Copy
{
  "clientKey": "ВАШ_АПИ_КЛЮЧ",
  "task": {
    "type": "FriendlyCaptchaTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "2FZFEVS1FZCGQ9",
    "version": "v1",
    "moduleScript": "https://cdn.jsdelivr.net/npm/[email protected]/widget.module.min.js",
    "nomoduleScript": "https://cdn.jsdelivr.net/npm/[email protected]/widget.js"
  }
}

Запрос для Friendly Captcha v2 (с использованием прокси)

json Copy
{
  "clientKey": "ВАШ_АПИ_КЛЮЧ",
  "task": {
    "type": "FriendlyCaptchaTask",
    "websiteURL": "https://example.com/checkout",
    "websiteKey": "9XKPL2M4NQRS7T",
    "version": "v2",
    "moduleScript": "https://cdn.friendlycaptcha.com/v2/widget.module.min.js",
    "nomoduleScript": "https://cdn.friendlycaptcha.com/v2/widget.js",
    "proxyType": "http",
    "proxyAddress": "192.168.1.100",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "pass"
  }
}

Полный цикл работы на Python

python Copy
import requests
import time

API_KEY = "ваш_ключ"
WEBSITE_URL = "https://example.com/login"
WEBSITE_KEY = "2FZFEVS1FZCGQ9"

# Шаг 1: Создание задачи
response = requests.post(
    "https://api.rucaptcha.com/createTask",
    json={
        "clientKey": API_KEY,
        "task": {
            "type": "FriendlyCaptchaTaskProxyless",
            "websiteURL": WEBSITE_URL,
            "websiteKey": WEBSITE_KEY,
            "version": "v2",
            "moduleScript": "https://cdn.friendlycaptcha.com/v2/widget.module.min.js",
            "nomoduleScript": "https://cdn.friendlycaptcha.com/v2/widget.js"
        }
    }
)
task_id = response.json()["taskId"]

# Шаг 2: Ожидание результата
while True:
    result = requests.post(
        "https://api.rucaptcha.com/getTaskResult",
        json={
            "clientKey": API_KEY,
            "taskId": task_id
        }
    )
    data = result.json()
    
    if data["status"] == "ready":
        token = data["solution"]["token"]
        break
    elif data["status"] == "processing":
        time.sleep(5)
    else:
        raise Exception(f"Ошибка: {data.get('errorDescription')}")

print(f"Токен получен: {token[:30]}...")

Как использовать полученный токен

После получения токена его необходимо корректно внедрить в страницу.

Вариант 1: Заполнение скрытого поля

javascript Copy
// Стандартное имя поля
document.querySelector('input[name="frc-captcha-solution"]').value = 'ВАШ_ТОКЕН';

// Или кастомное имя из data-solution-field-name
const fieldName = document.querySelector('.frc-captcha')?.dataset?.solutionFieldName || 'frc-captcha-solution';
document.querySelector(`input[name="${fieldName}"]`).value = 'ВАШ_ТОКЕН';

Вариант 2: Вызов callback-функции

Если в контейнере указан data-callback="onDone":

javascript Copy
if (typeof window.onDone === 'function') {
    window.onDone('ВАШ_ТОКЕН');
}

Вариант 3: Отправка формы

javascript Copy
// Нативная отправка
document.querySelector('form')?.submit();

// Или через Selenium (Python)
# driver.find_element(By.CSS_SELECTOR, "form").submit()

Критически важно: блокировка нативного виджета

Если виджет Friendly Captcha загрузится и инициализируется параллельно с вашим токеном, это может привести к:

  • Конфликту токенов и отклонению решения
  • Повторной генерации PoW-задачи
  • Срабатыванию дополнительных защитных механизмов

Способы блокировки

Через Puppeteer (Node.js)

javascript Copy
await page.setRequestInterception(true);
page.on('request', req => {
  if (req.url().includes('friendlycaptcha') && req.url().includes('widget')) {
    req.abort();
  } else {
    req.continue();
  }
});

Через Selenium + CDP (Python)

python Copy
driver.execute_cdp_cmd('Network.setBlockedURLs', {
    "urls": ["*friendlycaptcha*widget*.js"]
})
driver.execute_cdp_cmd('Network.enable', {})

Через Playwright

python Copy
await page.route("**/*friendlycaptcha*widget*.js", lambda route: route.abort())

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

Проблема Возможная причина Решение
Токен отклоняется Несоответствие версии Укажите корректный version: "v2" и проверьте URL скриптов
Callback не срабатывает Функция не в глобальной области Убедитесь, что onDone доступна как window.onDone
Конфликт с виджетом Виджет загружается параллельно Заблокируйте запросы к скриптам капчи до внедрения токена
Ошибка прокси Неверные данные подключения Проверьте формат, порт и учётные данные прокси

Лучшие практики

Всегда указывайте version — не полагайтесь на значение по умолчанию
Передавайте moduleScript и nomoduleScript — повышает точность и скорость решения
Блокируйте нативный виджет — предотвращает конфликты и повторную инициализацию
Используйте Proxyless, когда возможно — проще в настройке и стабильнее
Тестируйте в инкогнито-режиме — исключает влияние кэша и расширений браузера
Обрабатывайте ошибки API — проверяйте status и errorDescription в ответах


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


Заключение

Важно: Данная статья носит исключительно образовательный характер. При использовании методов обхода капчи соблюдайте условия использования целевых сайтов и законодательство вашей юрисдикции. Ответственное тестирование и автоматизация помогают улучшать качество веб-сервисов, но не должны использоваться для злоупотреблений.


Поддержка

Мы ценим обратную связь и готовы помочь с интеграцией:

Обычно отвечаем в течение 15 минут в рабочее время.