Советы

Best practices: скорость, стабильность, низкая цена

2026-01-24

Интегрировать 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!");
}