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

  • Автор темы Автор темы samsonnn
  • Дата начала Дата начала

samsonnn

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

Vat1NqC.jpg
9i43huR.jpg
PZbgrCu.jpg


B4Q7Vp7.jpg
J7Oq3s1.jpg
Cs1aBbu.jpg

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

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

vCAeioa.jpg


С помощью 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 капчах:
rJrnJtj.jpg


ousjvOY.jpg


M6S9OBq.jpg


hJNyoJr.jpg


wppHvXR.jpg


MVpy1Jg.jpg


WonbTwv.jpg


И вторая капча:
3jCX98n.jpg


ycdQCRK.jpg


pcLl8ce.jpg


U0yuRv9.jpg


m90oZLn.jpg


7uSSLfY.jpg


Ce2VCxq.jpg

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

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

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

Вложения

Последнее редактирование:
самое простое что пришло в голову, исходя из того, что у вас уже есть. распознать картинки где на одной только одно число и найти правильный ответ. затем в цикле брать линию пиксельную и если идти слева направо сверху вниз, то искать 3-5 подряд идущих пикселей одного цвета и затем уже кликать со смещением вниз и вправо
 
не понял, зачем тебе оттенки. Каждую полученную картинку прогнал на распознавании и сравнил с искомым. Совпали - просто ищешь где большое скопление НЕ белых точек
 
  • Спасибо
Реакции: ibred
А вообще, клёвая капча. Не в смысле сложности, а в том смысле, что ты, наверно, получил массу удовольствия, распиливая её шаг за шагом)
 
Как вариант приводит оттенки в свой цвет(красный+100 оттенков в сплошной красный), по любому такие фильтры есть. А там уже разбирать как угодно.
 
не понял, зачем тебе оттенки. Каждую полученную картинку прогнал на распознавании и сравнил с искомым. Совпали - просто ищешь где большое скопление НЕ белых точек
не все так просто как вы думаете, в реале нужно получить координаты мышки искомого числа, в черно белый я тоже могу сделать, и распознать тессерактом не проблема, проблема получить координаты клика по нужному числу
 
Как вариант приводит оттенки в свой цвет(красный+100 оттенков в сплошной красный), по любому такие фильтры есть. А там уже разбирать как угодно.
Я тоже про это думал сегодня, в гугле нечего не нашел(
 
не все так просто как вы думаете, в реале нужно получить координаты мышки искомого числа, в черно белый я тоже могу сделать, и распознать тессерактом не проблема, проблема получить координаты клика по нужному числу
у тебя есть отдельные картинки по одному числу на каждой. Через распознавание вычисляешь картинку с нужным числом. А в картинке этой как найти координату числа уже не сложно придумать
 
самое простое что пришло в голову, исходя из того, что у вас уже есть. распознать картинки где на одной только одно число и найти правильный ответ. затем в цикле брать линию пиксельную и если идти слева направо сверху вниз, то искать 3-5 подряд идущих пикселей одного цвета и затем уже кликать со смещением вниз и вправо
в том то и дело, сначала надо сделать так чтоб получать по одному числу, а именно цветовые оттенки меняются, и не дают этого сделать, а их в природе миллионы разных
 
у тебя есть отдельные картинки по одному числу на каждой. Через распознавание вычисляешь картинку с нужным числом. А в картинке этой как найти координату числа уже не сложно придумать
то я просто показал для примера, разобрал 2 капчи, я знаю что дальше делать, тессеракт берет на ура

alSxIlq.jpg


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

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

NZK3OGA.jpg
 
ты попиксельно в каком-нить редакторе проверял, градации цвета есть внутри одного числа?
в фотошопе проверял, не я же эти оттенки выдумал, там все по пикселям

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

OlmnuCn.jpg


PuaFA7H.jpg


hnGfrTH.jpg


y8TMKnn.jpg


PDF8ink.jpg
 
Последнее редактирование:
Можно пойти другим путём. Все цифры одинакового размера. Можно взять за основу определённый размер блока, и искать по картинке блоки, где много НЕ белых символов. Каждый такой блок разгадывать
 
Можно пойти другим путём. Все цифры одинакового размера. Можно взять за основу определённый размер блока, и искать по картинке блоки, где много НЕ белых символов. Каждый такой блок разгадывать
прочитал раз 5 внимательно, пытаюсь понять что за блоки и как решать но не понимаю(
 
прочитал раз 5 внимательно, пытаюсь понять что за блоки и как решать но не понимаю(
ну делишь картинку на условные квадратики и каждый квадратик проверяешь на содержимое
 
ну делишь картинку на условные квадратики и каждый квадратик проверяешь на содержимое
про это я тоже думал, но цифры всегда в разных местах, как ее резать? Можно пример?
 
Мне тоже нравится идея doc'a. Пилишь на, допустим 18 квадратиков и сверяешь, если не нашел, обновляешь картинку. Где-то да совпадут.
 
Мне тоже нравится идея doc'a. Пилишь на, допустим 18 квадратиков и сверяешь, если не нашел, обновляешь картинку. Где-то да совпадут.

Допустим порезали картинку на 18 частей, сверяем, нашли нужное число, а что дальше? Если вы внимательно читали мой первый пост, нам нужно получить именно координаты клика мышки по найденному числу. Иными словами нам надо чтоб каждая цифра оставалась на своем месте для получения координат клика мышкой, так как у меня в примере на 2 капчах. Уже от туда легко получить координаты первого черного пикселя, к которому приплюсовать еще 5 или 7 пикселей. Это и будут координаты клика мышки. Надеюсь теперь то вы меня поняли? Ради интереса, если у вас есть время, возьмите сами попробуйте, и вам сразу все станет ясно и понятно, то что вы предлагаете не сработает)
 
  • Спасибо
Реакции: Alexmd
У меня было решение схожей капчи но совершенно другим методом.
Можно ссылку на саму капчу?
 
Вообще, такую капчу без проблем можно на сервисах решать
У меня было решение схожей капчи но совершенно другим методом.
Можно ссылку на саму капчу?
О каком методе речь?
 
Допустим порезали картинку на 18 частей
Не надо резать картинку.
Необходимо чтобы "окошко" размером сопоставимым с размером двухзначного числа бегало по полотну (картинки) и искала числа.
Так и координаты узнаешь куда кликать.
 
  • Спасибо
Реакции: doc
Не надо резать картинку.
Необходимо чтобы "окошко" размером сопоставимым с размером двухзначного числа бегало по полотну (картинки) и искала числа.
Так и координаты узнаешь куда кликать.
Это с мира фантастики? как такое сделать? куда копать? что почитать? где можно посмотреть похожие примеры?
 
Это с мира фантастики?
Из головы.
Полностью алгоритм не опишу (займёт пол дня).

Попробую натолкнуть.
Судя по коду из первого поста, с 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
куда копать? что почитать? где можно посмотреть похожие примеры?
Советую не тратить время на создание своего модуля.
Потратишь месяц на разработку, а после того как закончишь (или во время разработки) сайт может сменить капчу.
Обратись к специалисту, который решает подобные задачи без замудрёных решений (с помощью машинного обучения).
https://zennolab.com/discussion/members/7make.1798/
 

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