Туториалы по обходу капчи

Как обойти 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/friendly-challenge@0.9.1/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/friendly-challenge@0.9.1/widget.module.min.js",
    "nomoduleScript": "https://cdn.jsdelivr.net/npm/friendly-challenge@0.9.1/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 минут в рабочее время.