So lösen Sie Captchas in n8n mit dem HTTP Request Node

n8n captcha - How to Solve CAPTCHA in n8n with the HTTP Request Node

Es gibt keinen n8n-CAPTCHA-Node, und Sie brauchen auch keinen. Zwei HTTP Request-Nodes und ein Wait-Node lösen jeden unterstützten Captcha-Typ: Der erste sendet den Auftrag ab, der zweite fragt ab, bis das Token zurückkommt. Richten Sie beide auf 127.0.0.1:8080 und die gesamte Schleife läuft auf demselben Rechner wie n8n, sodass nichts Ihr Netzwerk verlässt und nichts pro Lösung abgerechnet wird. CapSkip läuft auch auf einem Server und nimmt dieselben API-Aufrufe über das Netzwerk entgegen, und genau so nutzen Sie es aus n8n Cloud heraus. Diese Anleitung baut den Workflow Node für Node auf, samt der Docker-Netzwerkfalle, über die die meisten beim ersten Durchlauf stolpern.

Was Sie brauchen

  • n8n, selbst gehostet, als Desktop-App oder in der Cloud. Alle drei funktionieren, wobei die Cloud-Variante voraussetzt, dass CapSkip über das Netzwerk erreichbar ist. Siehe den Server-Abschnitt weiter unten.
  • Die laufende CapSkip-App mit gestartetem Dienst. Port, Schlüssel sowie lokaler oder Server-Modus stehen in den Verbindungseinstellungen.
  • Ein sitekey und eine Seiten-URL von der Website, die Sie automatisieren.

Die Key-Validierung ist standardmäßig deaktiviert, sodass jede nicht leere Zeichenfolge als key-Parameter funktioniert. Senden Sie lieber etwas als nichts: Ein leerer key liefert ERROR_WRONG_USER_KEY.

Warum HTTP Request statt eines Community-Nodes

Community-Nodes müssen auf der Instanz installiert werden, sie hinken API-Änderungen hinterher, und auf n8n Cloud sind sie eingeschränkt. Die API hier ist 2captcha-kompatibel und hat nur zwei Endpunkte, ein Community-Node würde also etwa sechs Zeilen Konfiguration kapseln. Der eingebaute HTTP Request-Node erledigt dieselbe Aufgabe, wird zusammen mit n8n aktualisiert und funktioniert auf jedem Instanztyp.

EndpunktWas er tutLiefert
/in.phpReicht eine Aufgabe einEine numerische Captcha-ID
/res.phpFragt, ob diese ID fertig istDas Token oder die Zeichenfolge CAPCHA_NOT_READY

Schritt 1: das Captcha absenden

Fügen Sie einen HTTP Request-Node hinzu und benennen Sie ihn Submit CAPTCHA. Setzen Sie die Methode auf POST und die URL auf http://127.0.0.1:8080/in.php. Aktivieren Sie Send Body, wählen Sie Form Urlencoded und fügen Sie diese Felder hinzu.

NameWert
keyBeliebige nicht leere Zeichenfolge
methoduserrecaptcha
googlekeyIhr sitekey
pageurlDie Seite, auf der das Widget sitzt
json1

Senden Sie das json-Feld immer mit. Ohne dieses Feld ist die Antwort eine nackte Zeichenfolge wie OK|2122988149 , die Sie von Hand zerlegen müssen. Mit dem Feld erhalten Sie ein Objekt, das n8n direkt ansprechen kann.

// Response from in.php with json=1
{"status": 1, "request": "2122988149"}

// The captcha ID is now available downstream as:
//   {{ $json.request }}

Andere Captcha-Typen ändern nur das method-Feld und die Parameter daneben. Turnstile verwendet turnstile mit einem Paar aus sitekey und pageurl, GeeTest verwendet geetest mit gt und challenge, und ein Bild-Captcha verwendet base64 mit den Bildbytes in einem Body-Feld. Die API-Referenz listet alle Parameter je Typ auf.

Schritt 2: vor der ersten Abfrage warten

Fügen Sie nach Submit CAPTCHA einen Wait-Node hinzu. Setzen Sie Resume auf After Time Interval, Wait Amount auf 15 und Wait Unit auf Sekunden.

Fünfzehn Sekunden sind nicht willkürlich gewählt. Ein reCAPTCHA-v2-Auftrag ist selten früher fertig, sofortiges Abfragen verbrennt also nur eine Workflow-Ausführung für ein garantiertes CAPCHA_NOT_READY. Turnstile und GeeTest sind schneller durch, dort genügen 5 Sekunden. Ein Bild-Captcha ist meist in etwa einer Sekunde erledigt.

Schritt 3: das Token abfragen

Fügen Sie einen zweiten HTTP Request-Node namens Poll Result hinzu. Methode GET, URL http://127.0.0.1:8080/res.php, Send Query Parameters aktiviert.

