Teaserfast решение капчи

Полезная информация?

  • Да

    Голосов: 5 71,4%
  • Нет

    Голосов: 1 14,3%
  • Не знаю

    Голосов: 1 14,3%

  • Всего проголосовало
    7

swiniks

Client
Регистрация
19.02.2015
Сообщения
245
Благодарностей
179
Баллы
43
Здравствуйте дорогие друзья, многие столкнулись с проблемной капчей Teaserfast.
Вот такой.
136999
Постараюсь помочь простым решением в одном кубике С#.
Приступим к решению. Удаляем линии с изображения.
137001
Добавляем логику. Ищем на изображении наибольшее количество цветных пикселей, в квадрате размером 38x38 пикселей, на изображении 378x178 пикселей. Определяем координаты середины найденного квадрата относительно изображения.
Подключаем нужные пространства имён:
using System;
using System.Drawing;
using System.Drawing.Imaging;
Экшен С#:
// Путь к изображению из переменной ZennoPoster
string imagePath = project.Variables["Variable2"].Value;

// Размер квадрата
int squareSize = 38;

// Диапазон цвета для удаления
int minRGB = 180;
int maxRGB = 255;

// Проверяем наличие файла
if (!System.IO.File.Exists(imagePath))
{
    return "Ошибка: изображение не найдено по пути " + imagePath;
}

using (Bitmap bmp = new Bitmap(imagePath))

{
    int width = bmp.Width;
    int height = bmp.Height;
    int maxCount = 0;
    int bestX = 0;
    int bestY = 0;

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            Color c = bmp.GetPixel(x, y);

            // Проверяем, попадает ли пиксель в диапазон
            if (c.R >= minRGB && c.R <= maxRGB &&
                c.G >= minRGB && c.G <= maxRGB &&
                c.B >= minRGB && c.B <= maxRGB)
            {
                // Заменяем на белый (можно поменять на прозрачный или другой цвет)
                bmp.SetPixel(x, y, Color.White);
            }
        }
    }

    // Проходим по всем возможным позициям квадрата
    for (int y = 0; y <= height - squareSize; y++)
    {
        for (int x = 0; x <= width - squareSize; x++)
        {
            int count = 0;

            for (int dy = 0; dy < squareSize; dy++)
            {
                for (int dx = 0; dx < squareSize; dx++)
                {
                    Color c = bmp.GetPixel(x + dx, y + dy);

                    // Считаем пиксель цветным, если он не почти белый
                    if (!(c.R > 240 && c.G > 240 && c.B > 240))
                        count++;
                }
            }

            if (count > maxCount)
            {
                maxCount = count;
                bestX = x;
                bestY = y;
            }
        }
    }

    int centerX = bestX + squareSize / 2;
    int centerY = bestY + squareSize / 2;

    // Возвращаем результат
    return centerX.ToString() + ":" + centerY.ToString();
}
137005
Результат выводится в удобной форме для POST запроса X:Y, где:
  • X — координата по горизонтали,
  • Y — координата по вертикали.
Не всегда правильно находит! Делаем две попытки, если ошиблись, делаем третью в ручную правильно.
Данное решение не претендует на лучшее, но со своей задачей справляется. Можете поиграть с размером квадрата.
Меня устраивают такие настройки, результат проверяем сами, качаем архив тестов и проверяем процент.
Вот и всё дорогие друзья, спасибо за внимание! Принимаем участие в опросе. Будет интересна тема, будем совершенствовать код.
 

Вложения

  • 1,5 МБ Просмотры: 2
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)