使用 C# 求解 reCAPTCHA Enterprise
作者:solvethree阅读需 1 分钟
你可以直接从 C# 调用 solvethree。下面的示例会请求 reCAPTCHA v3 Enterprise 令牌,持续跟踪任务直至完成,并在求解失败时停止。
本页内容
运行前的准备
使用 .NET 8+。无需额外的 NuGet 包。
- 在控制台中为目标主机名创建有效的站点配置文件。请参阅站点配置文件设置。
- 将
SOLVETHREE_API_KEY设为你的工作区 API 密钥,将SOLVETHREE_PROXY设为你的 HTTP(S) 代理 URL。 - 将
accounts.example.com和login替换为你的主机名和页面使用的操作。site应使用主机名,不含协议或路径。
创建任务并等待结果
使用 dotnet new console 创建 .NET 控制台项目,用此代码替换 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。不要在 reCAPTCHA 任务请求体中包含 type 和 url。
在应用中使用令牌
令牌为 solution["token"]!.GetValue<string>()。程序输出的任务 ID 用于获取任务;请在应用的 CAPTCHA 字段中使用令牌值。
读取 solution["userAgent"] 和 solution["secChUa"],用于目标请求的 User-Agent 和 sec-ch-ua 请求头。
通过求解时使用的同一代理发送该请求。然后检查应用响应:生成了令牌并不代表目标接受了请求。
请求失败时
运行您的第一个任务。
使用 $5 工作区额度开始体验。