NameWert
keyDieselbe Zeichenfolge wie in Schritt 1
actionget
id{{ $('Submit CAPTCHA').item.json.request }}
json1

Referenzieren Sie den Submit-Node über seinen Namen statt über $json.request. Sobald der Wait-Node dazwischenliegt, gehört das eingehende Item zum Wait-Node, und beim zweiten Durchlauf der Schleife gehört es zum IF-Node. Wenn Sie den Quell-Node ausdrücklich benennen, bleibt die ID stabil, egal wie oft die Schleife läuft.

Schritt 4: in einer Schleife warten, bis es fertig ist

Fügen Sie nach Poll Result einen IF-Node hinzu. Die Bedingung ist ein Zeichenfolgenvergleich: linker Wert {{ $json.request }}, Operation “ist nicht gleich”, rechter Wert CAPCHA_NOT_READY.

Verbinden Sie den false-Ausgang zurück mit dem Wait-Node. Damit ist die Schleife geschlossen, und n8n dreht so lange weiter Runden, bis die Antwort eintrifft. Der true-Ausgang trägt das Token weiter.

// res.php while the job is still running
{"status": 0, "request": "CAPCHA_NOT_READY"}

// res.php once it is solved
{"status": 1, "request": "03AGdBq26..."}

Achten Sie auf die Schreibweise. Die API gibt CAPCHA_NOT_READY ohne das erste T zurück, übernommen aus dem 2captcha-Wire-Format, zu dem sie kompatibel ist. Schreiben Sie es so, wie es richtig aussieht, trifft der IF-Node nie zu, und die Schleife läuft, bis der Workflow in eine Zeitüberschreitung läuft.

Ergebnisse sind nur einmal lesbar. Dieselbe ID ein zweites Mal zu lesen liefert einen Fehler statt erneut das Token. Geben Sie das Token daher direkt an den nächsten Node weiter, statt einmal zur Prüfung und einmal zum Abholen abzufragen.

Schritt 5: das Token verwenden

Der true-Zweig des IF-Nodes trägt jetzt das Token. Übergeben Sie es im Formularfeld g-recaptcha-response der Anfrage, die Sie zuvor nicht stellen konnten, über einen dritten HTTP Request-Node.

// Code node, Mode: Run Once for All Items.
// Builds the form payload for the final request.
const token = $input.first().json.request;

return [
  {
    json: {
      email: "[email protected]",
      "g-recaptcha-response": token,
    },
  },
];

Tokens verfallen etwa zwei Minuten nach ihrer Ausstellung, senden Sie also sofort ab. Wenn Ihr Workflow zwischen Lösen und Absenden einen Freigabeschritt oder einen weiteren Wait-Node hat, verschieben Sie das Lösen dahinter.

Die Docker-Falle: localhost ist nicht Ihr Rechner

Das ist der mit Abstand häufigste Fehler, und die Fehlermeldung weist in keine hilfreiche Richtung. Innerhalb eines Containers bezeichnet 127.0.0.1 den Container selbst, nicht den Host, auf dem der Captcha-Löser läuft. n8n meldet eine abgewiesene Verbindung, und der Workflow stirbt bei Submit CAPTCHA.

Ersetzen Sie unter Docker Desktop für Mac und Windows den Host durch host.docker.internal in beiden URLs. Unter Linux wird dieser Name standardmäßig nicht aufgelöst, fügen Sie ihn daher beim Start des Containers ausdrücklich hinzu.

# docker pull docker.n8n.io/n8nio/n8n
# Linux: map host.docker.internal to the host gateway.
docker run -it --rm \
  --add-host=host.docker.internal:host-gateway \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

# Both node URLs then become:
#   http://host.docker.internal:8080/in.php
#   http://host.docker.internal:8080/res.php

Wenn n8n und der Solver im selben Docker-Netzwerk laufen, verwenden Sie stattdessen den Servicenamen. Die Regel ist in beiden Fällen dieselbe: Die URL muss von innerhalb des Containers auflösbar sein, nicht von Ihrem Terminal aus.

CapSkip stattdessen auf einem Server betreiben

CapSkip muss nicht auf demselben Rechner wie n8n laufen. Die Verbindungseinstellungen haben zwei Modi, und erst der zweite macht die Nutzung mit einem gehosteten n8n möglich.

ModusLauscht aufSinnvoll, wenn
Lokal127.0.0.1, nur dieses Gerätn8n und CapSkip laufen auf demselben Computer
ServerIhr Netzwerk oder Ihre öffentliche IPn8n läuft woanders: auf einem anderen Rechner, einem VPS oder in n8n Cloud

