Best practices: скорость, стабильность, низкая цена
Интегрировать API легко, но сделать это надежно и экономически эффективно требует внимания к деталям. Вот наши главные советы.
1. Реализуйте ретраи
Могут возникнуть проблемы с сетью или временные ошибки сервера (5xx). Всегда реализуйте механизм повторных попыток с экспоненциальной задержкой.
- Повторяйте при 500, 502, 503, 504.
- Ждите 1с, 2с, 4с между попытками.
Пример на C# с Polly
// Install-Package Polly
using Polly;
using Polly.Retry;
var retryPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync(
retryCount: 3,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
onRetry: (outcome, timespan, attempt, context) =>
{
Console.WriteLine($"Retry {attempt} after {timespan}");
}
);
var response = await retryPolicy.ExecuteAsync(async () =>
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "YOUR_API_KEY");
return await client.PostAsync(
"http://api.noncaptcha.com/api/json/text",
new MultipartFormDataContent()
);
});
2. Обрабатывайте ошибки баланса
Если вы получили ошибку 402 (Недостаточно средств), немедленно приостановите запросы. Не повторяйте их бесконечно, так как это не решит капчу.
Пример обработки ошибок
try
{
var response = await client.PostAsync(url, content);
if (response.StatusCode == HttpStatusCode.PaymentRequired)
{
Console.WriteLine("⚠️ Insufficient balance! Pausing requests...");
await Task.Delay(TimeSpan.FromMinutes(5)); // Wait and check balance
return;
}
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Request failed: {ex.Message}");
// Log and handle appropriately
}
3. Параллелизм
Наш API разработан для обработки параллельных запросов. Если вам нужно решить несколько капч, запускайте запросы параллельно, а не последовательно.
Пример параллельных запросов
// Solve multiple captchas concurrently
var captchaFiles = new[] { "cap1.png", "cap2.png", "cap3.png" };
var tasks = captchaFiles.Select(async file =>
{
using var stream = File.OpenRead(file);
var content = new MultipartFormDataContent();
content.Add(new StreamContent(stream), "image", file);
var response = await client.PostAsync(
"http://api.noncaptcha.com/api/json/text",
content
);
return await response.Content.ReadAsStringAsync();
});
var results = await Task.WhenAll(tasks);
// Process all results
foreach (var result in results)
{
Console.WriteLine($"Result: {result}");
}
Настройка таймаута
// Configure HttpClient with timeout
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(60) // 60 seconds timeout
};
// Or use CancellationToken for more control
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(45));
try
{
var response = await client.PostAsync(url, content, cts.Token);
// Process response
}
catch (OperationCanceledException)
{
Console.WriteLine("Request timed out!");
}