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

solve recaptcha v3 in python - How to Solve reCAPTCHA v3 in Python and Set an 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 является безлимитный сервис распознавания капчи который работает локально.