Betreiben Sie CapSkip im Server-Modus auf einem VPS, und jeder Rechner in Ihrem Team zeigt auf eine einzige Instanz. Aus den Node-URLs werden http://YOUR_SERVER_IP:8080/in.php und http://YOUR_SERVER_IP:8080/res.php, und sonst ändert sich am Workflow nichts. Eine statische öffentliche IP lohnt sich, denn die URLs sind fest in den Nodes hinterlegt, und eine wechselnde Adresse macht sie unbrauchbar.

Das ist weiterhin Ihre eigene Hardware und wird weiterhin nicht nach Verbrauch abgerechnet. Der Server-Modus verschiebt nur, wo der Löser läuft, nicht, wem er gehört, und Sie zahlen so oder so nicht pro Lösung.

Häufige Fehler und was sie bedeuten

AntwortUrsacheBeheben
ECONNREFUSEDDer Solver läuft nicht, oder der Container sieht den Host nichtDen lokalen Dienst starten, dann den Docker-Fix von oben anwenden
ERROR_WRONG_USER_KEYDas key-Feld ist leer oder fehltEine beliebige nicht leere Zeichenfolge senden
ERROR_GOOGLEKEYDer sitekey ist falsch, abgeschnitten oder stammt von einer anderen SeiteDas data-sitekey-Attribut auf der Live-Seite erneut auslesen
ERROR_PAGEURLDem pageurl-Feld fehlt das Schema, oder es zeigt woandershinDie vollständige URL inklusive https senden
Die Schleife endet nieDer IF-Node vergleicht mit einer falsch geschriebenen Ready-ZeichenfolgeGenau die Schreibweise CAPCHA_NOT_READY verwenden
ERROR_CAPTCHA_UNSOLVABLEDer Auftrag ist fehlgeschlagen, statt in eine Zeitüberschreitung zu laufenMit einem frischen challenge-Wert erneut absenden

Jeder Code, den die API zurückgeben kann, ist in der API-Dokumentation, zusammen mit dem Parameter, der ihn jeweils auslöst.

FAQ

Funktioniert das auf n8n Cloud?

Ja, mit CapSkip im Server-Modus. Cloud-Worker laufen in der Infrastruktur von n8n und können daher 127.0.0.1 auf Ihrem Desktop nicht sehen, und das ist die einzige Adresse, die der lokale Modus zulässt. Stellen Sie die Verbindungseinstellungen auf den Server-Modus um, betreiben Sie CapSkip auf einem VPS mit statischer öffentlicher IP und richten Sie die Nodes auf diese Adresse aus. Wenn Sie lieber alles auf einem einzigen Rechner behalten, hosten Sie n8n daneben selbst und bleiben im lokalen Modus.

Wie viele Ausführungen kostet die Polling-Schleife?

Eine. Eine Schleife innerhalb eines Workflows bleibt eine einzige Ausführung, egal wie oft sie durchlaufen wird, das Paar aus Wait und IF vervielfacht Ihre Ausführungszahl also nicht. Es hält die Ausführung allerdings offen, was zählt, wenn Sie viele Workflows gleichzeitig auf einer kleinen Instanz betreiben.

Kann ich mehrere Captchas in einem Durchlauf lösen?

Ja. Der HTTP Request-Node läuft einmal pro Eingabe-Item. Wenn Sie ihm eine Liste aus sitekey- und URL-Paaren übergeben, sendet er alle ab und liefert Ihnen eine captcha-ID pro Item. Halten Sie die IDs durch die Schleife hinweg mit ihren Quell-Items gepaart, und verwenden Sie einen Split In Batches-Node, wenn Sie begrenzen möchten, wie viele gleichzeitig unterwegs sind.

Benötige ich einen Proxy?

Meistens nicht. Fügen Sie die Felder proxy und proxytype nur dann zum Submit-Node hinzu, wenn die Zielseite Tokens ablehnt, die aus einem anderen Netzwerk gelöst wurden als dem, das die Seite geladen hat. Proxys gelten für reCAPTCHA, Turnstile und GeeTest und werden bei Bild-Captchas ignoriert.

Der Einbau in einen echten Workflow

Die fünf Nodes von oben passen in jeden Workflow, der auf ein geschütztes Formular trifft: einen Scraper zur Lead-Erfassung, eine nächtliche Preisprüfung, ein internes Tool, das sich in ein Altsystem einloggt. Da hier ein Captcha-Löser auf Ihrer eigenen Hardware läuft, verlassen die sitekeys und Seiten-URLs, die Sie ihm übergeben, nie den Rechner, und die Schleife kostet pro Durchlauf nichts. Wenn Sie ihn lieber aus einem Code-Node in JavaScript oder Python statt über HTTP Request-Nodes aufrufen möchten: offizielle SDKs kapseln dieselben beiden Endpunkte, und reCAPTCHA-v2-Besonderheiten werden separat behandelt.