Java में Selenium के साथ CAPTCHA API का उपयोग करें
पहले टोकन का अनुरोध करें, फिर नेविगेट करने से पहले उसी प्रॉक्सी और लौटाए गए userAgent तथा secChUa के साथ Chrome कॉन्फ़िगर करें। solution.token को अपने एप्लिकेशन के CAPTCHA फ़ील्ड में डालें, फ़ॉर्म सबमिट करें और एप्लिकेशन की सफल स्थिति का इंतज़ार करें—सिर्फ टास्क तैयार होने का नहीं।
उदाहरण Java REST हेल्पर और Selenium ChromeDriver का उपयोग करते हैं। इनमें स्वचालित CAPTCHA पहचान या ब्राउज़र प्लगइन शामिल नहीं है।
इस पेज पर
Java प्रोजेक्ट और लक्ष्य साइट तैयार करें
- 1.
प्रोजेक्ट कॉन्फ़िगर करें
Java 21 या बाद के संस्करण का उपयोग करें। Maven प्रोजेक्ट में Java कंपाइलेशन स्तर 21 पर सेट करें और Gson 2.15.0 तथा
org.seleniumhq.selenium:selenium-java:4.52.0जोड़ें। Selenium Chrome दस्तावेज़ के अनुसार Chrome और ChromeDriver कॉन्फ़िगर करें। - 2.
दोनों Java फ़ाइलें सहेजें
पहला उदाहरण
src/main/java/Solve.javaऔर दूसराsrc/main/java/BrowserSolve.javaके रूप में सहेजें। उन्हें एक ही पैकेज में रखें; दी गई फ़ाइलों में पैकेज डिक्लेरेशन नहीं है।BrowserSolve,Solve.apiको कॉल करता है,Solve.mainको नहीं। - 3.
साइट प्रोफ़ाइल सक्रिय करें
solvethree कंसोल में लक्ष्य होस्टनेम सेट करें और सुनिश्चित करें कि उसकी प्रोफ़ाइल आपके वर्कस्पेस के लिए सक्रिय है। होस्टनेम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती। साइट प्रोफ़ाइल सेटअप देखें।
- 4.
परिवेश सेट करें
नीचे दिए गए तीन एनवायरनमेंट वेरिएबल उस प्रोसेस में कॉन्फ़िगर करें जो
BrowserSolveचलाएगी। वर्कस्पेस API कुंजी अपनी विश्वसनीय Java प्रोसेस में रखें, पेज या ब्राउज़र JavaScript में नहीं।
| वेरिएबल | मान |
|---|---|
SOLVETHREE_API_KEY | आपकी वर्कस्पेस API कुंजी। |
SOLVETHREE_PROXY | IP-अनुमति सूची वाली HTTP प्रॉक्सी का URL, जिसमें यूज़रनेम या पासवर्ड, पाथ, क्वेरी या फ़्रैगमेंट शामिल न हो। |
TARGET_URL | फ़ॉर्म वाले एप्लिकेशन पेज का पूरा URL। |
इस उदाहरण के लिए IP-अनुमति सूची वाली प्रॉक्सी आवश्यक है, क्योंकि यह Chrome के प्रॉक्सी URL के माध्यम से प्रॉक्सी क्रेडेंशियल भेजने का समर्थन नहीं करता। वही प्रॉक्सी मान टास्क API और Chrome, दोनों को दिया जाता है।
API अनुरोधों के लिए Solve.java जोड़ें
Solve.api, https://api.solvethree.com/v1 पर प्रमाणीकृत अनुरोध भेजता है, सफल रिस्पॉन्स पार्स करने से पहले HTTP स्टेटस जाँचता है और हर अनुरोध को स्थानीय समय-सीमा में बचे समय तक सीमित करता है।
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());
}
}स्वतंत्र main मेथड टास्क बनाने और पोलिंग का उदाहरण दिखाता है। इसका accounts.example.com होस्टनेम और login ऐक्शन प्लेसहोल्डर हैं। Selenium इंटीग्रेशन के लिए इस फ़ाइल को हेल्पर के रूप में उपयोग करें और इसके बजाय BrowserSolve चलाएँ; दोनों main मेथड चलाने से अलग-अलग टास्क बनेंगे।
reCAPTCHA अनुरोध के लिए site में होस्टनेम, एप्लिकेशन का action और proxy या proxyCandidates में से ठीक एक आवश्यक है। type या url न जोड़ें। recaptchaType छोड़ने पर enterprise-v3 चुना जाता है, जिसका उपयोग इन उदाहरणों में किया गया है।
तैयार समाधान की पहचान के साथ Chrome शुरू करें
BrowserSolve, TARGET_URL से site निकालता है, टास्क बनाता है और उसकी स्थिति pending या solving रहने तक पोल करता है। केवल ready टास्क ही ब्राउज़र में उपयोग होने वाला समाधान देता है।
// Save as BrowserSolve.java beside Solve.java from the Java REST quickstart.
// Add Selenium Java 4.52.0 and Gson 2.15.0 to your Maven dependencies; Java 21+.
import com.google.gson.JsonObject;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Map;
import java.util.UUID;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class BrowserSolve {
public static void main(String[] args) throws Exception {
String target = System.getenv("TARGET_URL");
String proxy = System.getenv("SOLVETHREE_PROXY");
URI proxyUri = URI.create(proxy);
if (proxyUri.getUserInfo() != null) throw new IllegalArgumentException("Use an IP-allowlisted proxy");
var input = new JsonObject();
input.addProperty("site", URI.create(target).getHost());
input.addProperty("action", "login");
input.addProperty("proxy", proxy);
input.addProperty("requestId", UUID.randomUUID().toString());
long deadline = System.nanoTime() + Duration.ofSeconds(180).toNanos();
var task = Solve.api("/tasks?waitMs=0", input, deadline);
while (task.get("status").getAsString().matches("pending|solving")) {
String id = URLEncoder.encode(task.get("id").getAsString(), StandardCharsets.UTF_8);
task = Solve.api("/tasks/" + id + "?waitMs=15000", null, deadline);
if (task.get("status").getAsString().matches("pending|solving")) Thread.sleep(1000);
}
if (!task.get("status").getAsString().equals("ready")) throw new IllegalStateException("Task failed");
var solution = task.getAsJsonObject("solution");
var options = new ChromeOptions();
options.addArguments("--proxy-server=" + proxy, "--user-agent=" + solution.get("userAgent").getAsString());
var browser = new ChromeDriver(options);
try {
browser.executeCdpCommand("Network.enable", Map.of());
browser.executeCdpCommand("Network.setExtraHTTPHeaders", Map.of("headers",
Map.of("sec-ch-ua", solution.get("secChUa").getAsString())));
browser.get(target);
var wait = new WebDriverWait(browser, Duration.ofSeconds(20));
var field = wait.until(driver -> driver.findElement(By.name("g-recaptcha-response")));
browser.executeScript("arguments[0].value=arguments[1]; arguments[0].dispatchEvent(new Event('input',{bubbles:true}));",
field, solution.get("token").getAsString());
browser.findElement(By.cssSelector("button[type=submit]")).click();
wait.until(driver -> driver.findElement(By.id("success"))); // Your application's success marker.
} finally { browser.quit(); }
}
}क्रम महत्वपूर्ण है: ChromeOptions प्रॉक्सी और लौटाया गया यूज़र एजेंट सेट करता है, फिर ChromeDriver, browser.get(target) से पहले CDP के ज़रिए लौटाया गया sec-ch-ua हेडर सेट करता है। पहले किसी असंबंधित पहचान के साथ पेज न खोलें और फिर केवल टोकन सबमिट करते समय पहचान न बदलें।
यह उदाहरण जानबूझकर एक ही proxy भेजता है, ताकि Chrome को कई विकल्पों में से चुने बिना उसी प्रॉक्सी का उपयोग करने दिया जा सके। लक्ष्य URL को टास्क में इस्तेमाल किए गए होस्टनेम और ऐक्शन के अनुरूप रखें।
BrowserSolve चलाने से पहले फ़ॉर्म को अनुकूलित करें
ब्राउज़र उदाहरण आपके स्वामित्व वाले ऐसे फ़ॉर्म को लक्षित करता है जिसमें CAPTCHA रिस्पॉन्स फ़ील्ड, सबमिट बटन और सफलता दर्शाने वाला एलिमेंट हो। classpath में Maven डिपेंडेंसी के साथ BrowserSolve.main चलाने से पहले इन एप्लिकेशन-विशिष्ट मानों को बदलें।
action:loginको उस ऐक्शन से बदलें जिसका उपयोग आपका एप्लिकेशन इस सबमिशन के लिए करता है।g-recaptcha-response: पुष्टि करें कि आपका फ़ॉर्म वास्तव में किस फ़ील्ड नाम को सबमिट करता है। उदाहरणsolution.tokenअसाइन करता है और बबल होने वालाinputइवेंट डिस्पैच करता है।button[type=submit]: यदि यह सिलेक्टर इच्छित फ़ॉर्म के सबमिट बटन की पहचान नहीं करता, तो इसे बदलें।success: इस एलिमेंट ID को ऐसी स्थिति से बदलें जो केवल मौजूदा सबमिशन सफल होने के बाद दिखाई दे।
फ़ील्ड सेट करना और इवेंट डिस्पैच करना हर CAPTCHA के लिए काम करने वाला कॉलबैक नहीं है। यदि आपके एप्लिकेशन का फ़ॉर्म लॉजिक उस फ़ील्ड या इवेंट का उपयोग नहीं करता, तो सबमिशन चरण को उसकी वास्तविक बाइंडिंग के अनुसार बदलें। बाहर भेजे जा रहे अनुरोध की जाँच करके पुष्टि करें कि उसमें solution.token है, न कि टास्क ID या कोई पुराना टोकन।
अंतिम WebDriver प्रतीक्षा एप्लिकेशन के सफलता दर्शाने वाले एलिमेंट की जाँच करती है। यह संकेत सावधानी से चुनें: सबमिशन से पहले ही मौजूद एलिमेंट नए अनुरोध के बारे में कुछ साबित नहीं करता। टास्क तैयार होने का अर्थ है कि solvethree ने समाधान जनरेट कर दिया है; लक्ष्य ने उसे स्वीकार किया या नहीं, यह एप्लिकेशन के रिस्पॉन्स से तय होता है।
अनावश्यक रूप से दूसरा टास्क बनाए बिना विफलताएँ संभालें
- API असफलता दर्शाने वाला HTTP रिस्पॉन्स लौटाता है।
HTTP रिस्पॉन्स की जाँच टास्क की स्थिति से अलग करें। Solve.api उसे सफल पेलोड मानने से पहले ही अपवाद उत्पन्न करता है।
यह आज़माएँ: दोबारा प्रयास करने से पहले अनुरोध की त्रुटि का कारण पता करें। बिना बदले अमान्य इनपुट बार-बार भेजने के बजाय अनुरोध की फ़ील्ड और सक्रिय साइट प्रोफ़ाइल की पुष्टि करें।
- टास्क की स्थिति failed हो जाती है।
टास्क रिस्पॉन्स से errorCode और error पढ़ें। BrowserSolve का सामान्य अपवाद इन्हें नहीं दिखाता, जबकि Solve.java का स्टैंडअलोन उदाहरण दिखाता है।
यह आज़माएँ: उस टास्क की पोलिंग रोकें और अपने त्रुटि प्रबंधन में उन फ़ील्ड को दिखाएँ। विफल CAPTCHA समाधान का शुल्क वापस किया जाता है; हर विफलता को क्रेडिट की समस्या न मानें।
- टास्क बनाने के दौरान टाइमआउट हो जाता है या स्थानीय समय-सीमा समाप्त हो जाती है।
पता करें कि आपके पास पहले से टास्क ID है या आपने मूल अनुरोध बॉडी और requestId सहेजे हैं। कनेक्शन टाइमआउट यह साबित नहीं करता कि टास्क बनाना विफल हुआ।
यह आज़माएँ: टास्क ID का उपयोग करके परिणाम प्राप्त करना फिर शुरू करें, या उसी requestId और बिल्कुल समान इनपुट के साथ टास्क निर्माण को रिकवर करें। यदि रीस्टार्ट के बाद भी रिकवरी चाहिए, तो टास्क बनाने से पहले बॉडी सहेजें; दिए गए main मेथड को दोबारा चलाने पर नया requestId जनरेट होता है।
- टास्क तैयार है, लेकिन एप्लिकेशन सबमिशन अस्वीकार कर देता है।
भेजे जा रहे टोकन, ऐक्शन, लक्ष्य URL, प्रॉक्सी, यूज़र एजेंट और sec-ch-ua की जाँच करें। पुष्टि करें कि एप्लिकेशन ने वास्तव में फ़ील्ड का नया असाइन किया गया मान सबमिट किया है।
यह आज़माएँ: दूसरे CAPTCHA समाधान के लिए भुगतान करने से पहले बेमेल मान या सबमिशन बाइंडिंग ठीक करें। सफल प्रॉक्सी और लौटाई गई पहचान को साथ रखें।
180-सेकंड की API समय-सीमा और एप्लिकेशन के लिए 20-सेकंड की प्रतीक्षा उदाहरणों में चुनी गई स्थानीय सीमाएँ हैं, सेवा की गारंटी नहीं। API त्रुटियों के अतिरिक्त विवरण के लिए CAPTCHA API त्रुटियाँ देखें।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।