Непробиваемая с виду простая капча

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
Имеем капчу:




Нужно получить координаты клика мышки по требуемому числу.

с 8 утра играюсь с этой капчей, что я пробовал делать:
Первое что пришло мне в голову, очистить от линий.



С помощью C# я получил имя каждого оттенка цвета в Hex на картинке например: ffb5e442
Оттенков очень много, для любого цвета получается около 100 оттенков, Кубик попиксельно отрабатывает около 5 сек на 1 цвет

Наглядный код:

C#:
string PathImg = project.Variables["PicOriginal"].Value; // путь к оригинальной картинке
string NewPathImg = Path.GetDirectoryName(PathImg) + @"\" + Path.GetFileNameWithoutExtension(PathImg) + "__" + Path.GetExtension(PathImg);
project.Variables["PicMonoChrome"].Value = NewPathImg.ToString();
    Bitmap bmpRes = new Bitmap(PathImg);
    Color color = new Color();
        for (int y = 0; y < bmpRes.Height; y++)
        {
            for (int x = 0; x < bmpRes.Width; x++)
            {
if (bmpRes.GetPixel(x, y).Name == "ff6e8966" ||
bmpRes.GetPixel(x, y).Name == "ffb6c4b2" ||
bmpRes.GetPixel(x, y).Name == "ff28501b" ||
bmpRes.GetPixel(x, y).Name == "ffabbba6" ||
bmpRes.GetPixel(x, y).Name == "ff1f4911" ||
bmpRes.GetPixel(x, y).Name == "ff3c6131" ||
bmpRes.GetPixel(x, y).Name == "ff77916f" ||
bmpRes.GetPixel(x, y).Name == "fffdfdfd" ||
bmpRes.GetPixel(x, y).Name == "ff8ca185" ||
bmpRes.GetPixel(x, y).Name == "ff2d5521" ||
bmpRes.GetPixel(x, y).Name == "ff9eb099" ||
bmpRes.GetPixel(x, y).Name == "ff204a13" ||
bmpRes.GetPixel(x, y).Name == "ff9bad95" ||
bmpRes.GetPixel(x, y).Name == "ff1d470f" ||
bmpRes.GetPixel(x, y).Name == "ff2a521d" ||
bmpRes.GetPixel(x, y).Name == "ff63805a" ||
bmpRes.GetPixel(x, y).Name == "ff65825c" ||
bmpRes.GetPixel(x, y).Name == "ff244d17" ||
bmpRes.GetPixel(x, y).Name == "ff5a7950" ||
bmpRes.GetPixel(x, y).Name == "ff224c15" ||
bmpRes.GetPixel(x, y).Name == "ffecefeb" ||
bmpRes.GetPixel(x, y).Name == "fffbfbfb" ||
bmpRes.GetPixel(x, y).Name == "ff2f5623" ||
bmpRes.GetPixel(x, y).Name == "ffb4c2b0" ||
bmpRes.GetPixel(x, y).Name == "ffc0cbbc" ||
bmpRes.GetPixel(x, y).Name == "ff406435" ||
bmpRes.GetPixel(x, y).Name == "ffced7cc" ||
bmpRes.GetPixel(x, y).Name == "ffa0b29b" ||
bmpRes.GetPixel(x, y).Name == "ffeaeee9" ||
bmpRes.GetPixel(x, y).Name == "ff748e6b" ||
bmpRes.GetPixel(x, y).Name == "ff335927" ||
bmpRes.GetPixel(x, y).Name == "ffc1cdbe" ||
bmpRes.GetPixel(x, y).Name == "ff99ac93" ||
bmpRes.GetPixel(x, y).Name == "ffadbca8" ||
bmpRes.GetPixel(x, y).Name == "ff54744a" ||
bmpRes.GetPixel(x, y).Name == "fff7f8f7" ||
bmpRes.GetPixel(x, y).Name == "ff496b3e" ||
bmpRes.GetPixel(x, y).Name == "ff3e6233" ||
bmpRes.GetPixel(x, y).Name == "ff768f6d" ||
bmpRes.GetPixel(x, y).Name == "ffdde3db" ||
bmpRes.GetPixel(x, y).Name == "ff527348" ||
bmpRes.GetPixel(x, y).Name == "ff708b68" ||
bmpRes.GetPixel(x, y).Name == "ffc5d0c2" ||
bmpRes.GetPixel(x, y).Name == "ff698560" ||
bmpRes.GetPixel(x, y).Name == "ff889e81" ||
bmpRes.GetPixel(x, y).Name == "ffbcc8b8" ||
bmpRes.GetPixel(x, y).Name == "ff67835e" ||
bmpRes.GetPixel(x, y).Name == "fff2f4f1" ||
bmpRes.GetPixel(x, y).Name == "ffdfe5dd" ||
bmpRes.GetPixel(x, y).Name == "ff6a8662" ||
bmpRes.GetPixel(x, y).Name == "ff849b7d" ||
bmpRes.GetPixel(x, y).Name == "ff93a78d" ||
bmpRes.GetPixel(x, y).Name == "ffb1bfac" ||
bmpRes.GetPixel(x, y).Name == "fff3f5f3" ||
bmpRes.GetPixel(x, y).Name == "ffbac7b6" ||
bmpRes.GetPixel(x, y).Name == "ffd6ddd3" ||
bmpRes.GetPixel(x, y).Name == "ff7d9575" ||
bmpRes.GetPixel(x, y).Name == "ff9caf97" ||
bmpRes.GetPixel(x, y).Name == "ffa9b9a4" ||
bmpRes.GetPixel(x, y).Name == "fff0f2ef" ||
bmpRes.GetPixel(x, y).Name == "ffd4dcd1" ||
bmpRes.GetPixel(x, y).Name == "ff819879" ||
bmpRes.GetPixel(x, y).Name == "ff3a5f2f" ||
bmpRes.GetPixel(x, y).Name == "ff2c531f" ||
bmpRes.GetPixel(x, y).Name == "ff517146" ||
bmpRes.GetPixel(x, y).Name == "ffd2dacf" ||
bmpRes.GetPixel(x, y).Name == "fff9faf9" ||
bmpRes.GetPixel(x, y).Name == "ff264f19" ||
bmpRes.GetPixel(x, y).Name == "ffa8b8a2" ||
bmpRes.GetPixel(x, y).Name == "ffe5e9e3" ||
bmpRes.GetPixel(x, y).Name == "ffa6b6a0" ||
bmpRes.GetPixel(x, y).Name == "ff6c8864" ||
bmpRes.GetPixel(x, y).Name == "ffb3c1ae" ||
bmpRes.GetPixel(x, y).Name == "ff5e7c54" ||
bmpRes.GetPixel(x, y).Name == "ff375c2b" ||
bmpRes.GetPixel(x, y).Name == "ff315825")
{
color = bmpRes.GetPixel(x, y);
bmpRes.SetPixel(x, y, Color.Black);
}
else
{
color = bmpRes.GetPixel(x, y);
bmpRes.SetPixel(x, y, Color.White);
}
}
}
bmpRes.Save(NewPathImg, System.Drawing.Imaging.ImageFormat.Png);
bmpRes.Dispose();

