Эта статья была полезной?
Как обойти невидимую reCAPTCHA v2 на сайте Dribbble
Технический специалист
Сайт Dribbble (dribbble.com) использует невидимую версию reCAPTCHA v2 для защиты формы входа от автоматизированных запросов. Главная особенность этого типа капчи заключается в том, что пользователь не видит стандартный чекбокс "Я не робот". Проверка запускается автоматически в фоновом режиме при попытке отправки формы.
Основная сложность обхода заключается в двух вещах: во-первых, сайтkey может быть скрыт глубже в коде, а во-вторых, после получения токена от API его необходимо передать не в скрытое поле, а через специальную JavaScript-функцию (callback), иначе сайт проигнорирует решение и не пропустит форму. В этом руководстве мы разберем все этапы решения этой задачи.
Параметры задачи (API v2)
Для отправки задачи через современный API v2 используется эндпоинт createTask. Тело запроса должно быть в формате JSON.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| clientKey | String | Да | Ваш API-ключ |
| type | String | Да | Тип задачи: RecaptchaV2TaskProxyless или RecaptchaV2Task |
| websiteURL | String | Да | Полный URL целевой веб-страницы, где загружается капча |
| websiteKey | String | Да | Ключ сайта reCAPTCHA. Можно найти в свойстве data-sitekey элемента div |
| isInvisible | Boolean | Да | Для невидимой reCAPTCHA v2 этот параметр должен быть установлен в true |
Как найти параметры
Параметры для reCAPTCHA v2 являются статическими и извлекаются из исходного кода страницы или сетевого трафика.
Способ 1: Через исходный код страницы (вкладка Elements)
- Откройте страницу входа https://dribbble.com/session/new в браузере.
- Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Элементы (Elements).
- Нажмите Ctrl+F (или Cmd+F) и выполните поиск по фразе g-recaptcha или data-sitekey.
- Вы найдете div-элемент, похожий на этот:
- Значение атрибута data-sitekey является вашим websiteKey.
- Скопируйте полный URL из адресной строки браузера. Это будет ваш websiteURL.
Способ 2: Через сетевые запросы (вкладка Network)
- Откройте Инструменты разработчика (F12) и перейдите на вкладку Сеть (Network).
- Включите сохранение логов (Preserve log) и обновите страницу.
- В фильтре введите recaptcha или api.js.
- Найдите запросы к серверам Google, например, к /recaptcha/api2/anchor.
- Нажмите на запрос и перейдите на вкладку Payload или Params.
- В параметрах URL найдите поле k. Его значение и есть ваш websiteKey.
Примеры кода
Python + requests (API v2)
Пример отправки задачи и опроса результата с использованием библиотеки requests через эндпоинты API v2.
python
import requests
import time
API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://dribbble.com/session/new'
WEBSITE_KEY = '6LdmBTIUAAAAAM4NIokaWu8p3BBuYEw3CxuDdyg_'
# 1. Создание задачи через API v2
url = 'https://2captcha.com/createTask'
headers = {
'Content-Type': 'application/json'
}
payload = {
"clientKey": API_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": WEBSITE_URL,
"websiteKey": WEBSITE_KEY,
"isInvisible": True
}
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
if result.get('errorId') == 0:
task_id = result.get('taskId')
print(f"Задача создана, ID: {task_id}")
# 2. Получение результата через API v2
res_url = 'https://2captcha.com/getTaskResult'
while True:
time.sleep(5) # Пауза между запросами
res_payload = {
"clientKey": API_KEY,
"taskId": task_id
}
res_response = requests.post(res_url, headers=headers, json=res_payload).json()
if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
print("Капча успешно решена!")
token = res_response['solution']['gRecaptchaResponse']
print(f"Токен: {token}")
break
elif res_response.get('errorId') != 0:
print(f"Ошибка: {res_response.get('errorDescription')}")
break
else:
# Статус processing - задача еще не готова
continue
else:
print(f"Ошибка создания задачи: {result.get('errorDescription')}")
Python + Playwright
Пример автоматизации, который динамически извлекает sitekey, отправляет задачу через API v2 и внедряет токен через callback.
python
from playwright.sync_api import sync_playwright
import requests
import time
API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://dribbble.com/session/new'
def solve_dribbble_invisible_recaptcha():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
page.goto(TARGET_URL)
# Ожидаем появления виджета reCAPTCHA (даже невидимого, он присутствует в DOM)
page.wait_for_selector('.g-recaptcha', timeout=10000)
# Извлекаем sitekey из атрибута data-sitekey
site_key = page.evaluate("""
() => {
const captchaDiv = document.querySelector('.g-recaptcha');
return captchaDiv ? captchaDiv.getAttribute('data-sitekey') : null;
}
""")
if not site_key:
raise Exception("Не удалось найти sitekey reCAPTCHA на странице.")
print(f"Найден sitekey: {site_key}")
# Отправка в API v2
api_url = 'https://2captcha.com/createTask'
headers = {'Content-Type': 'application/json'}
payload = {
"clientKey": API_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": page.url,
"websiteKey": site_key,
"isInvisible": True
}
}
task_response = requests.post(api_url, headers=headers, json=payload).json()
if task_response.get('errorId') != 0:
raise Exception(f"Ошибка создания задачи: {task_response.get('errorDescription')}")
task_id = task_response.get('taskId')
# Ожидание решения через getTaskResult
res_url = 'https://2captcha.com/getTaskResult'
token = None
for _ in range(20):
time.sleep(5)
res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
if res.get('status') == 'ready':
token = res['solution']['gRecaptchaResponse']
break
if res.get('errorId') != 0:
print(f"Ошибка API: {res.get('errorDescription')}")
break
if token:
print(f"Токен получен: {token}")
# Внедрение токена через callback
page.evaluate(f"""
// 1. Попытка найти и вызвать именованный callback (замените 'yourCallbackName' на реальный, если он есть в data-callback)
if (typeof yourCallbackName === 'function') {{
yourCallbackName("{token}");
}}
// 2. Альтернативный универсальный способ внедрения через внутреннюю структуру grecaptcha
const textarea = document.querySelector('textarea[name="g-recaptcha-response"]');
if (textarea) {{
textarea.value = "{token}";
textarea.dispatchEvent(new Event('change', {{ bubbles: true }}));
}}
console.log("Token injection attempted");
""")
print("Токен передан через callback/DOM.")
else:
print("Не удалось получить токен.")
except Exception as e:
print(f"Ошибка: {e}")
finally:
# browser.close()
if __name__ == '__main__':
solve_dribbble_invisible_recaptcha()
Как использовать полученный токен (Передача через callback)
Невидимая reCAPTCHA v2 на сайте Dribbble, как и на многих других современных сайтах, игнорирует токен, если он просто помещен в скрытое поле формы. Сайт ожидает, что виджет сам сообщит об успешной валидации через вызов функции callback, которая обычно привязана к кнопке отправки формы.
Чтобы реализовать это правильно:
- Изучите исходный код страницы (вкладка Elements). Найдите div с классом g-recaptcha.
- Проверьте, есть ли у него атрибут data-callback="имя_функции". Если есть, просто вызовите эту функцию через page.evaluate, передав ей токен: имя_функции("ВАШ_ТОКЕН").
- Если атрибута data-callback нет, используйте универсальный метод внедрения через внутреннюю структуру ___grecaptcha_cfg или эмуляцию события change, который подробно описан в нашей специализированной статье: Как передать токен reCAPTCHA v2 через callback (https://2captcha.com/h/recaptcha-v2-callback).
Альтернативные способы решения
Помимо прямого API, существуют два дополнительных способа обхода reCAPTCHA v2 на Dribbble, которые могут быть полезны в различных сценариях автоматизации.
1. Расширение для браузера (Captcha Bypass Extension)
Если вы работаете вручную или используете автоматизацию на базе Selenium/Playwright с реальным браузером, вы можете установить наше специальное расширение для обхода капч.
Преимущества:
- Не требует написания кода для перехвата параметров и отправки запросов
- Автоматически определяет появление капчи и решает её в фоновом режиме
- Работает с большинством популярных типов капч, включая невидимую reCAPTCHA v2
- Идеально подходит для ручного серфинга или сложных сценариев автоматизации
Подробнее о расширении: https://2captcha.com/captcha-bypass-extension
2. Browser API (Scraper)
Для сложных задач парсинга, где нужно не только обойти капчу, но и извлечь данные со страницы после успешной авторизации, мы предлагаем Browser API — облачное решение на базе headless-браузеров.
Преимущества:
- Полностью управляемый облачный браузер с встроенной поддержкой обхода капч
- Не нужно настраивать прокси, User-Agent или бороться с блокировками
- Встроенные функции для извлечения данных (скриншоты, HTML, выполнение JavaScript)
- Автоматическое решение капч при навигации по сайту
- Идеально для массового парсинга и сбора данных
Подробнее о Browser API: https://2captcha.com/scraper/browser-api/dashboard
Частые ошибки и решения (API v2)
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| ERROR_KEY_DOES_NOT_EXIST | Неверный или пустой API-ключ. | Проверьте правильность копирования ключа из панели управления. |
| ERROR_ZERO_BALANCE | Недостаточно средств на балансе аккаунта. | Пополните баланс аккаунта. |
| ERROR_INVALID_PARAMETERS | Отсутствуют обязательные параметры или неверный формат JSON. | Убедитесь, что объект task содержит все необходимые поля, включая isInvisible: true. |
| ERROR_GOOGLEKEY | Неверный формат websiteKey или несоответствие домена ключа и URL. | Убедитесь, что ключ начинается с 6L, скопирован без лишних пробелов, а websiteURL точно соответствует домену. |
| ERROR_CAPTCHA_UNSOLVABLE | Капча не может быть решена (истекло время). | Убедитесь, что вы не ждете слишком долго перед отправкой задачи, и что websiteURL актуален. |
| Токен не принимается формой | Неверный способ внедрения токена (сайт ждет callback). | Не полагайтесь только на скрытые поля. Найдите функцию callback в исходном коде или используйте метод из статьи про callback. |
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация API по reCAPTCHA v2: https://2captcha.com/api-docs/recaptcha-v2
- Статья: Как передать токен reCAPTCHA v2 через callback: https://2captcha.com/h/recaptcha-v2-callback
- Расширение для обхода капч: https://2captcha.com/captcha-bypass-extension
- Browser API для парсинга: https://2captcha.com/scraper/browser-api/dashboard
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://2captcha.com/h?category=sites