Author Topic: Как можно разгадать такую капчу при помощи анализа изображений?  (Read 4267 times)

0 Members and 1 Guest are viewing this topic.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Подскажите пожалуйста как можно разгадать такую капчу при помощи анализа изображения?





Это в телеграме

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

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

Клик
Если есть картинка "N", то ждем пока она не пропадет
Картинка пропала, делаем действие и опять операция с картинкой "N"

Если нет картинки "N" после клика, то переходим к поиску картинок капчи
Поиск картинки в области "найдите кнопку"
Сначала поиск нужной картинки 1белая.bmp
Если не находит, то поиск следующей плюсикбелый.bmp, не находит то поиск палецбелый.bmp
Если находит картинку, например, плюсикбелый.bmp, то кликает в нужной области по картинке плюсикзеленый.bmp
 
Помогите пожалуйста с кодом!


« Last Edit: February 19, 2018, 09:54:17 PM by d2_bot »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
ничего не понял насчет твоей последовательности действий.

вот скрипт, который находит картинку "кнопку.bmp" (во вложении). делает скриншот фрагмента правее от найденного, и сохраняет его с колормодом.  далее ищет этот скрин ниже. и, в моем примере, наводит курсор на найденное.

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопку.bmp", -1, 90)
   print("кнопку.bmp - ",$_return1,"x", $_return2)
   WAITMS(100)
   
   COLORMODE(5)   
   SCREENSHOTFIX ($_return1+50,$_return2-5,$_return1+65, $_return2+12,"pic.bmp")
   
   WAITMS(100)
   IF_PICTURE_IN (0,$_return2+20, $_xmax,$_ymax, "pic.bmp",16777215,80)
      print("pic.bmp - ",$_return1,"x", $_return2)
     
      move($_return1,$_return2)
      WAITMS(100)
     
   END_IF
END_IF
halt

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
благодарю за помощь, но для меня это пока сложно оказалось))

вот начал с простого, надо искать мешочек, если находит кликает и крутит 3 раза колесо, если не находит крутит колесо 2 раза и снова ищет, но у меня это большой код)

Code: [Select]
wait(3)
GETSCREEN
IF_PICTURE_IN (765,714, 806,752, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
   waitms(200)
END_IF

waitms(200)
WHEELUP(2)
waitms(600)



GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)  //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF

waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(100)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF

waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(100)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF

waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,596, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF


waitms(200)
WHEELUP(2)
waitms(600)

GETSCREEN
IF_PICTURE_IN (759,261, 887,520, "мешок.bmp")
waims(300)
   MOVE($_return1-150, $_return2+50)
   waitms(200)
   LCLICK($_return1-150, $_return2+50)   //клик мешка
waitms(200)
WHEELUP(3)
Else
   WHEELUP(2)
   waitms(200)   
END_IF

Пришлось искать по мешочку на белом фоне, так как на зеленом постоянно меняется цвет нескольких пикселей при прокрутке.




dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
прокомментировал свой код. там все очень просто. как только в нем разберешься, без проблем сможешь отредактировать для своих задач.

берешь данный код, сохраняешь его в одной директории с картинкой "кнопку.bmp". запускаешь прямо перед браузером с этой темой (масштаб в браузере должен быть 100%). и видишь, как прямо в твоих сообщениях находит нужное и указывает курсором.

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

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопку.bmp", -1, 90) //ищем картинку кнопку.bmp

//если нашли
   print("кнопку.bmp - ",$_return1,"x", $_return2) //смотрим координаты ее в логе
   WAITMS(100)
   
   COLORMODE(5)   //немного упрощаем картинку в буфере
   SCREENSHOTFIX ($_return1+50,$_return2-5,$_return1+65, $_return2+12,"pic.bmp")  //делаем скрин фрагмента правее от найденой картинки.
   
   WAITMS(100)
   
   //а теперь ищем эту сохраненную картинку в ниже
   IF_PICTURE_IN (0,$_return2+20, $_xmax,$_ymax, "pic.bmp",16777215,85)//используем игнорируемый цвет 16777215 - белый. в этом случае нам не важно какой фон там, зеленый или красный, будет искать только картинку.
      print("pic.bmp - ",$_return1,"x", $_return2)  //смотрим в логе координаты
     
      move($_return1,$_return2) //перемещаем курсор к найденному.
      WAITMS(100)
     
   END_IF
END_IF
halt

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
а если работаю не в браузере, а в exe приложении и не на весь экран

и еще поясни пожалуйста

Code: [Select]
0,0, $_xmax,$_ymax,
//Как правильно в таком варианте прописать координаты?

//У меня вот так:
IF_PICTURE_IN (639,765, 712,815, "мешок.bmp", -1, 90)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
хоть в браузере, хоть в паинте, хоть в другом приложении, без разницы. если в твоем приложении будет другой масштаб картинки, то просто нужно обновить искомую картинку "кнопку.bmp".

