Java ile reCAPTCHA Enterprise çözün
Token istemek için Java'nın HttpClient sınıfını, JSON yanıtını okumak için Gson'ı kullanın. Bu örnek REST API'sini çağırır, görevin tamamlanmasını bekler ve reCAPTCHA Enterprise çözümünü döndürür.
Bu sayfada
Siteyi ve ortamı ayarlayın
Java 21 veya üzerini kullanın. Konsolda hedefiniz için etkin bir site profili oluşturun, ardından Java'yı başlatan ortamda SOLVETHREE_API_KEY ve SOLVETHREE_PROXY değerlerini ayarlayın.
accounts.example.com değerini profilini oluşturduğunuz ana makine adıyla, login değerini ise sayfanın kullandığı eylemle değiştirin. site alanı, şema veya yol içermeyen bir ana makine adı alır.
Solve.java dosyasını kaydedin ve çalıştırın
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());
}
}Solve.java dosyasının bulunduğu dizinden Gson JAR dosyasını indirin, derleyin ve çalıştırın:
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 SolveBu komutlar macOS/Linux sınıf yolu ayırıcısı olan : kullanır. Windows'ta geçerli dizin ile Gson JAR dosyası arasında ; kullanın.
Sonuçtan tokenı okuyun
Oluşturma işleminde waitMs=0 kullanılır. Döngü, görev pending veya solving durumundayken aynı görev kimliğini sorgular ve ready veya failed durumunda durur. Her GET en fazla 15 saniye bekleyebilir; çağıran tarafın toplam süre sınırı 180 saniyedir.
Tokenı solution.get("token").getAsString() ile okuyun. Döndürülen userAgent ve secChUa değerlerini hedef istekte aynı proxy üzerinden kullanın. Program tokenı değil, görev kimliğini yazdırır.
Gönderimden sonra hedefin yanıtını kontrol edin. Hazır bir görev, bir çözüm üretildiğini belirtir; uygulamanın bunu kabul ettiğini göstermez.
Hatalar ve kesintiye uğrayan istekler
Yardımcı işlev, başarısız bir HTTP yanıtında durur. Nihai olarak başarısız olan bir görev errorCode ve error bildirir ve başarısız çözümün ücreti iade edilir. Neyi düzeltmeniz gerektiğine karar vermek için API hata referansını kullanın.
Yeniden başlatmalar arasında kurtarma yapmanız gerekiyorsa üretilen requestId değerini ve girdileri eksiksiz kaydedin. Oluşturma işlemi zaman aşımına uğrarsa bu girdileri aynı kimlikle yeniden gönderin. Zaten bir görev kimliğiniz varsa görevi alın. Bu programı yeniden başlatmak başka bir UUID oluşturur ve ücretlendirilen başka bir görev oluşturabilir.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.