
Aloísio Vítor
Image Processing Expert

Desafios CAPTCHA, como o Google reCAPTCHA, são comumente usados por sites para bloquear bots e impedir acesso automatizado ao seu conteúdo. Para contornar tais desafios programaticamente, você pode usar serviços como o Capsolver, que oferece soluções baseadas em API para resolver esses CAPTCHAs.
Neste guia, mostraremos como:
Em C#, a classe HttpClient é comumente usada para enviar solicitações HTTP e receber respostas de sites. Você pode combinar isso com um analisador HTML como HtmlAgilityPack para extrair dados de páginas da web.
Install-Package HtmlAgilityPack
Install-Package Newtonsoft.Json
Vamos raspar citações do site Quotes to Scrape usando HttpClient e HtmlAgilityPack.
using System;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
string url = "http://quotes.toscrape.com/";
// Envie uma solicitação GET para a página
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// Analise o conteúdo da página usando o HtmlAgilityPack
string pageContent = await response.Content.ReadAsStringAsync();
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(pageContent);
// Encontre todas as citações na página
var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");
// Imprima cada citação
foreach (var quote in quotes)
{
Console.WriteLine(quote.InnerText);
}
}
else
{
Console.WriteLine($"Falha ao recuperar a página. Código de Status: {response.StatusCode}");
}
}
}
text.Quando um site emprega reCAPTCHA v3 & reCaptcha v2 para segurança, você pode resolver o CAPTCHA usando a API Capsolver. Abaixo está como você pode integrar o Capsolver com HttpClient para resolver desafios reCAPTCHA.
Install-Package Newtonsoft.Json
Nesta seção, demonstraremos como resolver desafios reCAPTCHA v2 usando a API Capsolver e HttpClient.
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
private static readonly string apiUrl = "https://api.capsolver.com";
private static readonly string clientKey = "YOUR_API_KEY"; // Substitua pela sua Chave de API do Capsolver
static async Task Main(string[] args)
{
try
{
// Passo 1: Crie uma tarefa para resolver reCAPTCHA v3
string taskId = await CreateTask();
Console.WriteLine("ID da Tarefa: " + taskId);
// Passo 2: Recupere o resultado da tarefa
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("Resultado da Tarefa (Token CAPTCHA): " + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("Erro: " + ex.Message);
}
}
// Método para criar uma nova tarefa de resolução de CAPTCHA
private static async Task<string> CreateTask()
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // Tipo de tarefa para reCAPTCHA v3 sem proxy
websiteURL = "", // O URL do site para resolver o CAPTCHA
websiteKey = "" // Chave do site reCAPTCHA
}
};
// Envie a solicitação para criar a tarefa
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("Falha ao criar a tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao criar a tarefa: " + jsonResponse["errorDescription"]);
}
// Retorne o ID da tarefa para ser usado na próxima etapa
return jsonResponse["taskId"].ToString();
}
}
// Método para recuperar o resultado de uma tarefa de resolução de CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// Pesquise pelo resultado da tarefa a cada 5 segundos
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("Falha ao obter o resultado da tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao obter o resultado da tarefa: " + jsonResponse["errorDescription"]);
}
// Se a tarefa estiver pronta, retorne o token CAPTCHA
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// Espere 5 segundos antes de verificar novamente
Console.WriteLine("A tarefa ainda está sendo processada, aguardando 5 segundos...");
await Task.Delay(5000);
}
}
}
}
Método CreateTask:
/createTask do Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v2.clientKey, websiteURL, websiteKey e especifica o tipo de tarefa como ReCaptchaV2TaskProxyLess.taskId, que será usado para recuperar o resultado da tarefa.Método GetTaskResult:
/getTaskResult para verificar o resultado da tarefa criada anteriormente.status: ready).gRecaptchaResponse, que pode ser usado para contornar o CAPTCHA.Nesta seção, demonstraremos como resolver desafios reCAPTCHA v3 usando a API Capsolver e HttpClient.
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
private static readonly string apiUrl = "https://api.capsolver.com";
private static readonly string clientKey = "YOUR_API_KEY"; // Substitua pela sua Chave de API do Capsolver
static async Task Main(string[] args)
{
try
{
// Passo 1: Crie uma tarefa para resolver reCAPTCHA v3
string taskId = await CreateTask();
Console.WriteLine("ID da Tarefa: " + taskId);
// Passo 2: Recupere o resultado da tarefa
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("Resultado da Tarefa (Token CAPTCHA): " + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("Erro: " + ex.Message);
}
}
// Método para criar uma nova tarefa de resolução de CAPTCHA
private static async Task<string> CreateTask()
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // Tipo de tarefa para reCAPTCHA v3 sem proxy
websiteURL = "", // O URL do site para resolver o CAPTCHA
websiteKey = "" // Chave do site reCAPTCHA
}
};
// Envie a solicitação para criar a tarefa
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("Falha ao criar a tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao criar a tarefa: " + jsonResponse["errorDescription"]);
}
// Retorne o ID da tarefa para ser usado na próxima etapa
return jsonResponse["taskId"].ToString();
}
}
// Método para recuperar o resultado de uma tarefa de resolução de CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// Pesquise pelo resultado da tarefa a cada 5 segundos
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("Falha ao obter o resultado da tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao obter o resultado da tarefa: " + jsonResponse["errorDescription"]);
}
// Se a tarefa estiver pronta, retorne o token CAPTCHA
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// Espere 5 segundos antes de verificar novamente
Console.WriteLine("A tarefa ainda está sendo processada, aguardando 5 segundos...");
await Task.Delay(5000);
}
}
}
}
Método CreateTask:
/createTask do Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v3.clientKey, websiteURL, websiteKey e especifica o tipo de tarefa como ReCaptchaV3TaskProxyLess.taskId, que será usado para recuperar o resultado da tarefa.Método GetTaskResult:
/getTaskResult para verificar o resultado da tarefa criada anteriormente.status: ready).gRecaptchaResponse, que pode ser usado para contornar o CAPTCHA.Ao usar ferramentas de web scraping em C#, siga sempre essas boas práticas:
robots.txt: Certifique-se de que o site permite web scraping verificando o arquivo robots.txt.User-Agent, às suas solicitações HTTP.Usando HttpClient para web scraping e Capsolver para resolução de CAPTCHA, você pode automatizar efetivamente interações com sites que empregam desafios CAPTCHA. Certifique-se sempre de que suas atividades de web scraping estejam em conformidade com os termos de serviço do site de destino e os requisitos legais.
Feliz raspando!
Este guia integra o web scraping usando HtmlAgilityPack e demonstra como lidar com desafios reCAPTCHA com Capsolver, usando apenas HttpClient em C#.
Aprenda como lidar com o recaptcha durante a raspagem de e-commerce com fluxos de trabalho conformes, diagnósticos, exemplos do CapSolver e controles de risco práticos.

Aprenda como a extração de dados com IA funciona, desde a raspagem de web e resolução de CAPTCHA até a limpeza de HTML, análise de LLM e geração de JSON estruturado. Explore estratégias de bypass anti-bot, frameworks de extração semântica como AXE e pipelines de raspagem de web com IA escaláveis.