я написал код для универсального применения, области сканирования можно (нужно) подредактировать. 0,0, $_xmax,$_ymax значит, что поиск картинки будет произведен на всем экране.


d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile


вот что получается в pic.bmp

поменял в коде кординаты скриншота на точные без отклонений
Code: [Select]
SCREENSHOTFIX ($_return1,$_return2,$_return1, $_return2,"pic.bmp")


Вот что вышло, курсор ушел к картинке обведенной красным, а искомый мешок не нашелся, он обведен черным

Какой то смышленный скрипт у тебя) подошел к вопросу с другой стороны, доллары ищет в любом формате ;D
« Last Edit: February 21, 2018, 12:11:45 AM by d2_bot »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
SCREENSHOTFIX ($_return1,$_return2,$_return1, $_return2,"pic.bmp") - это один пиксель, этот пиксель где угодно может быть.

что там у тебя не так, не пойму. опять же я взял вышенаписанный код, ничего не менял, взял искомую картинку "кнопку.bmp". открыл браузер с этой темой и твоим последним скриншотом. запустил.

в логе:
Code: (texk) [Select]
0:37:56 кнопку.bmp - 817x342
0:37:57 pic.bmp - 721x394

и курсор указал мне на то, что в черном круге.

скорее всего чтото напортачил ты в координатах. SCREENSHOTFIX ($_return1+50,$_return2-5,$_return1+65, $_return2+12,"pic.bmp") - делает скрин правее верхнего левого угла найденной "кнопку.bmp" на 50пикс, и чуть выше на 5 пикс, размером 16х18.
вот такой -

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
В логе

Code: [Select]
8:52:47 мешок.bmp - 781x728
8:52:48 pic.bmp - 0x748


запустил ничего не меняя
Code: [Select]
9:26:40 мешок.bmp - 781x429
9:26:40 pic.bmp - 0x449
:-[
« Last Edit: February 21, 2018, 09:30:01 AM by d2_bot »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
В логе

Code: [Select]
8:52:47 мешок.bmp - 781x728
8:52:48 pic.bmp - 0x748
:o а мешок то откуда взялся? я думал что картинка постоянно меняется. а неизменна остается надпись "кнопку". поэтому и нужно искать эту надпись. 

оставь ты пока свои нововведения, разберись наконец принцип работы моего скрипта, не меняй пока в нем ничего.

ну если всеже не веришь мне, и хочешь искать мешок, то ищи его прямо на зеленом фоне, вот так:
Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "мешок.bmp", -1, 90)
   print("мешок.bmp - ",$_return1,"x", $_return2)
   WAITMS(100)
   
   IF_PICTURE_IN (0,$_return2+20, $_xmax,$_ymax, "мешок.bmp",16777215,85)
      print("мешок.bmp на зеленом фоне - ",$_return1,"x", $_return2)
     
      move($_return1,$_return2)
      WAITMS(100)
     
   END_IF
END_IF
halt

не тестировал, возможно без цветокоррекции нужно будет уменьшить процент совпадения.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
ну я понял ошибку)) :D я мешок искал) вырезал сейчас буквы "кнопку" и нашлась нужная кнопка


вот код
Code: [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "кнопку.bmp", -1, 90) //ищем картинку кнопку.bmp
 
//если нашли
   print("кнопку.bmp - ",$_return1,"x", $_return2) //смотрим координаты ее в логе
   WAITMS(100)
 
   COLORMODE(5)   //немного упрощаем картинку в буфере
   SCREENSHOTFIX ($_return1+50,$_return2-5,$_return1+65, $_return2+12,"pic.bmp")  //делаем скрин фрагмента правее от найденой картинки.
 
   WAITMS(100)
 
   //а теперь ищем эту сохраненную картинку в ниже
   IF_PICTURE_IN (0,$_return2+20, $_xmax,$_ymax, "pic.bmp",16777215,85)//используем игнорируемый цвет 16777215 - белый. в этом случае нам не важно какой фон там, зеленый или красный, будет искать только картинку.
      print("pic.bmp - ",$_return1,"x", $_return2)  //смотрим в логе координаты
 
      move($_return1,$_return2) //перемещаем курсор к найденному.
      WAITMS(100)
LCLICK($_return1, $_return2)
waitms(100)
WHEELUP(2)
     
 
   END_IF
END_IF
else
waims(500)
WHEELUP(2)
END_IF


Запустил его, и началась каша малаша

