Chame o solvethree a partir de um backend ASP.NET Core

Por solvethree4 min de leitura

Registre um HttpClient tipado, crie a tarefa uma única vez e consulte seu status com um prazo finito. Mantenha a chave de API no servidor e proteja todas as rotas da aplicação que chamam o cliente.

O exemplo abaixo é um helper REST para reCAPTCHA Enterprise, não um SDK oficial de C#. Ele mantém a criação e a consulta de tarefas separadas para que sua aplicação não precise manter uma requisição recebida aberta até o fim da resolução.

Nesta página

Registre o cliente tipado

Primeiro, ative no console o perfil do site de destino para seu workspace. Enviar um nome de host e uma ação não cria um perfil. Consulte a configuração do perfil de site se o site ainda não estiver configurado.

Coloque a chave do workspace na configuração do servidor como SOLVETHREE_API_KEY. Adicione a classe do cliente, remova os comentários do registro mostrado em Program.cs e coloque-o antes de builder.Build().

ASP.NET Core · um cliente HTTP tipado
// CaptchaClient.cs; .NET 8+, System.Net.Http.Json and System.Text.Json.Nodes.
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json.Nodes;

public sealed class CaptchaClient(HttpClient http)
{
    public async Task<JsonObject> CreateAsync(string site, string proxy, string requestId,
        CancellationToken cancellationToken)
    {
        using var response = await http.PostAsJsonAsync("tasks?waitMs=0",
            new { site, action = "login", proxy, requestId }, cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
    public async Task<JsonObject> GetAsync(string id, CancellationToken cancellationToken)
    {
        using var response = await http.GetAsync("tasks/" + Uri.EscapeDataString(id) + "?waitMs=15000",
            cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
}
// Program.cs, before builder.Build(), in an existing authenticated ASP.NET app:
// builder.Services.AddHttpClient<CaptchaClient>(http => {
//     http.BaseAddress = new Uri("https://api.solvethree.com/v1/");
//     http.Timeout = TimeSpan.FromSeconds(25);
//     http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
//         "Bearer", builder.Configuration["SOLVETHREE_API_KEY"]
//             ?? throw new InvalidOperationException("Missing API key"));
// }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
//     AllowAutoRedirect = false
// });
// Inject CaptchaClient into your authenticated controller/service. Pass its
// cancellation token, create once, save id and poll GetAsync with a finite deadline.

O registro define o endereço base da API, a autenticação Bearer e um tempo limite de transporte de 25 segundos, além de desativar redirecionamentos automáticos. Mantenha a barra final no endereço base: os caminhos relativos tasks do cliente devem ser resolvidos sob /v1/.

O helper usa as extensões JSON do HttpClient e retorna um JsonObject. Ambos os métodos verificam o sucesso HTTP antes de desserializar. Injete CaptchaClient em um controlador ou serviço autenticado; o próprio helper não autentica nem autoriza os chamadores da sua aplicação.

Crie uma única vez e salve as informações de recuperação

  1. 1.

    Escolha o site, a ação e o proxy

    Passe o nome do host de destino como site, não uma URL completa. Este exemplo fixa action como login; altere para a ação que o destino espera. Ele envia um único proxy e usa o modo reCAPTCHA padrão enterprise-v3. Não adicione os campos type ou url.

  2. 2.

    Salve um requestId antes de chamar CreateAsync

    Use 1–64 letras ASCII, números, sublinhados ou hífens. Salve-o com os dados de entrada exatos da tarefa para poder recuperar a mesma tarefa lógica se a resposta for perdida.

  3. 3.

    Chame CreateAsync e salve o ID da tarefa retornado

    CreateAsync faz um único POST com waitMs=0. Passe o CancellationToken do chamador. Depois de obter o ID da tarefa, use GetAsync para consultar essa tarefa em vez de criar outra.

Mantenha a permissão para gastar créditos do workspace sob as verificações de autorização da sua aplicação. Se esses valores vierem de uma requisição recebida, valide o site, a ação e o proxy solicitados de acordo com o que esse chamador tem permissão para usar.

Faça consultas periódicas com um prazo total

GetAsync aplica escape ao ID conhecido da tarefa e solicita waitMs=15000. O tempo limite de 25 segundos do HttpClient limita cada requisição HTTP; ele não limita o tempo total que sua aplicação passa fazendo consultas periódicas. Defina um prazo total separado e propague o cancelamento por todas as chamadas.

  • pending ou solving: continue apenas enquanto o prazo das consultas e o cancelamento do chamador permitirem.
  • ready: pare de consultar e leia a solução. Este é o único status com uma solução utilizável.
  • failed: pare de consultar e verifique errorCode e error.

Em uma aplicação voltada ao navegador, mantenha a criação e as verificações posteriores de status como operações separadas e protegidas, em vez de executar um loop dentro de uma única requisição recebida até a tarefa terminar. Guarde o ID da tarefa quando um prazo local expirar para que uma requisição autorizada posterior possa consultá-la.

Ao enviar o token ao destino pretendido, use a identidade userAgent e secChUa retornada na solução e o mesmo proxy usado na resolução. Uma tarefa pronta significa que uma solução foi gerada, não que a requisição da sua aplicação teve sucesso.

Recupere após um tempo limite sem duplicar o trabalho

CreateAsync atinge o tempo limite ou é cancelado antes de você receber um ID.

O servidor pode já ter criado a tarefa. O cancelamento local não cancela o trabalho remoto.

Experimente: Recupere a tarefa reenviando os mesmos dados de entrada com o requestId salvo. O mesmo ID e os mesmos dados de entrada retornam a tarefa existente; alterar os dados de entrada ao reutilizar esse ID gera um conflito.

GetAsync atinge o tempo limite ou o prazo das consultas expira.

Você já tem um ID de tarefa, então a ausência de uma resposta não exige uma tarefa substituta.

Experimente: Guarde o ID e consulte essa tarefa depois, em uma nova operação com prazo limitado.

A chamada HTTP retorna uma resposta sem sucesso.

EnsureSuccessStatusCode lança uma exceção antes de o helper ler um payload de sucesso. Isso é diferente de receber uma tarefa com status failed.

Experimente: Trate o erro HTTP separadamente. Corrija dados de entrada inválidos em vez de tentar novamente sem alterá-los.

A tarefa chega ao status failed.

Leia errorCode e error para obter os detalhes da falha da tarefa, como site-unreachable.

Experimente: Pare de consultar essa tarefa e resolva a causa informada antes de iniciar outra resolução.

Use o guia de erros da API quando precisar distinguir uma requisição rejeitada pela API de uma falha terminal na resolução.

Execute sua primeira tarefa.

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

Criar um espaço de trabalho
Chame o solvethree a partir de um backend ASP.NET Core · solvethree