Chame o solvethree a partir de um backend ASP.NET Core
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().
// 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.
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.
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.
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.
pendingousolving: 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 verifiqueerrorCodeeerror.
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.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.