Captcha in Zapier lösen, ohne ins Timeout zu laufen

zapier captcha - How to Solve CAPTCHA in Zapier Without Hitting the Timeout

Ein Captcha-Schritt in Zapier scheitert aus einem Grund, der mit Captchas nichts zu tun hat: Ein Code-Schritt bekommt standardmäßig 10 oder 30 Sekunden, und eine Lösung dauert länger. Absenden und Abfragen in einem Schritt, und Sie laufen ins Timeout. Was funktioniert, sind zwei Schritte mit einer Verzögerung dazwischen und ein Löser, der von den Servern von Zapier aus erreichbar ist, also der Server-Modus statt der Loopback-Adresse. Beides sind Änderungen von fünf Minuten, sobald Sie wissen, dass sie das Problem sind.

Was Sie brauchen

  • Ein Zapier-Konto in einem beliebigen Tarif mit Code by Zapier.
  • CapSkip im Server-Modus auf einer Maschine, die Zapier erreichen kann, mit statischer öffentlicher IP. Siehe Verbindungseinstellungen.
  • Schlüsselvalidierung eingeschaltet und ein API-Schlüssel für diesen Zap ausgestellt.
  • sitekey und Seiten-URL des geschützten Formulars, aus dem Trigger-Schritt, der sie liefert.

Der Server-Modus ist hier nicht optional

Jede andere Anleitung in diesem Blog startet den Löser auf 127.0.0.1:8080, und auf Ihrer eigenen Maschine ist das genau richtig. Zapier liegt nicht auf Ihrer Maschine. Ihr Zap läuft auf der Infrastruktur von Zapier, eine Anfrage an 127.0.0.1 aus einem Code-Schritt löst also auf den Container von Zapier selbst auf und bekommt nichts zurück.

Die Verbindungseinstellungen von CapSkip haben dafür einen zweiten Modus. Lokal bindet an 127.0.0.1 und ist nur von diesem Gerät aus erreichbar. Server bindet an Ihre Netzwerkadresse oder öffentliche IP, sodass eine gehostete Plattform ihn über dieselbe 2captcha-kompatible API aufrufen kann. Eine statische öffentliche IP ist empfehlenswert, denn die Adresse landet in Ihrem Zap und soll sich nicht bewegen.

Es bleibt Ihre Hardware und es bleibt ohne Verbrauchsabrechnung. Der Server-Modus ändert, wo der Löser lauscht, nicht, wem er gehört, und nicht, wie er abrechnet. Was er sehr wohl ändert, ist die Angriffsfläche, schalten Sie also die Schlüsselvalidierung ein, bevor Sie den Port öffnen, und geben Sie dem Zap einen eigenen Schlüssel, damit Sie ihn widerrufen können, ohne alles andere zu stören.

Das Timeout, das die Form Ihres Zaps bestimmt

Code by Zapier führt Ihr Python oder JavaScript mit einer Laufzeitobergrenze aus. Bei Starter liegt diese Grenze bei 10 Sekunden. Bei Pro, Team und Company sind es 30. Zapier bietet außerdem verlängerte Laufzeiten an, die einen Code-Schritt auf bis zu 10 Minuten anheben und die Sie am Schritt selbst konfigurieren.

Vergleichen Sie das nun mit einer Lösung. Ein Bild-Captcha dauert meist Sekunden. Ein reCAPTCHA v2 ist normalerweise nach 15 bis 45 Sekunden beantwortet, und die Empfehlung fürs Abfragen lautet, rund 15 bis 20 Sekunden bis zur ersten Prüfung zu warten. Eine Schleife aus Absenden und Abfragen passt also nicht in 10 Sekunden, meist auch nicht in 30, und passt bequem in eine verlängerte Laufzeit.

Daraus ergeben sich zwei Bauformen, und welche die richtige ist, hängt davon ab, ob verlängerte Laufzeiten aktiviert sind:

  • Zwei Schritte plus eine Verzögerung. Funktioniert in jedem Tarif. Absenden, warten, abfragen. Die Zap-Historie liest sich klar, und eine langsame Lösung reißt den Lauf nicht ab.
  • Ein Schritt mit verlängerter Laufzeit. Weniger bewegliche Teile, und die ganze Lösung liegt an einer Stelle. Braucht die längere Laufzeit, aktiviert an diesem Schritt.

Schritt 1: das Captcha absenden und die ID behalten

Fügen Sie eine Aktion von Code by Zapier hinzu, wählen Sie Python und mappen Sie sitekey und Seiten-URL in die Eingabefelder des Schritts. Eingabewerte kommen immer als Strings in input_data, was hier in Ordnung ist, weil ohnehin alles, was Sie senden, ein String ist.

