помогите построить логику для прохождения этой капчи

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
капча
124958

там где указан пример, пример всегда идет в виде base64, и всегда тон цвета немного меняется, в 16ричном коде, он так же отличается, внизу, куда надо ткнуть на "правильную кнопку" красный всегда ff0000, а в примере разный
124959
124960

остальные цвета так же, статичны в правильных ответах и динамика в примере

просто как пример ответов
C#:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAASCAIAAADOjonJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHklEQVQ4jWN8zSzHQA3ARBVTRg0aNWjUoFGDBpFBAMAeATAO+52rAAAAAElFTkSuQmCC - красный
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAGCAIAAACepSOSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFElEQVQImWP890+IAQdgwiUxAHIAWqcCGooMjd8AAAAASUVORK5CYII= - желтый
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAIAAAC6ZnJRAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFElEQVQImWP8KMPKgAGYMIUGiSgAwVgBIoJew6QAAAAASUVORK5CYII= - красный

вот пример
картинка
124964

код
C#:
<p id="btn"><p style="font-size: 1.2em;">Если вы человек, нажмите на кнопку с цветом, наиболее похожим на этот: <strong><img width="40" height="20" style="vertical-align: middle;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAFCAIAAAAhVuBnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFUlEQVQYlWPkE9nLQDFgotyIYWkKADa4AOnAZkMwAAAAAElFTkSuQmCC"></strong></p>

<form action="/?url=%2Fauth%2Fsign-up%2F&amp;utm_referrer=https%3A%2F%2Fmy.mastergrad.com%2F" method="post">
<input name="time" type="hidden" value="1725443006">
<input name="submit" type="hidden" value="submit">
<input name="antibot" type="hidden" value="cabd4875adecd9f418621f1521af222b">
<input name="colors" type="hidden" value="a9d1de00639aaaf982682cdc55820329">
<input name="cid" type="hidden" value="1725443006.661">

<p><button style="background:RED; display: inline;" class="btn btn-color" type="submit" name="color" value="RED" title="КРАСНЫЙ"></button>
<button style="background:GRAY; display: inline;" class="btn btn-color" type="submit" name="color" value="GRAY" title="СЕРЫЙ"></button>
<button style="background:BLUE; display: inline;" class="btn btn-color" type="submit" name="color" value="BLUE" title="СИНИЙ"></button>
<button style="background:YELLOW; display: inline;" class="btn btn-color" type="submit" name="color" value="YELLOW" title="ЖЕЛТЫЙ"></button>
<button style="background:BLACK; display: inline;" class="btn btn-color" type="submit" name="color" value="BLACK" title="ЧЕРНЫЙ"></button>
<button style="background:GREEN; display: inline;" class="btn btn-color" type="submit" name="color" value="GREEN" title="ЗЕЛЕНЫЙ"></button> </p></form></p>
 
Последнее редактирование:

p-sergei

Client
Регистрация
20.12.2016
Сообщения
542
Благодарностей
262
Баллы
63
Особо не вникая, между разными цветами можно получить расстояние, типо так
124965

чем меньше расстояние тем выше вероятность совпадения.
Удачи.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

p-sergei

Client
Регистрация
20.12.2016
Сообщения
542
Благодарностей
262
Баллы
63
серьезно, картинкой? )))
да блин там 3-и строчки :-)
C#:
 /// <summary>
        /// Метод рассчитывает расстояние между цветами
        /// </summary>
        /// <param name="OriginalColor"></param>
        /// <param name="TargetColor"></param>
        /// <returns></returns>
        private int DistanceColor(Color OriginalColor, Color TargetColor)
        {
            // Расчет расстояния между целевым цветом и текущим пикселем
            int distance = (int)(Math.Pow(OriginalColor.R - TargetColor.R, 2) +
                                 Math.Pow(OriginalColor.G - TargetColor.G, 2) +
                                 Math.Pow(OriginalColor.B - TargetColor.B, 2));
            distance = (int)Math.Sqrt(distance);


            return distance;

        }
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

p-sergei

Client
Регистрация
20.12.2016
Сообщения
542
Благодарностей
262
Баллы
63
тебе надо получить цвет пикселей всех заданных цветов и целевого цвета, и в цикле сравнить - там где будет наименьшая дистанция между цветами и будет правильным выбором.
Как ты получишь цвета это уже тебе виднее, скринить и оттуда брать или какие-то значения из кода страницы дёргать и уже из них получить цвет пискелей это видимо сам определишься.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
тебе надо получить цвет пикселей всех заданных цветов и целевого цвета, и в цикле сравнить - там где будет наименьшая дистанция между цветами и будет правильным выбором.
Как ты получишь цвета это уже тебе виднее, скринить и оттуда брать или какие-то значения из кода страницы дёргать и уже из них получить цвет пискелей это видимо сам определишься.
нене, как раз это я прекрасно понимаю, как мне с кодом быть, что за что отвечает, я про это
как мне передать цвет в метод, может есть шарп?
в шарпе не алло вообще
 

