logo
bars

CAPTCHA с изображениями (ComplexImage)
и CapMonster Cloud

Решение капчи, установка на сайт и тестирование.
Вам достался «по наследству» сайт с подключённой капчей или другой защитой, но доступа к исходному коду нет? В такой ситуации возникают вопросы: какую именно систему защиты использует сайт, правильно ли она установлена и как проверить её работу?

В этой статье мы постарались дать ответы на все вопросы. А начать решение задачи нужно с определения того, какая система защиты используется. Для этого можно обратиться к списку популярных капч и систем антибот-защиты, где представлены визуальные примеры и ключевые признаки, которые могут помочь быстро определить, с чем вы имеете дело.

Если вы обнаружили, что на вашем сайте используется ComplexImage, следующим шагом станет более подробное изучение её свойств и самой работы. Также в этой статье вы можете изучить инструкцию по подключению системы ComplexImage, чтобы полностью разобраться, как она функционирует на вашем сайте. Это позволит не только понимать текущую защиту, но и грамотно планировать её поддержку.

Что такое капча с изображениями
Что такое капча с изображениями
Капча с изображениями — это один из видов визуальной CAPTCHA, при котором пользователю необходимо выполнить задание, связанное с анализом изображений. Обычно система предлагает выбрать картинки, соответствующие заданному условию, посчитать количество предметов, определить правильное положение объекта или выполнить другое визуальное действие. В отличие от текстовой капчи, где требуется просто ввести символы с картинки, капча с изображениями проверяет способность пользователя интерпретировать визуальную информацию и выполнять логические действия. Благодаря этому она сложнее для автоматического распознавания и эффективнее защищает формы регистрации, авторизации и другие критичные точки сайта от злоупотреблений со стороны ботов.

Как решить капчу с изображениями через CapMonster Cloud

При тестировании форм с Tencent CAPTCHA часто возникает необходимость проверить работу капчи и убедиться, что она корректно интегрирована.
Вы можете вручную протестировать подставленную на ваш сайт капчу:
  • Откройте страницу с формой и убедитесь, что капча отображается.
  • Попробуйте отправить форму без её прохождения — сервер должен выдать ошибку.
  • После успешного решения капчи — форма должна отправиться без ошибок.
Для автоматического распознавания капчи можно использовать специализированные сервисы, например, CapMonster Cloud — инструмент, который принимает параметры капчи, обрабатывает их на своих серверах и возвращает готовый ответ на задание капчи — например, числа или координаты для кликов, которые можно использовать для прохождения проверки без участия пользователя.

Работа с CapMonster Cloud через API обычно включает следующие шаги:

Создание задачи (Task)Создание задачи (Task)
arrow
Отправка запроса к APIОтправка запроса к API
arrow
Получение результатаПолучение результата
arrow
Подстановка токена на страницуПодстановка токена на страницу
arrow
Распознавание капчи с изображениями с использованием готовых библиотек
Сервис CapMonster Cloud предоставляет готовые библиотеки для удобной работы на языках Python, JavaScript (Node.js) и C#.
Python
JavaScript
C#
Решение, подстановка ответа и отправка формы
Пример на Node.js для полного цикла распознавания капчи на вашей веб-странице. Возможные подходы: использовать HTTP-запросы для получения HTML и параметров системы защиты, отправить ответ и обработать результат. Или, как в примере ниже, с помощью инструментов для автоматизации (например, Playwright) — открыть страницу, дождаться проверки, отправить параметры через клиент CapMonster Cloud, получить результат, подставить его в соответствующее поле (для тестирования вы можете использовать как правильные, так и некорректные данные) и увидеть результат.

// npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, ComplexImageTaskRecognitionRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY";
const TARGET_URL = "https://example.com/captcha-page";

async function solveComplexImageTaskPlaywright() {
    const browser = await chromium.launch({ headless: false });
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto(TARGET_URL);

    // Находим изображение капчи
    const captchaHandle = await page.$('#captcha'); // замените на реальный селектор
    const captchaBase64 = await captchaHandle.evaluate(img => {
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0);
        return canvas.toDataURL('image/png').split(',')[1];
    });

    console.log("Captcha base64:", captchaBase64.substring(0, 50) + "...");

    const cmcClient = CapMonsterCloudClientFactory.Create(
        new ClientOptions({ clientKey: API_KEY })
    );

    // Отправляем капчу на распознавание
    const citRecognitionRequest = new ComplexImageTaskRecognitionRequest({
        imagesBase64: [captchaBase64],
        metaData: { Task: 'oocl_rotate' } // замените на ваш тип капчи
    });

    const result = await cmcClient.Solve(citRecognitionRequest);
    console.log("Solution received:", result);

    // Обработка решения
    const solution = result.solution;

    if (!solution) {
        console.error("No solution received");
        return;
    }

    if (solution.metadata?.AnswerType === "Coordinate") {
        // Капча с координатами
        const box = await captchaHandle.boundingBox();
        for (const point of solution.answer) {
            const clickX = box.x + point.X;
            const clickY = box.y + point.Y;
            console.log(`Clicking at: (${clickX}, ${clickY})`);
            await page.mouse.click(clickX, clickY);
        }
    } else if (solution.metadata?.AnswerType === "Grid") {
        // Капча Grid (массив true/false)
        const box = await captchaHandle.boundingBox();
        const gridItems = await page.$$('#captcha_grid div'); // замените на селекторы элементов сетки
        const answers = solution.answer;

        for (let i = 0; i < answers.length; i++) {
            if (answers[i] && gridItems[i]) {
                const itemBox = await gridItems[i].boundingBox();
                const clickX = itemBox.x + itemBox.width / 2;
                const clickY = itemBox.y + itemBox.height / 2;
                console.log(`Clicking grid item ${i} at: (${clickX}, ${clickY})`);
                await page.mouse.click(clickX, clickY);
            }
        }
    } else {
        console.warn("Unknown captcha solution type:", solution.metadata?.AnswerType);
    }

    // Клик по кнопке подтверждения (если есть)
    await page.click('#submit_button'); // замените на реальный селектор кнопки

    console.log("Captcha solved.");
}