# Code by Zapier, Python. requests is available; nothing to install.
SOLVER = "http://YOUR_SERVER_IP:8080"

r = requests.post(SOLVER + "/in.php", data={
    "key": input_data["api_key"],
    "method": "userrecaptcha",
    "googlekey": input_data["sitekey"],
    "pageurl": input_data["pageurl"],
    "json": 1,
})
body = r.json()

if body["status"] != 1:
    raise Exception("Submit rejected: " + body["request"])

# Hand the id to the next step.
output = {"captcha_id": body["request"]}

Eine Exception zu werfen ist bei einem abgelehnten Absenden der richtige Zug. Zapier markiert den Lauf als fehlerhaft und zeigt die Meldung in der Zap-Historie, und das ist besser, als einen Fehlerstring die Kette hinunterzureichen und ihn drei Schritte später zu entdecken.

Schritt 2: verzögern, dann das Token abfragen

Fügen Sie einen Delay-by-Zapier-Schritt hinzu und nutzen Sie Delay For mit einem kurzen Intervall. Zwanzig Sekunden sind eine sinnvolle Untergrenze für reCAPTCHA v2, denn früheres Abfragen liefert nur CAPCHA_NOT_READY zurück und verbrennt das Budget Ihres Code-Schritts mit Anfragen, die nie erfolgreich sein konnten.

Fügen Sie dann einen zweiten Code-Schritt hinzu, der abfragt. Halten Sie die Schleife klein: eine Handvoll Versuche mit einem sleep dazwischen passt in 30 Sekunden, und ist die Antwort bis dahin nicht fertig, läuft der Zap auf einen Fehler und Sie können Autoreplay einschalten, statt in einer längeren Schleife zu sitzen.

# Code by Zapier, Python. Second step, after Delay For 20 seconds.
import time

SOLVER = "http://YOUR_SERVER_IP:8080"
params = {
    "key": input_data["api_key"],
    "action": "get",
    "id": input_data["captcha_id"],
    "json": 1,
}

token = None
# Five tries at 5s stays inside a 30 second step.
for _ in range(5):
    body = requests.get(SOLVER + "/res.php", params=params).json()
    if body["status"] == 1:
        token = body["request"]
        break
    if body["request"] != "CAPCHA_NOT_READY":
        raise Exception(body["request"])
    time.sleep(5)

if not token:
    raise Exception("Not solved yet. Lengthen the delay ahead of this step.")

output = {"token": token}

CAPCHA_NOT_READY wird ohne T geschrieben, und das ist die Schreibweise der API, kein Tippfehler in diesem Beitrag. Jede andere Antwort, die zurückkommt, ist ein echter Fehler und sollte den Zap stoppen. Die vollständige Liste finden Sie hier: der CapSkip-API-Dokumentation.

Die Variante mit einem Schritt

Mit verlängerten Laufzeiten an diesem Schritt fallen beide Hälften zu einer einzigen Aktion zusammen und die Verzögerung entfällt. Der Code sind die beiden Blöcke von oben mit einer breiteren Abfrageschleife, und das Einzige, worauf Sie achten müssen, ist, dass die eigene Obergrenze Ihrer Schleife unter der konfigurierten Laufzeit bleibt, damit der Schritt eine Meldung wirft, die Sie geschrieben haben, statt mitten in einer Anfrage abgeschossen zu werden.

Eine Warnung davor, das Fenster riesig zu machen: Ein gelöstes Token hat eine eigene, begrenzte Lebensdauer. Ein reCAPTCHA-Token ist einmalig nutzbar und wird nach rund zwei Minuten nicht mehr akzeptiert, ein Zap, der löst und dann fünf Minuten in einer Warteschlange sitzt, sendet also etwas, das die Seite längst nicht mehr anerkennt. Token-Ablauf nennt die genauen Zahlen. Lösen Sie so spät im Zap wie möglich und setzen Sie den Schritt, der das Token verwendet, unmittelbar dahinter.

Stattdessen Webhooks by Zapier nutzen

Das Absenden können Sie auch mit Webhooks by Zapier und ganz ohne Code erledigen. Wählen Sie Custom Request oder POST, richten Sie es auf /in.php, und senden Sie dieselben Felder als Formulardaten. Die Antwort kommt als {"status": 1, "request": "<id>"} zurück, und Zapier zerlegt sie in Felder, die Sie weitermappen können.

{
  "key": "YOUR_API_KEY",
  "method": "userrecaptcha",
  "googlekey": "YOUR_SITEKEY",
  "pageurl": "https://example.com/page-with-recaptcha",
  "json": 1
}

