使用 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。

C# · Program.cs (.NET 8+)
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 请求头。

通过求解时使用的同一代理发送该请求。然后检查应用响应:生成了令牌并不代表目标接受了请求。

请求失败时

失败的任务包含 errorCode 和 error;示例会停止并报告这些信息。求解失败会退款。401 或 402 等 HTTP 错误属于另一类请求问题,请在重试前查看 API 错误参考。

如果需要在超时或进程重启后恢复,请保留 requestId 和完全一致的任务输入。如果已有任务 ID,就轮询该任务。否则,使用相同的 requestId 重新发送原始输入。直接重启程序会生成另一个 ID,可能创建另一次计费求解。

调用方在截止时间后停止等待,但这不会取消已创建的任务。完整流程请参阅轮询与超时恢复。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
使用 C# 求解 reCAPTCHA Enterprise · solvethree