solveComplexImageTaskPlaywright().catch(console.error);
  
Как подключить капчу с изображениями к своему сайту
Чтобы уверенно ориентироваться в работе капчи на вашем сайте, понимать логику её проверки, заново подключить или перенастроить, рекомендуем вам изучить этот раздел. В нём описан общий процесс подключения защиты — это поможет быстро разобраться во всех нюансах.

1. Генерация капчи на сервере.

  • Создаётся изображение капчи: одно изображение или сетка изображений.
  • Добавляются шум, перекосы и случайные элементы для защиты от ботов.
  • Генерируется уникальный captchaId и сохраняется правильное решение (в памяти, базе или кэше).

2. Передача капчи на клиент

  • Сервер отправляет клиенту captchaId и изображение (base64 или URL).
  • Клиент отображает капчу, например: <img> или сетка <div> с инструкциями.
Пример клиентской части (HTML + JS)Пример клиентской части (HTML + JS)
arrow

3. Ввод ответа пользователем

  • Пользователь вводит текст, кликает по изображениям или поворачивает объект.
  • Клиент формирует ответ в подходящей структуре:
    • текстовая капча → строка
    • сетка → массив true/false
    • координаты → массив {X, Y}

4. Отправка ответа на сервер:

  • Клиент отправляет POST-запрос с captchaId и ответом (answer).
  • Можно передавать токен сессии для защиты от повторного прохождения.

5. Проверка на сервере

  • Сервер ищет сессию капчи по captchaId.
  • Сравнивает ответ пользователя с правильным решением.
  • Возвращает success: true/false.
  • При неудаче можно обновить капчу.
Пример серверной частиПример серверной части
arrow

6. Дальнейшие действия

  • Успешная капча → разрешается защищённый процесс (форма, регистрация и т.д.).
  • Неудачная капча → выдаётся новая, можно ограничивать число попыток.

Дополнительно

  • Применяйте TTL (время жизни) для хранения сессий капчи, чтобы они автоматически истекали.
  • Кэшируйте изображения и используйте временные URL для экономии ресурсов.
  • Обеспечьте корректную работу кликов и касаний по сетке на мобильных устройствах.
  • Ведите логи и аналитику для улучшения пользовательского опыта и защиты от ботов.
Background
Возможные ошибки и отладка
Bug Icon
Капча с изображениями не загружается
(Пустая сетка, битые картинки, ошибки 404/500, проблемы с base64) — проверьте, что сервер корректно генерирует изображения, base64-данные не повреждены, формат изображений поддерживается браузером, а клиент получает актуальный captchaId.
Bug Icon
Клики пользователя не обрабатываются
(Ячейки не выделяются или ответ пустой) — убедитесь, что координаты или индексы кликов отправляются на сервер, данные корректно сериализуются и поддерживаются touch-события на мобильных устройствах.
Bug Icon
Капча не проходит при правильных кликах
Проверьте, что капча не пересоздаётся до проверки, правильный ответ хранится отдельно для каждой сессии, формат ответа соответствует ожидаемому и срок действия капчи (TTL) не истёк.
Bug Icon
Истёк срок действия капчи
Если пользователь долго решает капчу, увеличьте TTL, обновляйте капчу при повторной попытке и уведомляйте пользователя о необходимости перезагрузки изображений.
Проверка устойчивости защиты
После интеграции важно убедиться, что система действительно защищает сайт от автоматических действий.
Рекомендации по безопасности и оптимизации
Храните правильный ответ капчи <b>только на сервере</b> (в памяти, Redis или базе данных), никогда не передавайте его клиенту.
Используйте одноразовые идентификаторы капчи (<b>captchaId</b>).
Ограничьте количество попыток решения одной капчи.
Всегда используйте <b>HTTPS</b> для передачи изображений и кликов.
Кэшируйте изображения и используйте <b>временные URL</b>, если это возможно.
Логируйте ошибки генерации и проверки (время, IP / fingerprint (если применимо), причину отказа).
Регулярно обновляйте механику капчи (набор изображений, размер и структуру сетки, типы заданий)
Заключение

Если вам достался сайт с уже установленной капчей или другой системой защиты и при этом нет доступа к коду — ничего страшного! Определить, какая именно технология используется, достаточно легко. А для проверки корректности работы можно использовать сервис распознавания CapMonster Cloud в изолированной тестовой среде, чтобы убедиться, что механизм обработки токенов и логика проверки функционируют корректно.

В случае с капчей с изображениями — достаточно распознать систему, изучить её поведение и убедиться, что защита функционирует корректно. В статье мы показали, как определить капчу с изображениями (ComplexImage) и как подключить её или перенастроить, чтобы уверенно поддерживать защиту и контролировать её работу.

Conclusion
Полезные ссылки
DocIconДокументация CapMonster Cloud (ComplexImage)DocIconГайд, как создать свою собственную капчуDocIconРегистрация в сервисе CapMonster Cloud