Как решить reCAPTCHA v3 в Python и задать action

reCAPTCHA v3 никогда не показывает проверку. Она работает в фоновом режиме и передаёт сайту токен, который затем проверяется на стороне сервера. Для вашего кода это означает, что нажимать и рассматривать нечего, поэтому вся задача сводится к получению токена, который сайт примет. В Python это точно так же recaptcha метод, который вы использовали бы для v2, с флагом версии.
Больше всего людей сбивает с толку action.
Настройка
# Python 3.10 or newer. pip install capskip
from capskip import CapSkip
solver = CapSkip(
host="127.0.0.1",
port=8080,
recaptchaTimeout=300, # seconds, shared with Turnstile and GeeTest
)CapSkip работает на вашем собственном компьютере, поэтому десктопное приложение должно быть открыто, прежде чем всё это заработает.
Базовый вызов
result = solver.recaptcha(
sitekey="6Lc...YOUR_SITEKEY",
url="https://example.com/checkout",
version="v3",
action="submit",
)
print(result["code"]) # the v3 tokenДва отличия от v2. version="v3" обязателен, и action должен совпадать с тем, что страница передаёт в grecaptcha.execute. Если вы его опустите, значением по умолчанию будет verify.
Почему действие имеет значение
Действия v3 — это метки, которые сайт присваивает каждому защищённому взаимодействию, чтобы вход и оформление заказа можно было оценивать отдельно. Собственный бэкенд сайта обычно проверяет, что действие в возвращённом токене совпадает с действием, ожидаемым для этого эндпоинта.
Отправьте не то — и токен будет технически действителен, но придёт с меткой для другого взаимодействия, что многие бэкенды отклоняют сразу. Считывайте настоящее значение со страницы, а не угадывайте:
import re
import requests
html = requests.get("https://example.com/checkout").text
# Sites usually call execute() with the action as a literal string.
match = re.search(r"execute\([^,]+,\s*\{\s*action:\s*['\"]([^'\"]+)", html)
action = match.group(1) if match else "verify"
result = solver.recaptcha(
sitekey=sitekey, url=page_url, version="v3", action=action,
)Обычные значения — login, submit, homepage и checkout, но это произвольные строки, выбранные тем, кто создавал сайт.
Enterprise v3
Enterprise — это ортогональный флаг, а не отдельный продукт, поэтому он добавляется поверх:
result = solver.recaptcha(
sitekey=sitekey,
url=page_url,
version="v3",
enterprise=1,
action="submit",
)Enterprise можно отличить от стандартной по скрипту, который загружает страница. Enterprise подгружает enterprise.js, стандартный извлекает api.js. Неверное предположение приводит к сбою решения, а не к возврату неверного токена, поэтому проверить недорого.
Отправка токена
import requests
response = requests.post(
"https://example.com/checkout",
data={
"g-recaptcha-response": result["code"],
"order_id": "...",
},
)Некоторые интеграции v3 используют другое имя поля или отправляют токен в виде JSON, потому что стандартного виджета формы, который бы их ограничивал, нет. Проверьте, что делает собственный JavaScript страницы, прежде чем делать выводы g-recaptcha-response.
Массовое решение
Python — единственный SDK CapSkip, где AsyncCapSkip это настоящий асинхронный клиент, а не псевдоним, поэтому он действительно распараллеливает работу:
import asyncio
from capskip import AsyncCapSkip
async def main():
solver = AsyncCapSkip()
tokens = await asyncio.gather(*[
solver.recaptcha(sitekey=sitekey, url=u, version="v3", action="submit")
for u in urls
])
return [t["code"] for t in tokens]
asyncio.run(main())Ошибки
from capskip import (
ValidationException, NetworkException, ApiException, TimeoutException,
)
try:
result = solver.recaptcha(sitekey=sitekey, url=page_url, version="v3")
except ValidationException:
pass # missing sitekey or url
except NetworkException:
pass # CapSkip is not running
except ApiException:
pass # rejected sitekey or pageurl
except TimeoutException:
pass # exceeded recaptchaTimeoutЧасто задаваемые вопросы
Что произойдёт, если я не укажу action?
По умолчанию используется verify. Это работает на сайтах, которые никогда не проверяют action, и не работает на тех, которые проверяют. Поскольку чтение реального значения со страницы — это несколько строк, лучше сделать это, чем полагаться на значение по умолчанию.
Могу ли я проверить оценку перед отправкой?
Нет. Оценка хранится у Google и раскрывается владельцу сайта только когда его бэкенд проверяет токен. На стороне клиента вы получаете лишь токен и ничего больше, поэтому нет способа посмотреть или отфильтровать по оценке до отправки.
Как долго действителен токен v3?
Около двух минут и одноразовый, как и у v2. Решайте непосредственно перед запросом, которому он нужен, а не накапливайте пул.
Сводка
Передать version="v3", установите action на то, что фактически использует страница, добавьте enterprise=1 когда загружается страница enterprise.js, и отправляйте токен быстро, потому что он истекает примерно через две минуты.
Другие языки рассматриваются на решение для reCAPTCHA v3 странице, особенности Enterprise — на Сервис распознавания Enterprise страница, а более широкий набор возможностей Python на Решатель капчи для Python страница. Вы можете увидеть, как настоящий токен v3 генерируется на нашей демо v3, и сам CapSkip является безлимитный сервис распознавания капчи который работает локально.
