Общая схема
- Поиск окна капчи
- Запуск
- Обработка
- Ожидание подтверждения
Обработка подробнее... Чтобы более-мение стандартизировать сделал так:
Ищу неподвижную область куда перетягиваются элементы, она же определяет номер варианта. Имя, например, ver_4.bmp
В подпрограмму передаю количество возможных "плавающих" картинок, номер варианта и смещения. Смещения - куда будем тянуть каждую картинку относительно ver_4.bmp. Чаще всего совпадают с положением ver_4.bmp, но бывает нужно в разные места.
Ищем последовательно картинки к данному варианту и перетягиваем их.
Иногда вариант один (косметичка), а наборы элементов бывают разные. Этим способом мы сильно сокращаем код и создание.
Вот почти готовый код. Осталось дополнять вариантами... Не реализован отдельный вариант с бабочками. Можно его или пропускать или обрабатывать другой подпрограммой, т.к. логика другая.
#name "AYH"
// Author: Vint
// Version: 0.3 (21.07.2014)
#logfile
$pref = "ver_" // префикс имени основы картинки (варианты)
$num = 12 // сколько вариантов всего
//------------------------------------------------------------------------------
//==============================================================================
SUB(PLAY, $pic, $version, $D1_X,$D1_Y, $D2_X,$D2_Y, $D3_X,$D3_Y) //=============
// количество картинок в этом варианте
// № варианта
// смещения X/Y куда тащить (от базовой)
$time = $_time_t + 5
WHILE($time > $_time_t)
// 1-й элемент
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, STRCONCAT($pref, $version,"_1", ".bmp"))
LOGWRITE ("нашли 1")
// перенос
LDOWN($_return1+5, $_return2+5)
WAITMS(100)
MOVE($main_X+$D1_X, $main_Y+$D1_Y)
WAITMS(200)
LUP($main_X+$D1_X, $main_Y+$D1_Y)
WAITMS(300)
MOVE($_xmax,$_ymax)
WAITMS(50)
END_IF
// 2-й элемент
IF($pic > 1)
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, STRCONCAT($pref, $version,"_2", ".bmp"))
LOGWRITE ("нашли 2")
// перенос
LDOWN($_return1+5, $_return2+5)
WAITMS(100)
MOVE($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(200)
LUP($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(300)
MOVE($_xmax,$_ymax)
WAITMS(50)
END_IF
END_IF
// 3-й элемент
IF($pic > 2)
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, STRCONCAT($pref, $version,"_3", ".bmp"))
LOGWRITE ("нашли 3")
// перенос
LDOWN($_return1+5, $_return2+5)
WAITMS(100)
MOVE($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(200)
LUP($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(300)
MOVE($_xmax,$_ymax)
WAITMS(50)
END_IF
END_IF
// 4-й элемент
IF($pic > 3)
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, STRCONCAT($pref, $version,"_4", ".bmp"))
LOGWRITE ("нашли 4")
// перенос
LDOWN($_return1+5, $_return2+5)
WAITMS(100)
MOVE($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(200)
LUP($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(300)
MOVE($_xmax,$_ymax)
WAITMS(50)
END_IF
END_IF
// 5-й элемент
IF($pic > 4)
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, STRCONCAT($pref, $version,"_5", ".bmp"))
LOGWRITE ("нашли 5")
// перенос
LDOWN($_return1+5, $_return2+5)
WAITMS(100)
MOVE($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(200)
LUP($main_X+$D2_X, $main_Y+$D2_Y)
WAITMS(300)
MOVE($_xmax,$_ymax)
WAITMS(50)
END_IF
END_IF
END_CYC
END_SUB
//==============================================================================
start:
// ищем-ждём окно с капчей
MOVE($_xmax,$_ymax)
$find = 0
WHILE($find = 0)
GETSCREEN
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "start.bmp",-1,86)
HINTPOPUP("Капча!")
LCLICK($_return1+50,$_return2+10)
// основная область капчи
$X1 = $_return1-131
$X2 = $_return1+230
$Y1 = $_return2-82
$Y2 = $_return2+50
// кнопка RELOAD
$reload_X = $_return1+154
$reload_Y = $_return2+64
$find = 1
ELSE
WAITMS(200)
END_IF
END_CYC
// распознаём вариант капчи
MOVE($_xmax,$_ymax)
WAITMS(2000)
$version = 0
WHILE($version = 0)
GETSCREEN
$version = 0
$i = 0
FOR($i,$i < $num)
IF_PICTURE_IN (0,0,$_xmax,$_ymax, STRCONCAT($pref, $i+1, ".bmp"),-1,100)
$version = $i+1
LOGWRITE ("Вариант капчи № ", $i+1)
$main_X = $_return1
$main_Y = $_return2
$i = 10000 // выходим досрочно
ELSE
WAITMS(20)
END_IF
END_CYC
IF($version = 0)
// тут лучше проверить на релоад
// Можно или обновить капчу или определять вариант опять
$version = 10000
END_IF
END_CYC
// релоад
IF($version = 10000)
LCLICK($reload_X,$reload_Y)
WAIT(1)
GOTO(start)
END_IF
SWITCH($version)
CASE(1) // вариант 1 (ТОРТ)
PLAY(2, $version, 15,10, 15,10, 0,0) // 2 картинки, №варианта, смещения XY
CASE(2) // вариант 2 (бегуны)
PLAY(2, $version, -30,0, -30,0, 0,0)
CASE(3) // вариант 3 (мылыш обжора)
PLAY(4, $version, 20,25, 20,25, 20,25)
CASE(4) // вариант 4 (косметичка)
PLAY(4, $version, 0,0, 0,0, 0,0)
CASE(5) // вариант 5 (летающие звери)
PLAY(5, $version, 0,0, 0,0, 0,0)
CASE(6) // вариант 6 (ваза с цветами)
PLAY(4, $version, 0,0, 0,0, 0,0)
CASE(7) // вариант 7 (рожа)
PLAY(3, $version, 0,25, 0,55, 0,68)
CASE(8) // вариант 8 (Aliens)
PLAY(3, $version, 0,25, 0,25, 0,25)
CASE(9) // вариант 9 (баскетбол)
PLAY(1, $version, 0,40, 0,0, 0,0)
CASE(10) // вариант 10 (гольф)
PLAY(1, $version, 0,10, 0,0, 0,0)
CASE(11) // вариант 11 (велосипед)
PLAY(2, $version, 0,0, 55,-70, 0,0)
CASE(12) // вариант 12 (лимонад)
PLAY(2, $version, 0,0, 0,0, 0,0)
END_SWITCH
// Ждём подтверждения
MOVE($_xmax,$_ymax)
WAITMS(50)
$time = $_time_t + 15
$find = 0
WHILE(($find = 0) & ($time > $_time_t))
GETSCREEN
IF_PICTURE_IN ($X1,$Y1,$X2,$Y2, "complete.bmp",-1,75)
LOGWRITE ("Капча распознана!")
HINTPOPUP("Капча распознана!")
$find = 1
LCLICK($reload_X,$reload_Y)
WAIT(1)
ELSE
WAITMS(100)
END_IF
END_CYC
IF($find = 0)
LOGWRITE ("Не распознали")
LCLICK($reload_X,$reload_Y)
WAIT(1)
END_IF
GOTO(start)
HALT