Captcha solver Java ile: HttpClient kullanan çalışan örnek (2026)
Java'da captcha solver tek bir HTTP çağrısıdır. Java 11 ve sonrası java.net.http.HttpClient ile birlikte gelir; bu yüzden bu rehberin tek bağımlılığı JSON için Gson'dır. Scarnox API'sine sitekey'i ve sayfa URL'sini gönderir, solution.token değerini okur ve token'ı sitenin formuna gönderirsiniz. Bu rehber PopularCaptcha'yı kapsar; Scarnox bugün onu proxysiz olarak çözer.
Ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın ve kodu başka bir yerde kullanmadan önce sahibi olduğunuz bir sayfada deneyin.
Gereksinimler
- Java 17 veya daha yeni bir sürüm (
java -version). - Gson 2.10 veya daha yeni. Maven'da:
com.google.code.gson:gson:2.10.1. - Bir Scarnox API anahtarı; ortam değişkeninden okunmalıdır.
- Sayfadaki PopularCaptcha widget'ının sitekey'i. Bulmak için captcha sitekey nasıl bulunur rehberine bakın.
Solver sınıfı
Sınıf, çerezleri tutan tek bir HttpClient sarar; böylece form gönderimine kadar oturum taşınabilir. Çözme metodu Bearer başlığını ayarlar, JSON gövdesini gönderir ve errorId değerini kontrol eder:
// ScarnoxSolver.java
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.LinkedHashMap;
import java.util.Map;
public class ScarnoxSolver {
private static final String API_URL = "https://api.scarnox.com/api/tasks/create";
private static final Gson GSON = new Gson();
private final String apiKey;
private final HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.cookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ALL))
.build();
public ScarnoxSolver(String apiKey) {
this.apiKey = apiKey;
}
/** Token'ı döndürür. Çağrı token hazır olana kadar bekler. */
public String solve(String sitekey, String pageUrl, boolean invisible) throws Exception {
Map<String, Object> body = new LinkedHashMap<>();
body.put("captcha_type", "PopularCaptchaTaskProxyless");
body.put("site_key", sitekey);
body.put("site_url", pageUrl);
if (invisible) {
body.put("is_invisible", true);
}
HttpRequest request = HttpRequest.newBuilder(URI.create(API_URL))
.timeout(Duration.ofSeconds(185))
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(GSON.toJson(body)))
.build();
HttpResponse<String> response = http.send(request, HttpResponse.BodyHandlers.ofString());
JsonObject data;
try {
data = JsonParser.parseString(response.body()).getAsJsonObject();
} catch (RuntimeException e) {
throw new IllegalStateException("HTTP " + response.statusCode() + ": not JSON");
}
if (data.get("errorId").getAsInt() != 0) {
throw new IllegalStateException(
data.get("errorCode").getAsString() + ": "
+ data.get("errorDescription").getAsString());
}
return data.getAsJsonObject("solution").get("token").getAsString();
}
/** Token'ı sitenin formuna gönderir ve HTTP durum kodunu döndürür. */
public int submit(String pageUrl, String email, String token) throws Exception {
// Oturum çerezinin ayarlanması için önce sayfayı yükle.
http.send(HttpRequest.newBuilder(URI.create(pageUrl)).GET().build(),
HttpResponse.BodyHandlers.discarding());
String form = "email=" + enc(email)
+ "&h-captcha-response=" + enc(token)
+ "&g-recaptcha-response=" + enc(token);
HttpRequest request = HttpRequest.newBuilder(URI.create(pageUrl))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(form))
.build();
return http.send(request, HttpResponse.BodyHandlers.discarding()).statusCode();
}
private static String enc(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}
Authorization başlığı Bearer önekini kullanır. İstek zaman aşımı 185 saniyedir, çünkü API token hazır olana kadar bloke olur. Yoklama (polling) adımı yoktur.
Ana program
Ana metod birkaç denemeyle çözer, ardından token'ı gönderir:
// Main.java
public class Main {
public static void main(String[] args) throws Exception {
String apiKey = System.getenv("SCARNOX_API_KEY");
if (apiKey == null || apiKey.isBlank()) {
throw new IllegalStateException("Set SCARNOX_API_KEY");
}
String pageUrl = "https://example.com/signup";
String sitekey = "YOUR-SITEKEY-UUID";
ScarnoxSolver solver = new ScarnoxSolver(apiKey);
String token = null;
for (int attempt = 1; attempt <= 3 && token == null; attempt++) {
try {
token = solver.solve(sitekey, pageUrl, false);
} catch (IllegalStateException e) {
System.err.println("Attempt " + attempt + " failed: " + e.getMessage());
Thread.sleep(attempt * 1000L);
}
}
if (token == null) {
throw new IllegalStateException("No token after 3 attempts");
}
int status = solver.submit(pageUrl, "you@example.com", token);
System.out.println("Status: " + status);
}
}
Çalıştırın:
export SCARNOX_API_KEY=scarnox_YOURAPIKEY
javac -cp gson-2.10.1.jar *.java
java -cp .:gson-2.10.1.jar Main
Neden bu yapıda
Solver başına bir istemci. HttpClient iş parçacığı güvenlidir ve yeniden kullanılmak için tasarlanmıştır. Her istek için bir tane oluşturmak bağlantıları boşa harcar.
Çerezler açık. İstemcideki CookieManager, formu yükleyen oturumu korur; böylece token, sitenin beklediği çerezle birlikte gider.
Açık hata kontrolü. API başarıda errorId değerini 0 döndürür. Başka her değer errorCode ve errorDescription içerir ve solver bu metinle bir istisna fırlatır. Token solution.token içindedir.
İki captcha alanı. Form hem h-captcha-response hem g-recaptcha-response alır. Çoğu site birini ya da diğerini okur.
Zamanlama
Token yaklaşık iki dakikada süresi dolar. Çözümü göndermeden hemen önce yapın; uzun bir işin başında değil. Captcha token süresi pencerenin nasıl boyutlandırılacağını ve süresi dolmuş bir token ile reddedilmiş bir token'ın nasıl ayırt edileceğini açıklar.
Görünmez widget'lar
Widget görünmezse solve metodunun üçüncü argümanı olarak true geçin. İstek o zaman is_invisible: true içerir. Sayfa token ile çağrılacak bir JavaScript callback'i gerektiriyorsa, sunucu tarafındaki bir istemci bunu tetikleyemez ve bir tarayıcı otomasyon aracı daha iyi seçimdir. Kalıpları görünmez captcha rehberi listeler.
Hata yönetimi
Yeniden denemeler geçici hataları kapsar. Yanlış sitekey ya da widget'ın çalışmadığı bir sayfa URL'si gibi değişmeyecek hatalarda denemeyi bırakın ve inceleme için loglayın. Hangi kodlarda duracağı dahil tam politika, captcha solver hata yönetimi rehberinde yer alır.
Sorumlu scraping
Program herkese açık sayfaları scrape ediyorsa önce robots.txt dosyasını ve sitenin koşullarını kontrol edin. İstekler arasına bir gecikme ekleyin ve yalnızca ihtiyacınız olan kişisel veriyi tutun. Yasal arka plan için web scraping yasal mı bölümüne bakın.
Fiyatlandırma
Başarılı her çözüm için ödeme yaparsınız; başarısız çözümler ücretlendirilmez. Oranlar için fiyatlandırma sayfasına bakın. Başlamak için ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın.