Руководство

Как решать Puzzle каптчу Яндекса: Полное руководство

2026-05-21

Научитесь автоматически решать Yandex SmartCaptcha (тип Puzzle/Slider) с помощью нашего API. Это руководство охватывает извлечение параметров через regex, примеры на C# и интеграцию с API.

1. Что такое Puzzle капча Яндекса?

Puzzle капча Яндекса (также известная как Kaleidoscope или слайдер-капча) требует от пользователя перетащить кусочек пазла для завершения изображения. Задача — определить правильный номер шага (позицию), куда вставляется кусочек.

Наш API решает Puzzle капчи Яндекса за ~1.24 секунды с точностью 99.8%.

2. Извлечение параметров из HTML страницы

Для решения Puzzle капчи Яндекса нужно извлечь два ключевых параметра из HTML страницы:

  • imageSrc - URL фонового изображения пазла
  • task - массив чисел, представляющий паттерн пазла, например [6,8,2,7,0,6,8,0,3,2,8,3,3,0,1,5,2,7,8,6,6,2,6,1,2,6]

2.1 Regex-шаблоны для извлечения параметров

Используйте эти проверенные regex-шаблоны для извлечения параметров капчи из JavaScript/HTML:

C# Regex-шаблоны (Compiled)

Извлечение массива task:

task:""\[(.*?)\]""

Извлечение URL imageSrc:

imageSrc:""(.*?)""

Полный пример на C#:

using System.Text.RegularExpressions;

// Compiled regex patterns for performance
private static readonly Regex _captchaTasks = new(
    @"task:""\[(.*?)\]""", 
    RegexOptions.IgnoreCase | RegexOptions.Compiled);

private static readonly Regex _captchaUrl = new(
    @"imageSrc:""(.*?)""", 
    RegexOptions.IgnoreCase | RegexOptions.Compiled);

public static (string? imageUrl, string? taskArray) ExtractPuzzleParams(string html)
{
    var taskMatch = _captchaTasks.Match(html);
    var urlMatch = _captchaUrl.Match(html);
    
    string? task = taskMatch.Success ? $"[{taskMatch.Groups[1].Value}]" : null;
    string? imageUrl = urlMatch.Success ? urlMatch.Groups[1].Value : null;
    
    return (imageUrl, task);
}

2.2 Скачивание изображения пазла

public static async Task<byte[]> DownloadPuzzleImageAsync(string imageUrl)
{
    using var client = new HttpClient();
    return await client.GetByteArrayAsync(imageUrl);
}

// Usage
var (imageUrl, task) = ExtractPuzzleParams(htmlContent);
if (!string.IsNullOrEmpty(imageUrl) && !string.IsNullOrEmpty(task))
{
    var imageBytes = await DownloadPuzzleImageAsync(imageUrl);
    // Save to file if needed
    await File.WriteAllBytesAsync("puzzle.png", imageBytes);
}

3. Решение через noncaptcha API

Когда у вас есть изображение пазла и массив task, отправьте их в наш API:

3.1 API Endpoint

POST /api/json/puzzle Content-Type: multipart/form-data
Parameter    Type      Description
captcha      file      Puzzle background image (PNG/JPG)
task         string    Task array as JSON string, e.g. "[6,8,2,7,0,6,8,0,3,2,8,3,3,0,1,5,2,7,8,6,6,2,6,1,2,6]"

3.2 Пример cURL

curl -X POST "http://api.noncaptcha.com/api/json/puzzle" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "captcha=@puzzle.png" \
  -F "task=[6,8,2,7,0,6,8,0,3,2,8,3,3,0,1,5,2,7,8,6,6,2,6,1,2,6]"

3.3 Пример на C# (полный)

using System.Net.Http;
using System.Text;
using System.Text.Json;

public async Task<int> SolveYandexPuzzleAsync(
    string apiKey, 
    string imagePath, 
    string taskArray)
{
    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
    
    var content = new MultipartFormDataContent();
    
    // Add puzzle image
    var imageBytes = await File.ReadAllBytesAsync(imagePath);
    var imageContent = new ByteArrayContent(imageBytes);
    imageContent.Headers.ContentType = 
        new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");
    content.Add(imageContent, "captcha", Path.GetFileName(imagePath));
    
    // Add task array as string
    content.Add(new StringContent(taskArray, Encoding.UTF8), "task");
    
    // Send request
    var response = await client.PostAsync(
        "http://api.noncaptcha.com/api/json/puzzle", 
        content
    );
    
    response.EnsureSuccessStatusCode();
    
    // Parse response: {"step": 12}
    var jsonResponse = await response.Content.ReadAsStringAsync();
    using var doc = JsonDocument.Parse(jsonResponse);
    return doc.RootElement.GetProperty("step").GetInt32();
}

3.4 Полная интеграция: Извлечение + Решение

public class YandexPuzzleSolver
{
    private readonly HttpClient _client;
    private readonly string _apiKey;
    
    // Compiled regex patterns
    private static readonly Regex _captchaTasks = new(
        @"task:""\[(.*?)\]""", 
        RegexOptions.IgnoreCase | RegexOptions.Compiled);
    