p-sergei

Client
Регистрация
20.12.2016
Сообщения
542
Благодарностей
262
Баллы
63
вот здесь посмотри как получить цвет пикселя картинки ТЫЦ
потом уже объект Color (это объект пикселя у тебя должен быть) закидываешь в метод который я выше давал.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

p-sergei

Client
Регистрация
20.12.2016
Сообщения
542
Благодарностей
262
Баллы
63
Я вижу такой путь получить - HtmlElement he
из него получить объект Bitmap, типо как-то так - Bitmap originalBitmap = he.DrawAsBitmap(false);

из объекта Bitmap дернуть рандонмый пиксель типо как-то так - Color colorCurrent = originalBitmap .GetPixel(X, Y);
и вроде всё объект Color у тебя есть, такие объекты надо создать для всех картинок и уже их сравнивать.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
короче как я решил, для меня работает, но решение не идеальное, думаю будут проблемы с большим количеством цветов
снип
C#:
var image = new Bitmap(project.Directory + @"\data\color.jpg");
var pixelColor = new Color();
pixelColor = image.GetPixel(5, 5); //координаты (10,15)
return pixelColor;
1. делаем базу цветов, из которых надо выбирать, они у меня статичные, примерно так:

124990

2. с помощью снипа получаем RGB сохраненной за ранее картинки и нужного пикселя, у меня вся картинка это один цвет.
3. поочередно сравниваем R в базе и тот что взяли, так же G и B
я поставил разброс +-100
100 >= {-Variable.check-} && {-Variable.check-} >= -100

получилось такое
124991
 
  • Спасибо
Реакции: alex1988 и Konrod_m

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
да что
а можно чутка подробнее? бро, реально, хочешь помочь - помоги, че загадками писать тем более когда не в теме совсем, чего надо вечно вытягивать инфу

нашел лишь снип такой - https://zenno.club/discussion/threads/podskazhite-biblioteku-programmu-po-raspoznavaniju-izobrazhenija.50393/post-376897
но как он работает не сильно понятно, по комментариям +- но что он выдает на какой цвет не понятно, и по идее, судя по этой строке
if ((el >= 70 && el <= 140) || (el >= 300 && el <= 360)) //если цвет похож на зеленый и красный, то есть админ
ровно такой же как у меня
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
да что

а можно чутка подробнее? бро, реально, хочешь помочь - помоги, че загадками писать тем более когда не в теме совсем, чего надо вечно вытягивать инфу

нашел лишь снип такой - https://zenno.club/discussion/threads/podskazhite-biblioteku-programmu-po-raspoznavaniju-izobrazhenija.50393/post-376897
но как он работает не сильно понятно, по комментариям +- но что он выдает на какой цвет не понятно, и по идее, судя по этой строке
if ((el >= 70 && el <= 140) || (el >= 300 && el <= 360)) //если цвет похож на зеленый и красный, то есть админ
ровно такой же как у меня
в ргб каждое из трех значений отвечает за цвет. Одно поменялось и цвет уже другой. в HSB только H отвечает за цвет и можно обращать внимание только на него. Я так делал когда-то с одной шахматной капчей, когда мне нужно было сгруппировать фигуры по цвету, но он слегка отличался. Через ргб это было тяжело. Перегнал цветовую схему в HSB и стало куда проще

Но писать код я не готов) только направление дал
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 631
Благодарностей
1 225
Баллы
113
Ну, если есть значение цвета в привычном виде #bc34c4
То получить его Hue-значение можно так:

C#:
// Исходный цвет (можно из переменной)
string hex = "#bc34c4";

//Удаляем # в начале, если имеется
if (hex.StartsWith("#"))
    {
        hex = hex.Substring(1);
    }

// Получаем RGB-значения из HEX-кода цвета
int r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber);

// Создаем объект Color из RGB значений
Color color = Color.FromArgb(r, g, b);
       
// Получаем Hue из RGB
return color.GetHue();
Дальше уже дело за малым: получить hex-значения элементов и выбрать ближайшее по логике, которую описывали выше ))
 
  • Спасибо
Реакции: backoff

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 631
Благодарностей
1 225
Баллы
113
Заняться вечером нечем, поэтому продолжаем )))
Получаем hex-значение цвета, который тебе надо искать (благо, картинка "однотонная")...

