Spring Boot से CAPTCHA API को कॉल करें
सर्वर-साइड पर एक CaptchaClient बीन रजिस्टर करें, टास्क एक बार बनाएँ, फिर उसकी सहेजी गई ID से पोल करें। नीचे दिया गया हेल्पर सिंक्रोनस Spring RestClient कॉल का उपयोग करता है और Gson JsonObject रिस्पॉन्स लौटाता है।
इस पेज पर
डिपेंडेंसी जोड़ें और हेल्पर रजिस्टर करें
दिया गया हेल्पर Java 21+, Spring Web 7.0.10 और Gson 2.15.0 का उपयोग करता है। मौजूदा Spring Boot प्रोजेक्ट में, उदाहरण से मेल खाने के लिए केवल spring-web को ओवरराइड करने के बजाय Boot द्वारा प्रबंधित संगत Spring संस्करण बनाए रखें। यदि आपके एप्लिकेशन में Gson पहले से शामिल नहीं है, तो उसे डिपेंडेंसी के रूप में जोड़ें।
// Java 21+, Spring Web 7.0.10 and Gson 2.15.0; use your Boot dependency management.
// Save as CaptchaClient.java in your application's package.
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.http.HttpClient;
import java.time.Duration;
import org.springframework.http.MediaType;
import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.web.client.RestClient;
public final class CaptchaClient {
private final RestClient api;
public CaptchaClient(String key) {
var transport = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NEVER).build();
var factory = new JdkClientHttpRequestFactory(transport);
factory.setReadTimeout(Duration.ofSeconds(25));
api = RestClient.builder().baseUrl("https://api.solvethree.com/v1")
.requestFactory(factory).defaultHeader("Authorization", "Bearer " + key).build();
}
public JsonObject create(String site, String proxy, String requestId) {
var input = new JsonObject();
input.addProperty("site", site);
input.addProperty("action", "login");
input.addProperty("proxy", proxy);
input.addProperty("requestId", requestId); // Save before calling create.
String body = api.post().uri("/tasks?waitMs=0").contentType(MediaType.APPLICATION_JSON)
.body(input.toString()).retrieve().body(String.class);
return JsonParser.parseString(body).getAsJsonObject();
}
public JsonObject get(String id) {
if (!id.matches("[A-Za-z0-9_-]+")) throw new IllegalArgumentException("Invalid task ID");
String body = api.get().uri("/tasks/{id}?waitMs=15000", id)
.retrieve().body(String.class);
return JsonParser.parseString(body).getAsJsonObject();
}
}
// Construct once with System.getenv("SOLVETHREE_API_KEY") in a server-side @Bean.
// Call create once, save its id, then get(id) until ready/failed or your deadline.
// RestClient throws on HTTP errors; keep the saved requestId and any known task id.क्लास को अपने एप्लिकेशन के पैकेज में CaptchaClient.java के रूप में सहेजें। सर्वर-साइड @Bean फ़ैक्टरी मेथड में, SOLVETHREE_API_KEY एनवायरनमेंट वेरिएबल का उपयोग करके इसे एक बार बनाएँ। स्टार्टअप पर जाँचें कि की कॉन्फ़िगर की गई है। हेल्पर इसे Bearer ऑथराइज़ेशन हेडर के रूप में जोड़ता है; इसे ब्राउज़र कोड से बाहर रखें।
कंस्ट्रक्टर इंजेक्शन के ज़रिए उसी बीन का पुनः उपयोग करें। RestClient का कई थ्रेड में पुनः उपयोग किया जा सकता है, लेकिन हर अनुरोध उसे कॉल करने वाले थ्रेड को ब्लॉक करता है। इन मेथड को WebFlux इवेंट लूप पर कॉल न करें। Spring का REST क्लाइंट दस्तावेज़ सिंक्रोनस क्लाइंट का विवरण देता है।
ट्रांसपोर्ट में कनेक्ट टाइमआउट 10 सेकंड और रीड टाइमआउट 25 सेकंड है, और रीडायरेक्ट बंद हैं। रिस्पॉन्स स्ट्रिंग के रूप में पढ़े जाते हैं और Gson से पार्स किए जाते हैं; उन्हें टाइप किए गए रिस्पॉन्स ऑब्जेक्ट में मैप नहीं किया जाता।
साइट, एक्शन और प्रॉक्सी सेट करें
create कॉल करने से पहले, अपने वर्कस्पेस में लक्ष्य साइट के लिए एक सक्रिय प्रोफ़ाइल कॉन्फ़िगर करें। होस्टनेम और एक्शन भेजने से वह प्रोफ़ाइल नहीं बनती। यदि साइट अभी कॉन्फ़िगर नहीं है, तो साइट प्रोफ़ाइल सेटअप देखें।
siteके रूप में होस्टनेम पास करें, पूरा पेज URL नहीं। reCAPTCHA अनुरोध मेंurlयाtypeफ़ील्ड नहीं होता।- हेल्पर में
actionका मानloginहार्डकोड किया गया है। यदि इच्छित अनुरोध किसी अलग एक्शन का उपयोग करता है, तो यह मान बदलें या इसे मेथड पैरामीटर बनाएँ। - एक प्रॉक्सी URL पास करें। API को
proxyयाproxyCandidatesमें से ठीक एक चाहिए; यह हेल्पर एकल-प्रॉक्सी विकल्प लागू करता है। - हेल्पर
recaptchaTypeनहीं भेजता, इसलिए API अपना डिफ़ॉल्टenterprise-v3उपयोग करता है।
एक बार बनाएँ, फिर सहेजी गई टास्क ID से पोल करें
- 1.
बनाने से पहले अनुरोध ID सहेजें
ऐसा
requestIdचुनें जिसमें 1–64 ASCII अक्षर, अंक, अंडरस्कोर या हाइफ़न हों।createकॉल करने से पहले इसे टास्क इनपुट के साथ सहेजें। यदि बनाने का रिस्पॉन्स खो जाए, तो इसकी मदद से आप वही टास्क फिर प्राप्त कर सकते हैं। - 2.
create कॉल करें और लौटाई गई id सहेजें
होस्टनेम, प्रॉक्सी और सहेजी गई अनुरोध ID के साथ बीन का
createमेथड कॉल करें। यहwaitMs=0के साथ/v1/tasksपर एक POST भेजता है। लौटाई गईidसहेजें; आगे की खोज के लिए अनुरोध ID नहीं, इसी टास्क ID का उपयोग करें। - 3.
टास्क के अंतिम स्टेटस पर पहुँचने तक get कॉल करें
सहेजी गई टास्क ID को
getमें पास करें। हर खोजwaitMs=15000का अनुरोध करती है और रिस्पॉन्स की प्रतीक्षा करते समय ब्लॉक होती है। एप्लिकेशन-स्तरीय समय-सीमा के भीतरpendingयाsolvingपर जारी रखें।readyयाfailedपर रुकें। HTTP टाइमआउट अलग-अलग अनुरोधों को सीमित करते हैं, पूरे पोलिंग लूप को नहीं। - 4.
तैयार होने पर ही सॉल्यूशन पढ़ें
reCAPTCHA के लिए, इच्छित लक्ष्य को
solution.tokenभेजें—टास्क ID नहीं। लौटाए गएuserAgentऔरsecChUaका उपयोग उसी सफल प्रॉक्सी के साथ करें। उनकी जगह असंबंधित ब्राउज़र हेडर न रखें और लक्ष्य URL न बदलें। तैयार टास्क एक सॉल्यूशन देता है; इससे यह साबित नहीं होता कि लक्ष्य ने आपका अगला अनुरोध स्वीकार कर लिया।
HTTP त्रुटियों को विफल टास्क से अलग संभालें
- टास्क ID मिलने से पहले create कॉल का टाइमआउट हो जाता है।
हो सकता है कि सर्वर ने टास्क बना दिया हो, भले ही आपके क्लाइंट को उसका रिस्पॉन्स न मिला हो।
यह आज़माएँ: सहेजे गए
requestIdके साथ वही टास्क अनुरोध दोहराकर उसे फिर प्राप्त करें। समान इनपुट मौजूदा टास्क लौटाते हैं। जब तक आप नया तार्किक टास्क बनाना न चाहें, नई अनुरोध ID जनरेट न करें।- get कॉल HTTP स्तर पर विफल होती है।
असफल HTTP रिस्पॉन्स पर
RestClient.retrieve()एक्सेप्शन थ्रो करता है। यह टास्क काfailedस्टेटस नहीं है।यह आज़माएँ: सफलता का पेलोड पढ़ने की कोशिश से पहले HTTP त्रुटि संभालें। दूसरा टास्क बनाने के बजाय, रिकवरी के लिए ज्ञात टास्क ID बनाए रखें। अमान्य इनपुट को बिना बदले दोबारा भेजने से पहले उनकी समस्या का पता लगाएँ।
- टास्क रिस्पॉन्स का स्टेटस
failedहै। उसके
errorCodeऔरerrorपढ़ें;site-unreachableएक संभावित टास्क त्रुटि कोड है।यह आज़माएँ: उस टास्क की पोलिंग रोकें और दूसरा शुरू करने से पहले बताए गए कारण को दूर करें। विफल सॉल्व के लिए राशि वापस की जाती है; यह न मानें कि विफलता का अर्थ अपर्याप्त क्रेडिट है।
- अनुरोध ID का पुनः उपयोग करने पर कॉन्फ़्लिक्ट होता है।
नए टास्क इनपुट की तुलना उस अनुरोध ID के लिए सहेजे गए इनपुट से करें।
यह आज़माएँ: मौजूदा टास्क फिर प्राप्त करने के लिए मूल इनपुट का उपयोग करें। जानबूझकर अलग टास्क इनपुट देने पर नई अनुरोध ID का उपयोग करें।
त्रुटियों को समझने के लिए, CAPTCHA API त्रुटियाँ देखें।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।