פתרון reCAPTCHA Enterprise באמצעות C#
אפשר לפנות ל־solvethree ישירות מתוך C#. הדוגמה הבאה מבקשת אסימון reCAPTCHA v3 Enterprise, עוקבת אחר המשימה עד לסיומה ועוצרת אם הפתרון נכשל.
בדף הזה
לפני ההרצה
השתמשו ב־.NET 8+. אין צורך בחבילות NuGet נוספות.
- צרו במסוף פרופיל אתר פעיל עבור שם המארח של היעד. ראו הגדרת פרופיל אתר.
- הגדירו את
SOLVETHREE_API_KEYלמפתח ה־API של סביבת העבודה שלכם ואתSOLVETHREE_PROXYלכתובת ה־URL של פרוקסי ה־HTTP(S) שלכם. - החליפו את
accounts.example.comואתloginבשם המארח שלכם ובפעולה שבה הדף משתמש. עבורsite, השתמשו בשם מארח ללא סכמה או נתיב.
יצירת המשימה והמתנה לתוצאה
צרו פרויקט מסוף של .NET באמצעות dotnet new console, החליפו את Program.cs בקוד הזה והריצו dotnet run.
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json.Nodes;
var key = Environment.GetEnvironmentVariable("SOLVETHREE_API_KEY")
?? throw new Exception("Set SOLVETHREE_API_KEY");
var proxy = Environment.GetEnvironmentVariable("SOLVETHREE_PROXY")
?? throw new Exception("Set SOLVETHREE_PROXY");
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(180));
async Task<JsonObject> Api(HttpMethod method, string path, JsonObject? body = null)
{
using var request = new HttpRequestMessage(method, "https://api.solvethree.com/v1" + path);
if (body is not null)
request.Content = new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json");
using var response = await http.SendAsync(request, deadline.Token);
response.EnsureSuccessStatusCode();
return JsonNode.Parse(await response.Content.ReadAsStringAsync(deadline.Token))!.AsObject();
}
var requestId = Guid.NewGuid().ToString(); // Save with these inputs for recovery.
var input = new JsonObject {
["site"] = "accounts.example.com", ["action"] = "login",
["proxy"] = proxy, ["requestId"] = requestId
};
var task = await Api(HttpMethod.Post, "/tasks?waitMs=0", input);
while (task["status"]!.GetValue<string>() is "pending" or "solving")
{
var id = Uri.EscapeDataString(task["id"]!.GetValue<string>());
task = await Api(HttpMethod.Get, "/tasks/" + id + "?waitMs=15000");
if (task["status"]!.GetValue<string>() is "pending" or "solving")
await Task.Delay(1000, deadline.Token);
}
if (task["status"]!.GetValue<string>() != "ready")
throw new Exception("Task failed: " + task["errorCode"]?.GetValue<string>()
+ ": " + task["error"]?.GetValue<string>());
var solution = task["solution"]!.AsObject();
// Use solution["token"], ["userAgent"] and ["secChUa"] with the original proxy.
Console.WriteLine("Ready task: " + task["id"]!.GetValue<string>());בקשת ה־POST משתמשת ב־waitMs=0 כדי להחזיר משימה מיד. לאחר מכן כל בקשת GET ממתינה עד 15 שניות לעדכון. הלולאה נמשכת במצב pending או solving, ועוצרת במצב ready או failed.
ברירת המחדל של הבקשה היא Enterprise v3. עבור v3 רגיל, הוסיפו recaptchaType: v3. אל תכללו type ו־url בגוף משימת reCAPTCHA.
שימוש באסימון ביישום שלכם
האסימון הוא solution["token"]!.GetValue<string>(). מזהה המשימה שהתוכנית מדפיסה משמש לאחזור המשימה; השתמשו בערך האסימון בשדה ה־CAPTCHA של היישום שלכם.
קראו את solution["userAgent"] ואת solution["secChUa"] עבור הכותרות User-Agent ו־sec-ch-ua של הבקשה ליעד.
שלחו את הבקשה דרך אותו פרוקסי ששימש לפתרון. לאחר מכן בדקו את תגובת היישום: יצירת אסימון אינה מעידה שהיעד קיבל את הבקשה.
אם הבקשה נכשלת
משימה שנכשלה כוללת errorCode ו־error; הדוגמה עוצרת ומדווחת עליהם. על פתרונות שנכשלו ניתן החזר. שגיאת HTTP כגון 401 או 402 היא בעיה נפרדת בבקשה — עיינו במדריך שגיאות ה־API לפני ניסיון חוזר.
שמרו את requestId ואת הקלט המדויק של המשימה אם תזדקקו לשחזור לאחר חריגה ממגבלת הזמן או הפעלה מחדש של התהליך. אם יש לכם מזהה משימה, תשאלו אותה. אחרת, שלחו שוב את הקלט המקורי עם אותו requestId. הפעלה מחדש של התוכנית ללא צעדים נוספים יוצרת מזהה אחר ועלולה ליצור פתרון נוסף בתשלום.
הקוד הקורא מפסיק להמתין לאחר המועד האחרון שהוגדר לו; פעולה זו אינה מבטלת משימה שכבר נוצרה. לרצף הפעולות המלא, ראו תשאול ושחזור לאחר חריגה ממגבלת הזמן.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.