Resolva reCAPTCHA Enterprise com C#

Por solvethree2 min de leitura

Você pode chamar o solvethree diretamente do C#. O exemplo abaixo solicita um token do reCAPTCHA v3 Enterprise, acompanha a tarefa até sua conclusão e interrompe a execução se a resolução falhar.

Nesta página

Antes de executar

Use .NET 8+. Nenhum pacote NuGet adicional é necessário.

  • Crie no console um perfil de site ativo para o hostname de destino. Consulte a configuração do perfil de site.
  • Defina SOLVETHREE_API_KEY com a chave de API do seu espaço de trabalho e SOLVETHREE_PROXY com a URL do seu proxy HTTP(S).
  • Substitua accounts.example.com e login pelo seu hostname e pela ação usada pela página. Use um hostname em site, sem esquema ou caminho.

Crie a tarefa e aguarde o resultado

Crie um projeto de console .NET com dotnet new console, substitua Program.cs por este código e execute 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>());

O POST usa waitMs=0 para retornar uma tarefa imediatamente. Cada GET aguarda até 15 segundos por uma atualização. O loop continua enquanto o status é pending ou solving e termina em ready ou failed.

A requisição usa Enterprise v3 por padrão. Para v3 padrão, adicione recaptchaType: v3. Não inclua type nem url no corpo de uma tarefa de reCAPTCHA.

Use o token no seu aplicativo

O token está em solution["token"]!.GetValue<string>(). O ID da tarefa exibido pelo programa serve para consultar a tarefa; use o valor do token no campo de CAPTCHA do seu aplicativo.

Leia solution["userAgent"] e solution["secChUa"] para os cabeçalhos User-Agent e sec-ch-ua da requisição ao destino.

Envie essa requisição pelo mesmo proxy usado na resolução. Depois, verifique a resposta do aplicativo: um token gerado não comprova que o destino aceitou a requisição.

Se a requisição falhar

Uma tarefa com falha inclui errorCode e error; o exemplo interrompe a execução e os informa. Resoluções com falha são reembolsadas. Um erro HTTP, como 401 ou 402, é um problema separado na requisição — consulte a referência de erros da API antes de tentar novamente.

Guarde o requestId e os parâmetros exatos da tarefa se precisar recuperá-la após um timeout ou reinício do processo. Se você tiver o ID da tarefa, consulte-a periodicamente. Caso contrário, reenvie os parâmetros originais com o mesmo requestId. Simplesmente reiniciar o programa gera outro ID e pode criar outra resolução cobrável.

O chamador para de esperar quando o prazo termina; isso não cancela uma tarefa já criada. Consulte consultas periódicas e recuperação após timeout para ver a sequência completa.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Resolva reCAPTCHA Enterprise com C# · solvethree