So lösen Sie reCAPTCHA v3 in Python und setzen eine Action

solve recaptcha v3 in python - How to Solve reCAPTCHA v3 in Python and Set an Action

reCAPTCHA v3 zeigt niemals eine Challenge. Es läuft im Hintergrund und übergibt der Website einen Token, den die Website dann serverseitig verifiziert. Aus Ihrem Code heraus bedeutet das, dass es nichts anzuklicken und nichts anzusehen gibt, sodass die ganze Aufgabe darin besteht, einen Token zu erzeugen, den die Website akzeptiert. In Python ist das dasselbe recaptcha Methode, die Sie für v2 verwenden würden, mit einem Versions-Flag.

Der Teil, der die Leute stolpern lässt, ist die action.

Einrichtung

# 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 läuft auf Ihrem eigenen Rechner, daher muss die Desktop-App geöffnet sein, bevor irgendetwas davon funktioniert.

Der grundlegende Aufruf

result = solver.recaptcha(
    sitekey="6Lc...YOUR_SITEKEY",
    url="https://example.com/checkout",
    version="v3",
    action="submit",
)

print(result["code"])   # the v3 token

Zwei Dinge unterscheiden sich von v2. version="v3" ist erforderlich, und action sollte mit dem übereinstimmen, was die Seite übergibt an grecaptcha.execute. Wenn Sie es weglassen, ist der Standard verify.

Warum die Action wichtig ist

v3-Aktionen sind Labels, die die Website an jede geschützte Interaktion anhängt, sodass ein Login und ein Checkout getrennt bewertet werden können. Das Backend der Website prüft üblicherweise, ob die Aktion auf dem zurückgegebenen Token mit der Aktion übereinstimmt, die sie für diesen Endpunkt erwartet hat.

Senden Sie den falschen, ist der Token technisch gültig, kommt aber für eine andere Interaktion gekennzeichnet an, was viele Backends direkt ablehnen. Lesen Sie den echten Wert aus der Seite aus, statt zu raten:

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,
)

Häufige Werte sind login, submit, homepage und checkout, aber es sind willkürliche Zeichenketten, gewählt von demjenigen, der die Website gebaut hat.

Enterprise v3

Enterprise ist ein orthogonales Flag und kein separates Produkt, es baut also darauf auf:

result = solver.recaptcha(
    sitekey=sitekey,
    url=page_url,
    version="v3",
    enterprise=1,
    action="submit",
)

Sie erkennen Enterprise am Skript, das die Seite lädt, im Unterschied zum Standard. Enterprise lädt enterprise.js, Standard-Pulls api.js. Falsches Raten führt dazu, dass die Lösung scheitert, anstatt einen fehlerhaften Token zurückzugeben, sodass es günstig zu prüfen ist.

Den Token übermitteln

import requests

response = requests.post(
    "https://example.com/checkout",
    data={
        "g-recaptcha-response": result["code"],
        "order_id": "...",
    },
)

Manche v3-Integrationen verwenden einen anderen Feldnamen oder senden den Token als JSON, weil es kein standardisiertes Formular-Widget gibt, das sie einschränkt. Prüfen Sie, was das seiteneigene JavaScript tut, bevor Sie etwas annehmen g-recaptcha-response.

Massenweise lösen

Python ist das einzige CapSkip-SDK, bei dem AsyncCapSkip ist ein echter Async-Client statt eines Alias, sodass er die Arbeit wirklich überlappt:

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())

Fehler

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

Häufig gestellte Fragen

Was passiert, wenn ich die Action weglasse?

Es ist standardmäßig auf verify. Das funktioniert auf Websites, die die action nie prüfen, und scheitert auf Websites, die es tun. Da das Auslesen des echten Werts aus der Seite nur wenige Zeilen sind, lohnt es sich, es zu tun, statt sich auf den Standard zu verlassen.

Kann ich den Score vor dem Übermitteln prüfen?

Nein. Der Score liegt bei Google und wird dem Website-Betreiber erst offengelegt, wenn dessen Backend den Token verifiziert. Auf der Client-Seite erhalten Sie nur einen Token und sonst nichts, sodass es keine Möglichkeit gibt, den Score vor dem Absenden einzusehen oder danach zu filtern.

Wie lange ist ein v3-Token gültig?

Etwa zwei Minuten, und für den einmaligen Gebrauch, genauso wie v2. Lösen Sie unmittelbar vor der Anfrage, die es benötigt, statt einen Pool aufzubauen.

Zusammenfassung

Übergeben Sie version="v3", setzen Sie action an das, was die Seite tatsächlich verwendet, fügen Sie enterprise=1 wenn die Seite lädt enterprise.js, und senden Sie den Token schnell ab, da er in etwa zwei Minuten abläuft.

Andere Sprachen werden behandelt auf der reCAPTCHA-v3-Löser Seite, die Enterprise-Besonderheiten auf der Enterprise-Löser Seite und die breitere Python-Oberfläche auf der Python-Captcha-Löser Seite. Sie können beobachten, wie ein echter v3-Token erzeugt wird, auf unserer v3-Demo, und CapSkip selbst ist ein unbegrenzter Captcha-Löser das lokal läuft.