    private static readonly Regex _captchaUrl = new(
        @"imageSrc:""(.*?)""", 
        RegexOptions.IgnoreCase | RegexOptions.Compiled);
    
    public YandexPuzzleSolver(string apiKey)
    {
        _apiKey = apiKey;
        _client = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
        _client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
    }
    
    public async Task<int?> SolveFromHtmlAsync(string htmlContent)
    {
        // 1. Extract parameters using regex
        var taskMatch = _captchaTasks.Match(htmlContent);
        var urlMatch = _captchaUrl.Match(htmlContent);
        
        if (!taskMatch.Success || !urlMatch.Success)
            return null;
            
        string taskArray = $"[{taskMatch.Groups[1].Value}]";
        string imageUrl = urlMatch.Groups[1].Value;
        
        // 2. Download puzzle image
        var imageBytes = await _client.GetByteArrayAsync(imageUrl);
        
        // 3. Prepare multipart request
        var content = new MultipartFormDataContent();
        content.Add(new ByteArrayContent(imageBytes), "captcha", "puzzle.png");
        content.Add(new StringContent(taskArray, Encoding.UTF8), "task");
        
        // 4. Send to API
        var response = await _client.PostAsync(
            "http://api.noncaptcha.com/api/json/puzzle",
            content
        );
        
        // 5. Parse and return step number
        var json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);
        return doc.RootElement.GetProperty("step").GetInt32();
    }
    
    public void Dispose() => _client?.Dispose();
}

// Usage example:
using var solver = new YandexPuzzleSolver("YOUR_API_KEY");
var html = await httpClient.GetStringAsync("https://example.com/page-with-captcha");
var step = await solver.SolveFromHtmlAsync(html);

if (step.HasValue)
{
    Console.WriteLine($"✅ Move slider to step: {step.Value}");
    // Use step to click slider buttons or move slider element
}
else
{
    Console.WriteLine("❌ Failed to extract captcha parameters");
}

4. Использование решения: Перемещение слайдера

После получения номера шага от API, нужно симулировать действие пользователя для перемещения слайдера пазла в правильную позицию.

// Example using Playwright for browser automation
public async Task MoveSliderToStepAsync(IPage page, int step)
{
    // Wait for slider controls
    var nextBtn = await page.WaitForSelectorAsync(
        "button[aria-label*='Сдвинуть'], button[aria-label*='Move']",
        new() { Timeout = 10000 });
    
    var slider = await page.WaitForSelectorAsync("#captcha-slider");
    var submitBtn = await page.WaitForSelectorAsync("button[data-testid='submit']");
    
    // Click 'next' button 'step' times with human-like delays
    var random = new Random();
    for (int i = 0; i < step; i++)
    {
        await nextBtn.ClickAsync();
        await Task.Delay(random.Next(100, 400)); // Human-like delay
    }
    
    // Small random pause before submit
    await Task.Delay(random.Next(300, 900));
    
    // Click submit button
    await submitBtn.ClickAsync();
    
    // Wait for navigation or captcha disappearance
    await page.WaitForLoadStateAsync(LoadState.NetworkIdle);
}

5. Обработка ошибок и рекомендации

Логика повторных попыток: Если API возвращает ошибку или капча не решена правильно, реализуйте повторные попытки с экспоненциальной задержкой (макс. 3 попытки).
Кэширование решений: Хешируйте URL изображения + массив task и кэшируйте результат. Идентичные капчи часто повторяются, что экономит средства.
Обработка ошибок баланса: Проверяйте HTTP 402 (Недостаточно средств) и приостанавливайте запросы перед повторной попыткой.

Пример ретраев (C# с Polly)

using Polly;

var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .OrResult<HttpResponseMessage>(r => 
        r.StatusCode == System.Net.HttpStatusCode.RequestTimeout ||
        (int)r.StatusCode >= 500)
    .WaitAndRetryAsync(
        retryCount: 3,
        sleepDurationProvider: attempt => 
            TimeSpan.FromSeconds(Math.Pow(2, attempt)),
        onRetry: (outcome, timespan, attempt, context) =>
        {
            Console.WriteLine($"Retry {attempt} after {timespan}s");
        });

// Usage:
var response = await retryPolicy.ExecuteAsync(async () =>
{
    return await client.PostAsync(url, content);
});

6. Решение проблем

Проблема Решение
Regex doesn't match Проверьте, использует ли страница динамический рендеринг JS. Используйте Playwright/Puppeteer для получения финального HTML.
API returns 402 Недостаточно средств. Пополните баланс через панель управления или проверьте настройки биллинга.
Slider doesn't move correctly Убедитесь, что кликаете по правильному селектору кнопки. Яндекс может обновлять структуру DOM.
Step number seems wrong Некоторые капчи требуют корректировки step-1. Сначала протестируйте на известных примерах.

Нужна помощь?

Если у вас возникли проблемы с конкретной реализацией капчи, обратитесь в нашу поддержку с URL страницы и фрагментом HTML.

Связаться с поддержкой