Руководства
Использование токена reCAPTCHA
Эта страница переведена с китайской версии машинным переводом и может содержать ошибки. Приоритет имеет китайская версия.
gRecaptchaResponse, который возвращает YesCaptcha, — это то самое значение, которое Google передаёт странице после прохождения капчи. Получив его, нужно отправить его на целевой сайт (не в Google и не в YesCaptcha) так же, как это делает браузер: сайт проверяет токен через Google и пропускает вас. Есть два способа: отправить запрос самостоятельно или подставить токен в страницу в реальном браузере и отправить форму.
Принцип работы
Заголовок раздела «Принцип работы»При обычном посещении:
- Страница загружает reCAPTCHA, пользователь проходит проверку;
- Google выдаёт странице токен, а страница помещает его в поле
g-recaptcha-response(или передаёт в callback-функцию); - Пользователь отправляет форму, и токен уходит на сервер сайта вместе с ней;
- Сервер сайта проверяет токен через Google и, если проверка успешна, пропускает пользователя.
При работе с YesCaptcha шаги 1 и 2 выполняем мы: вы создаёте задачу с websiteURL и websiteKey, получаете токен и продолжаете с шага 3.
Способ 1: отправить запрос самостоятельно (рекомендуется)
Заголовок раздела «Способ 1: отправить запрос самостоятельно (рекомендуется)»- Один раз выполните действие вручную в браузере: откройте панель Network (F12), пройдите капчу, отправьте форму и найдите запрос, который отправляет форму.
- В Payload (или Form Data) запроса найдите поле с токеном — обычно оно называется
g-recaptcha-response, а токен начинается с03A. Некоторые сайты переименовывают поле, например вgrecaptcharesponseилиcaptcha. - Отправьте из своей программы такой же запрос, подставив в это поле токен, полученный от YesCaptcha. Остальные поля, Cookie и заголовки тоже должны совпадать с браузерными: сайты часто проверяют и их.
Полный пример на демо-странице Google: сначала получаем токен, затем отправляем его обратно на демо-страницу в поле g-recaptcha-response:
"""Solve reCAPTCHA v2 on Google's demo page and submit the token with plain HTTP (no browser).
Run: pip install requests export YESCAPTCHA_CLIENT_KEY=your_client_key python recaptcha_requests.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport time
import requests
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]API = "https://api.yescaptcha.com"WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"WEBSITE_KEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
def call(method, payload): data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def get_token(): task = {"type": "NoCaptchaTaskProxyless", "websiteURL": WEBSITE_URL, "websiteKey": WEBSITE_KEY} task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): # poll every 5 seconds, for up to about 3 minutes time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"]["gRecaptchaResponse"] raise TimeoutError(task_id)
token = get_token()print("token:", token[:40], "...")
# Submit the token the same way the browser does: the demo form posts the field# "g-recaptcha-response" back to the page. Check your own site's request in DevTools > Network.page = requests.post(WEBSITE_URL, data={"g-recaptcha-response": token}, timeout=30)print("passed" if "Verification Success" in page.text else "not passed", page.status_code)Способ 2: подставить токен в страницу (Selenium и аналоги)
Заголовок раздела «Способ 2: подставить токен в страницу (Selenium и аналоги)»Если вы управляете реальным браузером через Selenium, Playwright и подобные инструменты:
- Прочитайте
data-sitekeyсо страницы и создайте задачу, чтобы получить токен. - Запишите токен в текстовое поле
g-recaptcha-responseна странице. - Если на странице задана callback-функция (
data-callback="..."), вызовите её, передав токен; на некоторых сайтах кнопка отправки становится активной только после вызова callback. - Отправьте форму.
// Step 2: write the token (run in the page)document.getElementById('g-recaptcha-response').value = 'TOKEN';// Step 3: call the callback if there is one, e.g. data-callback="onSuccess"onSuccess('TOKEN');Если на странице несколько reCAPTCHA, id поля может выглядеть как g-recaptcha-response-1. Если поле не находится, один раз пройдите капчу вручную и найдите 03A в панели Elements — так вы увидите, где сохраняется результат. Как найти callback-функцию, описано в разделе Поиск параметров reCAPTCHA.
Полный пример (Selenium 4):
"""Solve reCAPTCHA v2 on Google's demo page in a real browser with Selenium 4:get a token from YesCaptcha, put it into the page, then submit the form.
Run: pip install requests selenium export YESCAPTCHA_CLIENT_KEY=your_client_key python recaptcha_selenium.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport time
import requestsfrom selenium import webdriverfrom selenium.webdriver.common.by import By
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]API = "https://api.yescaptcha.com"WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
def call(method, payload): data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def get_token(website_url, website_key): task = {"type": "NoCaptchaTaskProxyless", "websiteURL": website_url, "websiteKey": website_key} task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"]["gRecaptchaResponse"] raise TimeoutError(task_id)
driver = webdriver.Chrome() # Selenium 4 downloads a matching chromedriver automaticallytry: driver.get(WEBSITE_URL) site_key = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey") token = get_token(WEBSITE_URL, site_key)
# Put the token where reCAPTCHA keeps it ... driver.execute_script( "document.getElementById('g-recaptcha-response').value = arguments[0];", token ) # ... and, if the page uses a callback (data-callback="..."), call it: callback = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-callback") if callback: driver.execute_script(f"window[{callback!r}](arguments[0]);", token)
driver.find_element(By.ID, "recaptcha-demo-submit").click() time.sleep(2) print("passed" if "Verification Success" in driver.page_source else "not passed")finally: driver.quit()reCAPTCHA v3
Заголовок раздела «reCAPTCHA v3»В v3 нет чекбокса: страница сама вызывает grecaptcha.execute(ключ_сайта, {action: '...'}), когда ей нужен токен, и помещает его в собственный запрос (имя поля определяет сайт; чаще всего это g-recaptcha-response, token или recaptchaToken). Действуйте как в способе 1: найдите в панели Network запрос с токеном и воспроизведите его. При создании задачи pageAction должен совпадать с action на странице.
Токен отправлен, но проверка не проходит
Заголовок раздела «Токен отправлен, но проверка не проходит»- Токен просрочен: отправляйте его сразу после получения, не позже чем через 60 секунд.
- Вы отправили не то поле, которое проверяет сайт, или пропустили другие поля и Cookie: сверьте запрос с браузерным по каждому полю.
- Сайт также проверяет IP, User-Agent и т. п.: используйте тип со своим прокси (например,
NoCaptchaTask) и отправляйте токен через тот же прокси. - Низкий скор в v3: проверьте
pageActionили используйте тип с фиксированным высоким скором, см. reCAPTCHA v3. - Защита сайта учитывает и другие поведенческие сигналы. Если токены проходят редко, перейдите на распознавание изображений и кликайте в реальном браузере либо используйте расширение браузера.