C#:
// Цвет для поиска из кода страницы
string base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAASCAIAAAAhTOL3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHklEQVQ4jWNsam9joBJgopZBo2aNmjVq1qhZQ9gsALcGAbPk8uCsAAAAAElFTkSu";

// Удаляем префикс "data:image/png;base64,", если с ним захватываешь из кода
base64String = base64String.Replace("data:image/png;base64,", "");

byte[] imageBytes = Convert.FromBase64String(base64String);

// Преобразуем в изображение
using (MemoryStream ms = new MemoryStream(imageBytes))
using (Bitmap bitmap = new Bitmap(ms))
{

// Извлекаем цвет пикселя в позиции (5, 5) - но можно любой другой, я просто немного от края отступил, можно куда-нить в серединку ))
    Color pixelColor = bitmap.GetPixel(5, 5);

    // Конвертируем цвет в HEX формат
    return string.Format("{0:X2}{1:X2}{2:X2}", pixelColor.R, pixelColor.G, pixelColor.B);
}
Сравнил с тем, что дает "пипетка", совпало до последней цифры ))

Дальше уже его - в HSB, вытаскиваешь H. И сравниваешь с нужными цветами (не знаю, всегда ли они там одинаковые, но, думаю, да).
 
Последнее редактирование:
  • Спасибо
Реакции: backoff

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Ну, если есть значение цвета в привычном виде #bc34c4
То получить его Hue-значение можно так:

C#:
// Исходный цвет (можно из переменной)
string hex = "#bc34c4";

//Удаляем # в начале, если имеется
if (hex.StartsWith("#"))
    {
        hex = hex.Substring(1);
    }

// Получаем RGB-значения из HEX-кода цвета
int r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber);

// Создаем объект Color из RGB значений
Color color = Color.FromArgb(r, g, b);
     
// Получаем Hue из RGB
return color.GetHue();
Дальше уже дело за малым: получить hex-значения элементов и выбрать ближайшее по логике, которую описывали выше ))
125039

Спасибо! вот ЭТО помощь, теперь осталось найти таблицу цветов и значений, но я думаю это что-то типа этого
125038
перестрою логику в шабе с новыми значениями, но и с РГБ идет 100% пробив, но понимаю что это полная шляпа))

еще раз спасибо
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 631
Благодарностей
1 225
Баллы
113
Спасибо! вот ЭТО помощь, теперь осталось найти таблицу цветов и значений, но я думаю это что-то типа этого
Я думаю, проще просто прописать значения всех вариантов, которые он показывает (просто сделать пару десятков заходов и собрать варианты, но, есть ощущение, что их там шесть, просто в разном порядке). Ну и уже их так же конвертнуть в нужный (хотя в фотошопе со скриншота пипеткой глянь, он сразу HSB покажет в том числе). А дальше обрабатывать только цвет, который искать.
Будут новые цвета, просто глянь спецификацию css, возьми полный список цветов, которые прописываются текстом (а-ля red, yellow и т.д.) и их сразу обработай в нужный формат. Ну или можешь совместить обработку через код.
 
  • Спасибо
Реакции: backoff

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 777
Благодарностей
1 447
Баллы
113
капча
Посмотреть вложение 124958

там где указан пример, пример всегда идет в виде base64, и всегда тон цвета немного меняется, в 16ричном коде, он так же отличается, внизу, куда надо ткнуть на "правильную кнопку" красный всегда ff0000, а в примере разный

остальные цвета так же, статичны в правильных ответах и динамика в примере

просто как пример ответов
C#:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAASCAIAAADOjonJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHklEQVQ4jWN8zSzHQA3ARBVTRg0aNWjUoFGDBpFBAMAeATAO+52rAAAAAElFTkSuQmCC - красный
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAGCAIAAACepSOSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFElEQVQImWP890+IAQdgwiUxAHIAWqcCGooMjd8AAAAASUVORK5CYII= - желтый
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAIAAAC6ZnJRAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFElEQVQImWP8KMPKgAGYMIUGiSgAwVgBIoJew6QAAAAASUVORK5CYII= - красный

вот пример
картинка
Посмотреть вложение 124964

код
C#:
<p id="btn"><p style="font-size: 1.2em;">Если вы человек, нажмите на кнопку с цветом, наиболее похожим на этот: <strong><img width="40" height="20" style="vertical-align: middle;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAFCAIAAAAhVuBnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFUlEQVQYlWPkE9nLQDFgotyIYWkKADa4AOnAZkMwAAAAAElFTkSuQmCC"></strong></p>

