reCAPTCHA Enterprise mit Java lösen
Verwenden Sie Javas HttpClient, um ein Token anzufordern, und Gson, um die JSON-Antwort zu lesen. Dieses Beispiel ruft die REST-API auf, wartet auf den Abschluss der Aufgabe und gibt die reCAPTCHA Enterprise-Lösung zurück.
Auf dieser Seite
Website und Umgebung einrichten
Verwenden Sie Java 21 oder neuer. Erstellen Sie in der Konsole ein aktives Websiteprofil für Ihr Ziel und setzen Sie anschließend SOLVETHREE_API_KEY und SOLVETHREE_PROXY in der Umgebung, in der Java gestartet wird.
Ersetzen Sie accounts.example.com durch den Hostnamen, für den Ihr Profil eingerichtet ist, und login durch die von der Seite verwendete Aktion. Das Feld site erwartet einen Hostnamen ohne Schema oder Pfad.
Solve.java speichern und ausführen
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.UUID;
public class Solve {
static final HttpClient HTTP = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(15)).build();
static final String KEY = System.getenv("SOLVETHREE_API_KEY");
static JsonObject api(String path, JsonObject body, long deadline) throws Exception {
long remaining = deadline - System.nanoTime();
if (remaining <= 0) throw new IllegalStateException("Keep the task ID and resume polling");
var builder = HttpRequest.newBuilder(URI.create("https://api.solvethree.com/v1" + path))
.timeout(Duration.ofNanos(Math.min(remaining, Duration.ofSeconds(30).toNanos())))
.header("Authorization", "Bearer " + KEY)
.header("Content-Type", "application/json");
if (body == null) builder.GET();
else builder.POST(HttpRequest.BodyPublishers.ofString(body.toString()));
var response = HTTP.send(builder.build(), HttpResponse.BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300)
throw new IllegalStateException("API HTTP " + response.statusCode());
return JsonParser.parseString(response.body()).getAsJsonObject();
}
public static void main(String[] args) throws Exception {
String proxy = System.getenv("SOLVETHREE_PROXY");
if (KEY == null || proxy == null) throw new IllegalArgumentException("Set the API key and proxy");
var input = new JsonObject();
input.addProperty("site", "accounts.example.com");
input.addProperty("action", "login");
input.addProperty("proxy", proxy);
input.addProperty("requestId", UUID.randomUUID().toString());
// Save input before creation if the task must be recovered after restart.
long deadline = System.nanoTime() + Duration.ofSeconds(180).toNanos();
var task = api("/tasks?waitMs=0", input, deadline);
while (task.get("status").getAsString().equals("pending") || task.get("status").getAsString().equals("solving")) {
String id = URLEncoder.encode(task.get("id").getAsString(), StandardCharsets.UTF_8);
task = api("/tasks/" + id + "?waitMs=15000", null, deadline);
if (task.get("status").getAsString().equals("pending") || task.get("status").getAsString().equals("solving"))
Thread.sleep(1000);
}
if (!task.get("status").getAsString().equals("ready"))
throw new IllegalStateException("Task failed: " + task.get("errorCode")
+ ": " + task.get("error"));
var solution = task.getAsJsonObject("solution");
// Submit solution.token with userAgent/secChUa and the original proxy.
System.out.println("Ready task: " + task.get("id").getAsString());
}
}Laden Sie im Verzeichnis mit Solve.java die Gson-JAR-Datei herunter, kompilieren Sie das Programm und führen Sie es aus:
curl --fail --location --output gson-2.15.0.jar \
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.15.0/gson-2.15.0.jar
javac -cp gson-2.15.0.jar Solve.java
java -cp .:gson-2.15.0.jar SolveDiese Befehle verwenden das macOS/Linux-Klassenpfad-Trennzeichen :. Verwenden Sie unter Windows ; zwischen dem aktuellen Verzeichnis und der Gson-JAR-Datei.
Token aus dem Ergebnis auslesen
Die Erstellung verwendet waitMs=0. Die Schleife ruft dieselbe Aufgaben-ID ab, solange der Status pending oder solving ist, und endet bei ready oder failed. Jeder GET kann bis zu 15 Sekunden warten; dem Aufrufer steht ein Gesamtzeitbudget von 180 Sekunden zur Verfügung.
Lesen Sie das Token mit solution.get("token").getAsString() aus. Verwenden Sie die zurückgegebenen Werte userAgent und secChUa in der Anfrage an das Ziel über denselben Proxy. Das Programm gibt die Aufgaben-ID aus, nicht das Token.
Prüfen Sie nach dem Übermitteln die Antwort des Ziels. Eine fertige Aufgabe zeigt an, dass eine Lösung generiert wurde; sie belegt nicht, dass die Anwendung sie akzeptiert hat.
Fehler und unterbrochene Anfragen
Die Hilfsfunktion bricht bei einer nicht erfolgreichen HTTP-Antwort ab. Eine endgültig fehlgeschlagene Aufgabe meldet errorCode und error, und der fehlgeschlagene Lösungsversuch wird erstattet. Entscheiden Sie anhand der API-Fehlerreferenz, was Sie beheben müssen.
Speichern Sie die generierte requestId und die exakten Eingaben, wenn Sie eine Wiederherstellung über Neustarts hinweg benötigen. Wenn bei der Erstellung eine Zeitüberschreitung auftritt, senden Sie diese Eingaben mit derselben ID erneut. Wenn Sie bereits eine Aufgaben-ID haben, rufen Sie die Aufgabe ab. Ein Neustart dieses Programms erzeugt eine weitere UUID und kann eine weitere kostenpflichtige Aufgabe erstellen.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.