Как обойти Friendly Captcha
Friendly Captcha становится всё популярнее благодаря приватности и отсутствию взаимодействия с пользователем. Однако для разработчиков парсеров, тестировщиков и автоматизаторов это создаёт новые вызовы.
В этом руководстве мы разберём, как корректно обходить обе версии Friendly Captcha (v1 и v2) с помощью API, избегая типичных ошибок и обеспечивая стабильную работу ваших скриптов.
Что такое Friendly Captcha и как она работает
Friendly Captcha — это система защиты от ботов, основанная на криптографическом доказательстве выполнения работы (Proof-of-Work). В отличие от традиционных капч, она:
- Работает в фоновом режиме без участия пользователя
- Не использует cookies, fingerprinting или поведенческий анализ
- Генерирует токен после выполнения вычислительной задачи на устройстве клиента
Для автоматизации это означает: чтобы получить валидный токен, необходимо либо эмулировать выполнение PoW-задачи, либо использовать специализированный сервис решения.
Зачем использовать API для обхода
Наш API берёт на себя всю сложность взаимодействия с капчей:
- Принимает параметры страницы (URL, ключ сайта, версию)
- Эмулирует или решает криптографическую задачу на стороне сервера
- Возвращает готовый токен для внедрения в форму или вызова 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
<!-- 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
<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
{
"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
{
"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
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
// Стандартное имя поля
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
if (typeof window.onDone === 'function') {
window.onDone('ВАШ_ТОКЕН');
}
Вариант 3: Отправка формы
javascript
// Нативная отправка
document.querySelector('form')?.submit();
// Или через Selenium (Python)
# driver.find_element(By.CSS_SELECTOR, "form").submit()
Критически важно: блокировка нативного виджета
Если виджет Friendly Captcha загрузится и инициализируется параллельно с вашим токеном, это может привести к:
- Конфликту токенов и отклонению решения
- Повторной генерации PoW-задачи
- Срабатыванию дополнительных защитных механизмов
Способы блокировки
Через Puppeteer (Node.js)
javascript
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
driver.execute_cdp_cmd('Network.setBlockedURLs', {
"urls": ["*friendlycaptcha*widget*.js"]
})
driver.execute_cdp_cmd('Network.enable', {})
Через Playwright
python
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 минут в рабочее время.