Code: [Select]
13:29:49 кнопку.bmp - 693x179
13:29:49 pic.bmp - 597x231
13:29:50 кнопку.bmp - 693x179
13:29:50 pic.bmp - 597x231
13:29:51 кнопку.bmp - 693x299
13:29:52 pic.bmp - 597x351
13:29:53 кнопку.bmp - 693x419
13:29:53 pic.bmp - 597x471
13:29:54 кнопку.bmp - 693x218
13:29:54 pic.bmp - 597x270
13:29:55 кнопку.bmp - 693x338
13:29:56 pic.bmp - 597x390
13:29:56 кнопку.bmp - 693x191
13:30:00 кнопку.bmp - 693x311
13:30:01 pic.bmp - 597x363
13:30:02 кнопку.bmp - 693x311
13:30:02 pic.bmp - 597x363
13:30:03 кнопку.bmp - 693x431
13:30:04 pic.bmp - 597x483
13:30:05 кнопку.bmp - 693x551
13:30:05 pic.bmp - 597x603
13:30:06 кнопку.bmp - 693x180
13:30:06 pic.bmp - 597x232
13:30:07 кнопку.bmp - 693x300
13:30:08 pic.bmp - 597x352
13:30:09 кнопку.bmp - 693x300
13:30:09 pic.bmp - 597x352
13:30:10 кнопку.bmp - 693x420
13:30:11 pic.bmp - 597x472
13:30:12 кнопку.bmp - 693x420
13:30:12 pic.bmp - 597x472
13:30:14 кнопку.bmp - 693x540
13:30:14 pic.bmp - 597x592
13:30:15 кнопку.bmp - 693x540
13:30:16 pic.bmp - 597x592
13:30:17 кнопку.bmp - 693x660
13:30:18 pic.bmp - 597x712
13:30:19 кнопку.bmp - 693x660
13:30:20 pic.bmp - 597x712
« Last Edit: February 21, 2018, 01:32:41 PM by d2_bot »

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
В общем возьму код в арсенал) благодарю за помощь

Картинки пока находить получается, но не все. К сложным перейду позднее

Есть задачка, как лучше ее решить?

Кнопка "смотреть пост" есть всегда, кроме момента когда пост просматривается


Когда находит кнопку "смотреть пост" кликает на нее, если не находит, начинает искать 2 картинки, если находит любую из них завершает работу.... но что-то я не разберусь как правильно организовать код:



Code: [Select]
wait(3)
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (576,614, 737,645, "Смотреть пост.bmp")
    waitms(200)

 
      $check = 1
      WAITMS(100)
      MOVE($_return1, $_return2)
waitms(200)
LCLICK($_return1, $_return2)
waitms(200)
   ELSE
   wait(3)
      IF_PICTURE_IN (431,320, 791,413, "превышены лимиты.bmp")
         $check = 2 // Присваиваем $check значение 2
         WAITMS(500)
         ELSE
   wait(1)
      IF_PICTURE_IN (431,320, 791,413, "Пока нет.bmp")
         $check = 3 // Присваиваем $check значение 3
         WAITMS(500)
      END_IF
      END_IF
   END_IF
   END_IF


IF($check = 1) // Если $check равна 1 то выполняем это
IF_PICTURE_IN (906,143, 946,161, "Смотреть пост.bmp")
waitms(200)
MOVE($_return1, $_return2)
waitms(200)
LCLICK($_return1, $_return2)
waitms(200)
 

IF($check = 2) // Если $check равна 2 то выполняем это
MOVE(183, 139)
wait(1)
LCLICK(183,139)
wait(1)

IF($check = 3) // Если $check равна 3 то выполняем это
MOVE(183, 139)
wait(1)
LCLICK(183,139)
wait(1)

END_IF 
END_IF
END_IF

 END_CYC


Походу нужно как то от обратного... ищет картинку "смотреть пост", кликает, потом смотрит, есть ли какой то вариант из 2х картинок, если нету, жмет смотреть пост. Если кнопки "смотреть пост" нету, ждет ее появления
« Last Edit: February 21, 2018, 08:21:50 PM by d2_bot »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
нужно както определиться.
получается что тут требуется одно
Quote
Когда находит кнопку "смотреть пост" кликает на нее, если не находит, начинает искать 2 картинки, если находит любую из них завершает работу
тут совсем другое
Quote
Походу нужно как то от обратного... ищет картинку "смотреть пост", кликает, потом смотрит, есть ли какой то вариант из 2х картинок, если нету, жмет смотреть пост. Если кнопки "смотреть пост" нету, ждет ее появления
а код показывает что-то совсем отличное от вышеуказанного.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
много тем пролистал на форуме по похожим вопросам, не знаю как лучше, да и вообще как в конечном итоге

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
покачто не думай как должен будет работать код. объясни, как тебе в ручную приходится действовать, на что нужно кликать, чего нужно ожидать, что искать, и чего достичь. опиши алгоритм своих действий, темы на форуме тебе в этом не помогут. а дальше уже будем думать, как это все перенести в кликерман.