Эта статья была полезной?
Как решить reCAPTCHA v2 на Quora
Технический специалист
Введение
Quora — одна из крупнейших платформ для обмена знаниями, которая активно использует reCAPTCHA v2 для защиты форм регистрации, входа в аккаунт и иногда даже при чтении ответов после превышения лимита запросов.
Поскольку Quora построена как современное SPA (Single Page Application) на базе React, стандартный подход с простой вставкой токена в скрытое input поле здесь не сработает. Токен необходимо передавать строго через callback-функцию, которую ожидает фреймворк сайта.
В этом руководстве мы разберем, как получить необходимые параметры, решить капчу через API 2Captcha и корректно внедрить токен в Quora с помощью Python.
Параметры задачи
Для обхода reCAPTCHA v2 на Quora используется тип задачи RecaptchaV2TaskProxyless (если вы не используете свои прокси) или RecaptchaV2Task.
json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://www.quora.com/",
"websiteKey": "6Lcbz34UAAAAAL8AdJSo8BkXQ-pUMfr7OfbTZCY8"
}
}
Как найти параметры
websiteURL
Это полный адрес страницы, на которой появляется капча. Для Quora это может быть главная страница (https://www.quora.com/) или конкретная страница входа (https://www.quora.com/login).
websiteKey (SiteKey)
Это публичный ключ reCAPTCHA. На Quora он статичен, но если вы настраиваете автоматизацию для другого сайта, вот как его найти:
- Откройте страницу с капчей и нажмите F12 (DevTools).
- Перейдите на вкладку Elements.
- Нажмите Ctrl+F (или Cmd+F) и введите data-sitekey.
- Скопируйте значение атрибута. Для Quora это 6Lcbz34UAAAAAL8AdJSo8BkXQ-pUMfr7OfbTZCY8.
Альтернативный способ: Перейдите на вкладку Network, отфильтруйте по Fetch/XHR и найдите запрос к google.com/recaptcha/anchor. В параметрах запроса (Query String Parameters) будет указан параметр k — это и есть ваш websiteKey.
Критически важный шаг: Передача токена через Callback
Это самый важный раздел для понимания работы с Quora и другими современными SPA-приложениями.
Почему стандартный подход не работает
В классических HTML-формах reCAPTCHA v2 работает так: после решения капчи Google вызывает callback-функцию, которая записывает токен в скрытое поле g-recaptcha-response, и при отправке формы этот токен попадает на сервер.
Но Quora использует React, и форма не отправляется стандартным способом через submit. Вместо этого React-компонент перехватывает ввод пользователя и отправляет данные через JavaScript (fetch или XMLHttpRequest). Если вы просто вставите токен в скрытое поле, React его не увидит, потому что состояние компонента не обновится.
Как работает callback в reCAPTCHA v2
Когда вы инициализируете reCAPTCHA на странице, вы указываете callback-функцию. После решения капчи Google вызывает эту функцию и передает в нее токен. React-приложение обновляет свое состояние, и кнопка отправки формы становится активной.
Если вы не вызовете callback, токен будет записан только в скрытое поле, но React об этом не узнает. Кнопка останется неактивной, и форма не отправится.
Подробная инструкция по вызову callback
В современных приложениях callback-функция хранится в глобальном объекте ___grecaptcha_cfg. Вам нужно рекурсивно обойти этот объект и найти функцию с именем callback, затем вызвать её с полученным токеном.
Подробная инструкция с примерами кода для поиска и вызова callback https://rucaptcha.com/h/recaptcha-v2-callback
Примеры кода
Python + requests (Получение токена через API)
Если вам нужно просто получить токен на бэкенде (например, для передачи его на фронтенд), используйте этот код.
python
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
from twocaptcha import TwoCaptcha
api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
solver = TwoCaptcha(api_key)
try:
result = solver.recaptcha(
sitekey='6Lcbz34UAAAAAL8AdJSo8BkXQ-pUMfr7OfbTZCY8',
url='https://www.quora.com/'
)
print(f"Токен успешно получен: {result['code']}")
# Здесь вы можете передать result['code'] на фронтенд или использовать в API запросе
except Exception as e:
print(f"Произошла ошибка: {e}")
Python + Playwright (Автоматизация браузера)
Для полноценного обхода на Quora мы будем использовать Playwright. Этот код открывает браузер и решает капчу. После получения токена его нужно внедрить через callback (см. инструкцию по ссылке выше).
python
import asyncio
from playwright.async_api import async_playwright
from twocaptcha import TwoCaptcha
API_KEY = 'YOUR_API_KEY'
SITE_KEY = '6Lcbz34UAAAAAL8AdJSo8BkXQ-pUMfr7OfbTZCY8'
PAGE_URL = 'https://www.quora.com/login'
async def solve_captcha():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto(PAGE_URL)
# Ждем появления iframe с капчей
await page.wait_for_selector('iframe[src*="recaptcha"]', timeout=10000)
# Решаем капчу через API
solver = TwoCaptcha(API_KEY)
result = solver.recaptcha(sitekey=SITE_KEY, url=PAGE_URL)
token = result['code']
print(f"Капча решена! Токен: {token}")
# Здесь нужно внедрить токен через callback
# Подробная инструкция: https://2captcha.com/h/recaptcha-v2-callback
await asyncio.sleep(5) # Пауза для проверки результата
await browser.close()
asyncio.run(solve_captcha())
Отчеты о правильности решения
Если сайт отклонил полученный токен, обязательно сообщите об этом. Это помогает сервису улучшать алгоритмы и возвращает вам средства за неудачную попытку. Отправить отчет можно через личный кабинет или напрямую через API.
Отправка отчетов через HTTP-запросы
API 2Captcha предоставляет два эндпоинта для отправки отчетов:
- https://api.rucaptcha.com/reportIncorrect — для неверных решений
- https://api.rucaptcha.com/reportCorrect — для верных решений
Отчет о неверном решении (reportIncorrect)
Используется, если сайт отклонил токен или снова вернул страницу с капчей. Средства за задачу будут возвращены на ваш баланс.
JSON-запрос:
json
{
"clientKey": "YOUR_API_KEY",
"taskId": "TASK_ID_FROM_CREATE_TASK"
}
Отправка через Python (requests):
python
import requests
API_KEY = "YOUR_API_KEY"
TASK_ID = "123456789"
response = requests.post(
"https://api.rucaptcha.com/reportIncorrect",
json={
"clientKey": API_KEY,
"taskId": TASK_ID
}
)
print(response.json())
# Ожидаемый ответ: {"request": "OK_REPORT_SUBMITTED", "status": "reported"}
Отчет о правильном решении (reportCorrect)
Используется, если сайт принял токен без ошибок. Это помогает сервису поддерживать высокое качество распознавания.
JSON-запрос:
json
{
"clientKey": "YOUR_API_KEY",
"taskId": "TASK_ID_FROM_CREATE_TASK"
}
Отправка через Python (requests):
python
import requests
API_KEY = "YOUR_API_KEY"
TASK_ID = "123456789"
response = requests.post(
"https://api.rucaptcha.com/reportCorrect",
json={
"clientKey": API_KEY,
"taskId": TASK_ID
}
)
print(response.json())
# Ожидаемый ответ: {"request": "OK_REPORT_SUBMITTED", "status": "reported"}
Подробный гайд по отправке отчетов с примерами для разных языков: https://2captcha.com/h/how-to-submit-reports
Частые ошибки и решения
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| Токен получен, но Quora просит пройти капчу снова | Токен не был передан через callback, либо время жизни токена истекло | Убедитесь, что вы используете JS-скрипт для вызова callback (см. раздел выше). Токены reCAPTCHA v2 живут 1-2 минуты, используйте их сразу |
| ERROR_WRONG_USER_KEY | Неверный API-ключ | Проверьте, что вы используете правильный ключ от 2Captcha |
| ERROR_ZERO_BALANCE | Недостаточно средств на балансе | Пополните счет в личном кабинете 2Captcha |
| Callback не вызывается, кнопка неактивна | Структура ___grecaptcha_cfg отличается от стандартной | Изучите объект ___grecaptcha_cfg.clients вручную через консоль браузера и адаптируйте поиск функции |
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация по reCAPTCHA v2: https://2captcha.com/api-docs/recaptcha-v2
- Как передать токен через callback: https://2captcha.com/h/recaptcha-v2-callback
- Подробный гайд по отправке отчетов: https://2captcha.com/h/how-to-submit-reports
- Библиотека для Python: https://github.com/2captcha/2captcha-python
- Библиотека для Node.js: https://github.com/2captcha/2captcha-javascript