حل reCAPTCHA Enterprise باستخدام Java
استخدم HttpClient في Java لطلب رمز، وGson لقراءة استجابة JSON. يستدعي هذا المثال واجهة REST API، وينتظر اكتمال المهمة، ويُرجع حل reCAPTCHA Enterprise.
في هذه الصفحة
أعدّ الموقع والبيئة
استخدم Java 21 أو أحدث. أنشئ ملف موقع تعريفيًا نشطًا للجهة المستهدفة في لوحة التحكم، ثم اضبط SOLVETHREE_API_KEY وSOLVETHREE_PROXY في البيئة التي تشغّل Java.
استبدل accounts.example.com باسم المضيف الذي أعددت له ملفًا تعريفيًا، وlogin بالإجراء الذي تستخدمه الصفحة. يقبل الحقل site اسم مضيف دون مخطط أو مسار.
احفظ Solve.java وشغّله
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، نزّل ملف Gson JAR، ثم ترجم البرنامج وشغّله:
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 Solveتستخدم هذه الأوامر فاصل مسار الأصناف في macOS/Linux، وهو :. على Windows، استخدم ; بين المجلد الحالي وملف Gson JAR.
اقرأ الرمز من النتيجة
يستخدم الإنشاء waitMs=0. تسترجع الحلقة معرّف المهمة نفسه ما دامت حالتها pending أو solving، وتتوقف عند ready أو failed. يمكن أن ينتظر كل طلب GET مدة تصل إلى 15 ثانية؛ وللطرف المستدعي مهلة إجمالية قدرها 180 ثانية.
اقرأ الرمز باستخدام solution.get("token").getAsString(). استخدم userAgent وsecChUa المُعادَين في الطلب المستهدف، عبر الوكيل نفسه. يطبع البرنامج معرّف المهمة، وليس الرمز.
تحقّق من استجابة الجهة المستهدفة بعد الإرسال. تخبرك المهمة الجاهزة بأن حلًا قد أُنشئ؛ لكنها لا تثبت أن التطبيق قبله.
الأخطاء والطلبات المنقطعة
تتوقف الدالة المساعدة عند تلقّي استجابة HTTP غير ناجحة. تُبلغ المهمة المنتهية بالفشل عن errorCode وerror، وتُردّ تكلفة عملية الحل الفاشلة. استخدم مرجع أخطاء API لتحديد ما يجب إصلاحه.
احفظ requestId المُولّد والمدخلات كما هي تمامًا إذا احتجت إلى الاستعادة بعد إعادة التشغيل. إذا انتهت مهلة الإنشاء، فأعد إرسال تلك المدخلات بالمعرّف نفسه. وإذا كان لديك معرّف مهمة بالفعل، فاسترجعها. تؤدي إعادة تشغيل هذا البرنامج إلى إنشاء UUID آخر، وقد تنشئ مهمة أخرى تُحتسب تكلفتها.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.