Для каждого цвета нужны свои оттенки

Попробовал на 2 капчах:














И вторая капча:













Казалось бы победа уже близко, осталось прогнать через тессеракт, сравнить цифры, получить координаты клика и все) Но не тут то было... Дело в том что оттенки всегда разные даже если они похожи на глаз(

Ребят может у кого то есть какие то идеи? Как победить не побеждаемое? Побороть не непоборимое?
У меня уже мозги за целый день не соображают, вата в голове, надо отдохнуть...

Прикреплю архив с капчами может кто захочет поиграться)
 

Вложения

Последнее редактирование:

Samoylov_83

Client
Регистрация
25.08.2015
Сообщения
228
Благодарностей
70
Баллы
28
самое простое что пришло в голову, исходя из того, что у вас уже есть. распознать картинки где на одной только одно число и найти правильный ответ. затем в цикле брать линию пиксельную и если идти слева направо сверху вниз, то искать 3-5 подряд идущих пикселей одного цвета и затем уже кликать со смещением вниз и вправо
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
не понял, зачем тебе оттенки. Каждую полученную картинку прогнал на распознавании и сравнил с искомым. Совпали - просто ищешь где большое скопление НЕ белых точек
 
  • Спасибо
Реакции: ibred

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
А вообще, клёвая капча. Не в смысле сложности, а в том смысле, что ты, наверно, получил массу удовольствия, распиливая её шаг за шагом)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
самую лучшую капчу может придумать только спамер. имхо
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 308
Благодарностей
865
Баллы
113
Как вариант приводит оттенки в свой цвет(красный+100 оттенков в сплошной красный), по любому такие фильтры есть. А там уже разбирать как угодно.
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
не понял, зачем тебе оттенки. Каждую полученную картинку прогнал на распознавании и сравнил с искомым. Совпали - просто ищешь где большое скопление НЕ белых точек
не все так просто как вы думаете, в реале нужно получить координаты мышки искомого числа, в черно белый я тоже могу сделать, и распознать тессерактом не проблема, проблема получить координаты клика по нужному числу
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
Как вариант приводит оттенки в свой цвет(красный+100 оттенков в сплошной красный), по любому такие фильтры есть. А там уже разбирать как угодно.
Я тоже про это думал сегодня, в гугле нечего не нашел(
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
не все так просто как вы думаете, в реале нужно получить координаты мышки искомого числа, в черно белый я тоже могу сделать, и распознать тессерактом не проблема, проблема получить координаты клика по нужному числу
у тебя есть отдельные картинки по одному числу на каждой. Через распознавание вычисляешь картинку с нужным числом. А в картинке этой как найти координату числа уже не сложно придумать
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
самое простое что пришло в голову, исходя из того, что у вас уже есть. распознать картинки где на одной только одно число и найти правильный ответ. затем в цикле брать линию пиксельную и если идти слева направо сверху вниз, то искать 3-5 подряд идущих пикселей одного цвета и затем уже кликать со смещением вниз и вправо
в том то и дело, сначала надо сделать так чтоб получать по одному числу, а именно цветовые оттенки меняются, и не дают этого сделать, а их в природе миллионы разных
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
у тебя есть отдельные картинки по одному числу на каждой. Через распознавание вычисляешь картинку с нужным числом. А в картинке этой как найти координату числа уже не сложно придумать
то я просто показал для примера, разобрал 2 капчи, я знаю что дальше делать, тессеракт берет на ура



проблема как получить чтоб было по одному числу не перебирая оттенки, но чтоб число оставалось на своем месте, чтоб потом получить координаты клика

в идеале должно быть так

 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ты попиксельно в каком-нить редакторе проверял, градации цвета есть внутри одного числа?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
ты попиксельно в каком-нить редакторе проверял, градации цвета есть внутри одного числа?
в фотошопе проверял, не я же эти оттенки выдумал, там все по пикселям

скрин под спойлером









 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Можно пойти другим путём. Все цифры одинакового размера. Можно взять за основу определённый размер блока, и искать по картинке блоки, где много НЕ белых символов. Каждый такой блок разгадывать
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
Можно пойти другим путём. Все цифры одинакового размера. Можно взять за основу определённый размер блока, и искать по картинке блоки, где много НЕ белых символов. Каждый такой блок разгадывать
прочитал раз 5 внимательно, пытаюсь понять что за блоки и как решать но не понимаю(
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
прочитал раз 5 внимательно, пытаюсь понять что за блоки и как решать но не понимаю(
ну делишь картинку на условные квадратики и каждый квадратик проверяешь на содержимое
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
ну делишь картинку на условные квадратики и каждый квадратик проверяешь на содержимое
про это я тоже думал, но цифры всегда в разных местах, как ее резать? Можно пример?
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
Мне тоже нравится идея doc'a. Пилишь на, допустим 18 квадратиков и сверяешь, если не нашел, обновляешь картинку. Где-то да совпадут.
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
Мне тоже нравится идея doc'a. Пилишь на, допустим 18 квадратиков и сверяешь, если не нашел, обновляешь картинку. Где-то да совпадут.
Допустим порезали картинку на 18 частей, сверяем, нашли нужное число, а что дальше? Если вы внимательно читали мой первый пост, нам нужно получить именно координаты клика мышки по найденному числу. Иными словами нам надо чтоб каждая цифра оставалась на своем месте для получения координат клика мышкой, так как у меня в примере на 2 капчах. Уже от туда легко получить координаты первого черного пикселя, к которому приплюсовать еще 5 или 7 пикселей. Это и будут координаты клика мышки. Надеюсь теперь то вы меня поняли? Ради интереса, если у вас есть время, возьмите сами попробуйте, и вам сразу все станет ясно и понятно, то что вы предлагаете не сработает)
 
  • Спасибо
Реакции: Alexmd

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
У меня было решение схожей капчи но совершенно другим методом.
Можно ссылку на саму капчу?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Вообще, такую капчу без проблем можно на сервисах решать
У меня было решение схожей капчи но совершенно другим методом.
Можно ссылку на саму капчу?
О каком методе речь?
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Допустим порезали картинку на 18 частей
Не надо резать картинку.
Необходимо чтобы "окошко" размером сопоставимым с размером двухзначного числа бегало по полотну (картинки) и искала числа.
Так и координаты узнаешь куда кликать.
 
  • Спасибо
Реакции: doc

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 788
Благодарностей
1 455
Баллы
113
Не надо резать картинку.
Необходимо чтобы "окошко" размером сопоставимым с размером двухзначного числа бегало по полотну (картинки) и искала числа.
Так и координаты узнаешь куда кликать.
Это с мира фантастики? как такое сделать? куда копать? что почитать? где можно посмотреть похожие примеры?
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Это с мира фантастики?
Из головы.
Полностью алгоритм не опишу (займёт пол дня).

Попробую натолкнуть.
Судя по коду из первого поста, с Bitmap ты работал. Бегать по пикселям и определять их значения умеешь.
Писать это надо не в одном кубике, а в объект-но ориентированном стиле (иначе задолбаешься).
1. Необходимо создать квадрат (окно, курсор, лупу, хз как назвать. будем называть курсор), в которое будет помещаться твоё число (в любом виде, ровном превернутом на 5 нрадусов, на 25 и т.д).
https://s.mail.ru/D6wt/6R7yAgBBB
Этот курсор будет бегать по картинке и определять заполненность
Те. ты раньше бегал по одному пикселю, а теперь будешь бегать по пачке сразу.
Алгоритм определения того что в квадрате число или пустота или половина числа придумываешь сам.
2. По мере того как курсор бегает по картинке, запоминается текущее положение курсора на картинке отностиельно X,Y этой картинки.
Курсор находит число. Отправляет на распознавание. Отсчитывает свои координаты. Кликаешь по картинке.

Код вижу примерно такой
C#:
/*** псевдокод ***/
//Кубик свой код C#
var question = 42
var image = Bitmap.Load(file);
var cursor = new cursor(image);

var contentDetector = new ContentDetector(image, cursor);
var success = false;

while(!contentDetector.CanFind)
{
    var content = contentDetector.FindNext();
   
    var result = SendToOCR(content);
    if(question == result)
    {
        success = true;
        break;
    }
    else contentDetector.FindNext();
}

if(success)
{
    var coordsToClick = cursor.Coords - image.Coords;
    tab.MouseClick(coordsToClick);
}
else
{
    throw new Exception("Не удалось обнаружить нужное число");
}
//Конец Кубика свой код C#


//Метод класса ContentDetector
public Content FindNext()
{
    while(cursor.CanMove)
    {
        this.cursor.MoveNext();
        var content = cursor.CheckContent();
        if(content != null) return content;
    }
    return null;
}
Может где-то ошибся, но надеюсь что на мысль натолкнул.
 
  • Спасибо
Реакции: Yuriy Zymlex и samsonnn

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
куда копать? что почитать? где можно посмотреть похожие примеры?
Советую не тратить время на создание своего модуля.
Потратишь месяц на разработку, а после того как закончишь (или во время разработки) сайт может сменить капчу.
Обратись к специалисту, который решает подобные задачи без замудрёных решений (с помощью машинного обучения).
https://zennolab.com/discussion/members/7make.1798/
 

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