<form action="/?url=%2Fauth%2Fsign-up%2F&amp;utm_referrer=https%3A%2F%2Fmy.mastergrad.com%2F" method="post">
<input name="time" type="hidden" value="1725443006">
<input name="submit" type="hidden" value="submit">
<input name="antibot" type="hidden" value="cabd4875adecd9f418621f1521af222b">
<input name="colors" type="hidden" value="a9d1de00639aaaf982682cdc55820329">
<input name="cid" type="hidden" value="1725443006.661">

<p><button style="background:RED; display: inline;" class="btn btn-color" type="submit" name="color" value="RED" title="КРАСНЫЙ"></button>
<button style="background:GRAY; display: inline;" class="btn btn-color" type="submit" name="color" value="GRAY" title="СЕРЫЙ"></button>
<button style="background:BLUE; display: inline;" class="btn btn-color" type="submit" name="color" value="BLUE" title="СИНИЙ"></button>
<button style="background:YELLOW; display: inline;" class="btn btn-color" type="submit" name="color" value="YELLOW" title="ЖЕЛТЫЙ"></button>
<button style="background:BLACK; display: inline;" class="btn btn-color" type="submit" name="color" value="BLACK" title="ЧЕРНЫЙ"></button>
<button style="background:GREEN; display: inline;" class="btn btn-color" type="submit" name="color" value="GREEN" title="ЗЕЛЕНЫЙ"></button> </p></form></p>
125044

C#:
string base64Image = "iVBORw0KGgoAAAANSUhEUgAAABcAAAAFCAIAAAAhVuBnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFUlEQVQYlWPkE9nLQDFgotyIYWkKADa4AOnAZkMwAAAAAElFTkSuQmCC";
byte[] imageBytes = Convert.FromBase64String(base64Image);
using (var stream = new System.IO.MemoryStream(imageBytes))
{
    using (var bitmap = new System.Drawing.Bitmap(stream))
    {
        int width = bitmap.Width;
        int height = bitmap.Height;
        long r = 0, g = 0, b = 0;

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                var pixel = bitmap.GetPixel(x, y);
                r += pixel.R;
                g += pixel.G;
                b += pixel.B;
            }
        }

        int totalPixels = width * height;
        var averageColor = System.Drawing.Color.FromArgb((int)(r / totalPixels), (int)(g / totalPixels), (int)(b / totalPixels));

        // Определение имени цвета
        var knownColors = new[]
        {
            new { Name = "Красный", Color = System.Drawing.Color.Red },
            new { Name = "Зеленый", Color = System.Drawing.Color.Green },
            new { Name = "Синий", Color = System.Drawing.Color.Blue },
            new { Name = "Желтый", Color = System.Drawing.Color.Yellow },
            new { Name = "Черный", Color = System.Drawing.Color.Black },
            new { Name = "Белый", Color = System.Drawing.Color.White },
            new { Name = "Серый", Color = System.Drawing.Color.Gray },
            new { Name = "Оранжевый", Color = System.Drawing.Color.Orange },
            new { Name = "Голубой", Color = System.Drawing.Color.Cyan },
            new { Name = "Фиолетовый", Color = System.Drawing.Color.Purple }
        };

        // Нахождение самого близкого цвета
        var closestColor = knownColors
            .OrderBy(c => Math.Sqrt(Math.Pow(averageColor.R - c.Color.R, 2) +
                                     Math.Pow(averageColor.G - c.Color.G, 2) +
                                     Math.Pow(averageColor.B - c.Color.B, 2)))
            .First();

        string colorName = closestColor.Name;

        // Вывод результата
        project.SendInfoToLog($"Средний цвет: {colorName}");
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: Beast и backoff

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 631
Благодарностей
1 225
Баллы
113
Ну и конечное на сегодня. Просто парсим цвет предложенных вариантов, получаем каждый из них в нужном виде таким образом:

C#:
// Сюда подставляем название цвета из кнопок вариантов - они там в background
string colorName = "yellow";

// Получаем объект Color по названию цвета
Color color = Color.FromName(colorName);

// Проверим, если цвет был корректно распознан (IsKnownColor) или имеет определенные компоненты
if (!color.IsKnownColor && color.ToArgb() == 0)
{
    throw new ArgumentException("Хрень какая-то");
}

// Преобразуем в HEX
return string.Format("{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
Ну а дальше ты знаешь )))

update. Во, выше уже все готовое написали... Ну, может, кому и мои огрызки пригодятся для какой-то другой логики... Пусть останется... Мне больше самому было интересно )))
 
  • Спасибо
Реакции: Beast и backoff

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