reCAPTCHA v2 in Python mit dem CapSkip-SDK lösen

reCAPTCHA v2 hat drei Varianten, und in Python sind sie eine Funktion mit unterschiedlichen Keyword-Argumenten. Checkbox ist der reine Aufruf, Invisible und Enterprise sind Flags, und beide lassen sich gleichzeitig setzen. Python ist außerdem das einzige CapSkip-SDK mit einem wirklich eigenständigen Async-Client, was wichtig wird, sobald Sie mehr als eines gleichzeitig lösen.
Einrichtung
# Python 3.10 or newer. pip install capskip
CapSkip löst lokal, starten Sie also zuerst die Desktop-App und richten Sie dann den Client auf den Port aus den Einstellungen aus:
from capskip import CapSkip
solver = CapSkip(
apiKey="capskip", # any string when key validation is off
host="127.0.0.1",
port=8080,
recaptchaTimeout=300, # seconds
)Lesen Sie diese in der Produktion stattdessen aus der Umgebung:
import os
from capskip import CapSkip
solver = CapSkip(
apiKey=os.getenv("CAPSKIP_API_KEY", "capskip"),
host=os.getenv("CAPSKIP_HOST", "127.0.0.1"),
port=int(os.getenv("CAPSKIP_PORT", "8080")),
)Die drei Varianten
| Variante | Keyword zum Hinzufügen |
|---|---|
| Checkbox | keine |
| Invisible | invisible=1 |
| Enterprise | enterprise=1 |
| Invisible Enterprise | beide |
# Checkbox: the baseline call.
result = solver.recaptcha(
sitekey="6Lc...YOUR_SITEKEY",
url="https://example.com/login",
)
print(result["code"]) # g-recaptcha-response token
# Invisible.
result = solver.recaptcha(sitekey=sitekey, url=page_url, invisible=1)
# Enterprise, and both together.
result = solver.recaptcha(sitekey=sitekey, url=page_url, enterprise=1)
result = solver.recaptcha(sitekey=sitekey, url=page_url, enterprise=1, invisible=1)Der Rückgabewert ist ein einfaches dict, also result["code"] ist der Token. Es gibt auch result["captchaId"] wenn Sie protokollieren möchten, welche interne Lösung ihn erzeugt hat.
Sitekey und URL richtig ermitteln
Der sitekey ist der data-sitekey Attribut auf dem Widget-Container oder das erste Argument von grecaptcha.render wenn es keinen Container gibt. Es beginnt immer mit 6L und ist öffentlich.
Die URL muss die Seite sein, auf der das Widget gerendert wird. Die Übergabe Ihres Formular-Handlers oder einer Post-Login-Weiterleitung ist die häufigste Ursache für einen Token, der zwar problemlos gelöst wird und dann bei der Validierung fehlschlägt.
Den Token übermitteln
import requests
response = requests.post(
"https://example.com/login",
data={
"g-recaptcha-response": result["code"],
"username": "...",
"password": "...",
},
)Tokens halten rund zwei Minuten und sind einmalig verwendbar, lösen Sie also so spät wie möglich im Ablauf. Wenn die Website das Token an einen JavaScript-Callback statt an ein Formularfeld übergibt, ist das Lösen identisch, aber die Übermittlung unterscheidet sich, was unser reCAPTCHA-v2-Callback-Löser Seite abdeckt.
Mehrere gleichzeitig lösen
Hier unterscheidet sich Python von den anderen CapSkip SDKs. AsyncCapSkip ist eine echte Async-Implementierung, kein Alias, sodass es Lösungen wirklich überlappt:
import asyncio
from capskip import AsyncCapSkip
async def main():
solver = AsyncCapSkip()
r1, r2 = await asyncio.gather(
solver.recaptcha(sitekey=key_a, url="https://a.example.com"),
solver.recaptcha(sitekey=key_b, url="https://b.example.com"),
)
print(r1["code"], r2["code"])
asyncio.run(main())In den Node.js- und .NET-SDKs AsyncCapSkip ist nur ein Alias und existiert in PHP allein dafür, dass portierter Code kompiliert. Python ist das, wo der Wechsel dahin tatsächlich das Verhalten ändert.
Fehler
from capskip import (
CapSkip, ValidationException, NetworkException,
ApiException, TimeoutException,
)
try:
result = solver.recaptcha(sitekey=sitekey, url=page_url)
except ValidationException:
pass # missing or malformed arguments
except NetworkException:
pass # CapSkip is not running
except ApiException:
pass # bad sitekey or pageurl
except TimeoutException:
pass # exceeded recaptchaTimeoutAlle vier leiten sich von einer gemeinsamen Basis ab, daher except CapSkipError fängt alles ab, wenn Sie Fehler lieber an einer Stelle behandeln möchten.
Einen Proxy verwenden
result = solver.recaptcha(
sitekey=sitekey,
url=page_url,
proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)Proxys funktionieren für reCAPTCHA, Turnstile und GeeTest. Für Bild-Captchas werden sie nicht unterstützt, da diese aus den Bild-Bytes gelöst werden und niemals die Zielseite erreichen.
Häufig gestellte Fragen
Muss ich das Ergebnis abfragen?
Nein. Das SDK pollt intern und gibt den fertigen Token zurück, sodass CAPCHA_NOT_READY erreicht Ihren Code nie. Es beginnt nach 250 ms mit der Prüfung und drosselt schrittweise, was in der Regel eine handgeschriebene Schleife schlägt.
Lohnt sich AsyncCapSkip für eine einzelne Lösung?
Nicht wirklich. Es spielt eine Rolle, wenn sich mehrere Lösungen überschneiden oder wenn Sie sich bereits in einer Event-Loop befinden und ein blockierender Aufruf sie zum Stillstand bringen würde. Für eine einzelne Lösung in einem Skript ist der synchrone Client einfacher.
Welche Python-Versionen werden unterstützt?
3.10 und neuer. Das Paket hat keine schweren Abhängigkeiten, sodass es sich in ein bestehendes Scraping- oder Automatisierungsprojekt einfügt, ohne einen ganzen Rattenschwanz an Extras nachzuziehen.
Zusammenfassung
Eine Funktion, drei Varianten, ausgewählt mit invisible und enterprise. Lesen Sie result["code"], übermitteln Sie es als g-recaptcha-response, und greifen Sie zu AsyncCapSkip wenn Sie in großen Mengen lösen.
Die umfassendere Python-Oberfläche finden Sie auf der Python-Captcha-Löser Seite, andere Sprachen auf der reCAPTCHA-v2-Löser Seite, und es gibt eine Live-v2-Demo zum Testen. CapSkip ist ein Captcha-Löser das auf Ihrem eigenen Rechner läuft.