Unangenehm wird es beim Abfragen. Ein Webhook macht eine Anfrage, Sie brauchen also eine Verzögerung und einen Filter, um zu entscheiden, ob die Antwort da ist, und ein Zap kann nicht einfach zurückspringen und es erneut versuchen. Ein Code-Schritt liest sich für diese Hälfte besser. Nutzen Sie Webhooks für das Absenden, wenn Sie lieber klicken als tippen, und Code für das Abfragen auf jeden Fall.

Häufige Fehler und was sie bedeuten

Was Sie sehenUrsacheBeheben
Ihr Code lief ins TimeoutAbsenden und Abfragen in einem Schritt bei einer Grenze von 10 oder 30 SekundenIn zwei Schritte mit einer Verzögerung aufteilen oder verlängerte Laufzeiten aktivieren
Connection refused oder eine hängende AnfrageDer Schritt ruft 127.0.0.1 auf, und das ist der Container von Zapier selbstDen Löser in den Server-Modus schalten und seine öffentliche IP nutzen
ERROR_KEY_DOES_NOT_EXISTDie Schlüsselvalidierung ist an, und der Schlüssel dieses Zaps ist nicht registriertIn den App-Einstellungen einen Schlüssel für den Zap ausstellen
CAPCHA_NOT_READY bei jedem VersuchDas Abfragen begann zu früh, oder die Schleife ist zu kurzDie Verzögerung vor dem Abfrageschritt verlängern
ERROR_GOOGLEKEYDas sitekey-Feld kam leer aus dem TriggerDas Mapping in den Eingabefeldern des Schritts prüfen
Token von der Zielseite abgelehntEs ist zwischen dem Lösen und seiner Verwendung abgelaufenDas Lösen nach hinten schieben, direkt neben den Schritt, der es absendet

FAQ

Kann ich das CapSkip SDK in einem Code-Schritt installieren?

Nein. Code by Zapier läuft in einer Sandbox mit einem festen Satz an Bibliotheken und ohne Paketinstallationen, die SDKs für Python und Node fallen also weg. Die Bibliothek requests ist mit dabei, und die API ist 2captcha-kompatibel mit zwei Endpunkten, der Code oben ist also alles, was das SDK getan hätte. Wenn ein Teil Ihrer Pipeline auf Infrastruktur läuft, die Sie selbst kontrollieren: Die Seite zu den SDKs fürs Captcha-Lösen stellt die vier offiziellen Clients vor.

Zapier ist gehostet. Wie erreicht es einen Löser auf meiner Maschine?

Über den Server-Modus. Der Löser bindet an Ihre Netzwerkadresse oder öffentliche IP statt an die Loopback-Adresse, und Zapier ruft ihn auf wie jede andere öffentliche API. Geben Sie ihm eine statische öffentliche IP, damit die Adresse in Ihrem Zap gültig bleibt, schalten Sie die Schlüsselvalidierung ein, bevor Sie den Port öffnen, und stellen Sie dem Zap einen eigenen Schlüssel aus.

Wie lang sollte der Delay-Schritt sein?

Beginnen Sie bei 20 Sekunden für reCAPTCHA v2 und bei etwa 5 für GeeTest. Bild-Captchas kommen schnell genug zurück, dass ein einzelner Schritt mit einer Abfrage im Sekundentakt sie meist abdeckt. Länger ist nicht automatisch sicherer, denn das Token altert ab dem Moment seiner Ausstellung, drehen Sie die Verzögerung also so weit herunter, bis Sie gelegentlich einen erneuten Versuch sehen, statt so weit hinauf, bis Sie nie einen sehen.

Sollte ich dafür Zapier oder ein selbst gehostetes Werkzeug nehmen?

Zapier ist die richtige Wahl, wenn der Rest des Workflows ohnehin dort liegt. Ist die Captcha-Arbeit die Hauptsache, umgeht ein selbst gehostetes Werkzeug die Laufzeitgrenze vollständig und kann über eine private Adresse mit dem Löser sprechen. Die n8n-Anleitung beschreibt genau diese Form, und ihr Wait-Node hat keine vergleichbare Grenze.

Die Kurzfassung

Betreiben Sie den Löser im Server-Modus, damit Zapier ihn erreicht, senden Sie in einem Code-Schritt ab, verzögern Sie etwa 20 Sekunden und fragen Sie in einem zweiten ab. Aktivieren Sie verlängerte Laufzeiten, wenn Ihnen ein einzelner Schritt lieber ist. Halten Sie das Ganze knapp, denn das Token läuft lange vor Ihrer Zap-Historie ab. Die Kosten bleiben gleich, welche Bauform Sie auch wählen: Ein Captcha-Löser auf einer Maschine, die Ihnen ohnehin gehört, rechnet nichts pro Lösung ab. Ein Zap, der vierhundertmal am Tag feuert, kostet also genau so viel wie einer, der viermal feuert.