Author Topic: Скрипт для нарезки уникальных шаблонов из капчи  (Read 4053 times)

0 Members and 1 Guest are viewing this topic.

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Если у вас есть капча, без слипшихся символов, то предлагаю вот такой полезный скрипт.  Можно использовать не только для капчи, но мне нужно было только для этого. За основу  взяты скрипты  Винта и Dramstera.  Конкретно по настройке -  меняете границы капчи(13-16 строки), указываем число символов(строка 267). папка скрин не должна быть пуста! Хотя бы одна картинка должна быть, иначе  ничего сохраняться не будет.
Алгоритм:
1. ищем границы всех символов
2.  проверяем есть ли у нас совпадение 100% с нарезанными шаблонами. если нашли  ищем следующий символ. Иначе -  потихоньку опускаем  % до 95. если в 95-99% находим,  то скрипт  уточнит - верно  угадал или нет, а далее при  успехе -сохраняем. если не находим в шаблонах, то сохряаняем, вводя в строку ввода  символ. в папке все сораняется в таком ввиде - например, сохраняем 9 - 9_0000. бмп.
 Этот способ работает, если символы отклоняются от оси на какой-то %. если есть рандомное   искажение, то   шаблонизация не подходит - шаблонов не напасешься).  во вложении  скрипт на 1500 шаблонов, которые срабатывают через раз.. ну зато у меня есть база для обучения кликера

Code: (clickermann) [Select]
$pref = "screens\"
$cmd = STRCONCAT($pref,"cmd.bat")
$dir = STRCONCAT($pref,"dir.txt")

TFWRITE($cmd, "chcp 1251>nul")
TFWRITE($cmd, STRCONCAT("cd ", $pref))
TFWRITE($cmd, "dir *.bmp /b /on >dir.txt")
TFWRITE($cmd, "del /F /S cmd.bat")
EXECUTE($cmd)
WAIT(2)


$x1_fr= 615
$y1_fr= 327
$x2_fr=699
$y2_fr=350


UNDEFINE($num_line_start)
UNDEFINE($num_line_end)
UNDEFINE($num_real)
UNDEFINE($num_y1)

GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
COLORMODE(8,$x1_fr,$y1_fr,$x2_fr,$y2_fr)


scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, 0)
IF(ARRSIZE ($cap_arr) = 0)
   print("капчи в этом поле нету")
   halt
END_IF
$y1_cap=$cap_arr[1]
$y2_cap=ARRPOP($cap_arr)


FOR($x=$x1_fr,$x<$x2_fr)
   FOR($y=$y1_cap,$y<$y2_cap+1)
     
      IF(pxl($x,$y) = 0)
         $x1_cap= $x
         $y=$y2_cap+1
         $x=$x2_fr
      END_IF
   END_CYC
END_CYC

FOR($x=$x2_fr,$x>$x1_fr,-1)
   FOR($y=$y1_cap,$y<$y2_cap+1)
      IF(pxl($x,$y) = 0)
         $x2_cap= $x
         $y=$y2_cap+1
         $x=$x1_fr
      END_IF
   END_CYC
END_CYC

//=======================================

ARRPUSH ($num_line_start, $x1_cap)
FOR($x=$x1_cap,$x<$x2_cap)
   FOR($y=$y1_cap,$y<$y2_cap+1)
      IF(pxl($x,$y)  = 0)
         IF((pxl($x+1,$y)  = 0)|(pxl($x+1,$y-1) = 0)|(pxl($x+1,$y+1) = 0))
            $y=999999
         END_IF
      END_IF
     
   END_CYC
   IF($y=$y2_cap+1)
      ARRPUSH ($num_line_end, $x)
      FOR($x_check=$x+1,$x_check<$x2_cap)
         FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
            IF(pxl($x_check,$y_check)  = 0)
               $x= $x_check
               ARRPUSH ($num_line_start, $x)
               $y_check=$y2_cap+1
               $x_check=$x2_cap
            END_IF
         END_CYC
      END_CYC
   END_IF
END_CYC
ARRPUSH ($num_line_end, $x2_cap)
//=============================================
$y2_cap = $mm+$y2_cap
FOR($num=0, $num<arrsize($num_line_start))
   FOR ($y=$y2_cap, $y>$y1_cap, -1)
      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
         IF(pxl($x,$y)  = 0)
            ARRPUSH($num_y2,$y)
            $y=0
            $x=$num_line_end[$num]+1
         END_IF
      END_CYC
   END_CYC
END_CYC

FOR($num=0,$num<arrsize($num_line_start))
   FOR($y=$y1_cap,$y<$y2_cap)
      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
         IF(pxl($x,$y)  = 0)
            ARRPUSH($num_y1,$y)
            $y=99999
            $x=$num_line_end[$num]+1
         END_IF
      END_CYC
   END_CYC
END_CYC
print("найдено цифр в поле ",arrsize($num_line_start))




if (arrsize($num_line_start)=6)
   FOR($a=0,$a<arrsize($num_line_start))
      FOR($i=0, $i < TFCOUNT($dir))
         $name = TFREAD($dir, $i+1)
         IF_PICTURE_IN($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], STRCONCAT($pref,$name))
            print("нашли", STRCUT($name, 1, 1))
            $i = 99999999 //
         else
            if ($i+1=TFCOUNT($dir))
               FOR($p=99, $p>94, -1)
                  FOR($i2=0, $i2 < TFCOUNT($dir))
                     $name = TFREAD($dir, $i2+1)
                     IF_PICTURE_IN($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], STRCONCAT($pref,$name),-1, $p)
                       
                        $dialog = DIALOGBOX(strconcat("цифра№", $a+1," /// ",STRCUT($name, 1, 1),"- Верно?"), 4, 2)
                        if  ($dialog=6)
                           print("нашли", STRCUT($name, 1, 1))
                           SCREENSHOTEX($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], strconcat(STRCUT($name, 1, 1),"_"), 0)
                           $i2 = 99999999
                           $p=0
                        end_if
                     else
                        if (($p=95)&($i2+1=TFCOUNT($dir)))
                           $text=INPUTBOX(strconcat("ввод цифры ", $a+1), "999999", 100)
                           SCREENSHOTEX($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], strconcat($text,"_"), 0)
                        end_if
                     END_IF
                  END_CYC
               END_CYC
            END_IF
         END_IF
      END_CYC
   END_CYC
end_if
LCLICK(314,660)  // переключаемся на  окно бразера для обновления
KEYPRESS(#F5)
WAIT(2)

$pref = "screens\"
$cmd = STRCONCAT($pref,"cmd.bat")
$dir = STRCONCAT($pref,"dir.txt")

TFWRITE($cmd, "chcp 1251>nul")
TFWRITE($cmd, STRCONCAT("cd ", $pref))
TFWRITE($cmd, "dir *.bmp /b /on >dir.txt")
TFWRITE($cmd, "del /F /S cmd.bat")
EXECUTE($cmd)
WAIT(2)


$x1_fr= 615
$y1_fr= 327
$x2_fr=699
$y2_fr=350


UNDEFINE($num_line_start)
UNDEFINE($num_line_end)
UNDEFINE($num_real)
UNDEFINE($num_y1)

GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
COLORMODE(8,$x1_fr,$y1_fr,$x2_fr,$y2_fr)


scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, 0)
IF(ARRSIZE ($cap_arr) = 0)
   print("капчи в этом поле нету")
   halt
END_IF
$y1_cap=$cap_arr[1]
$y2_cap=ARRPOP($cap_arr)


FOR($x=$x1_fr,$x<$x2_fr)
   FOR($y=$y1_cap,$y<$y2_cap+1)
     
      IF(pxl($x,$y) = 0)
         $x1_cap= $x
         $y=$y2_cap+1
         $x=$x2_fr
      END_IF
   END_CYC
END_CYC

FOR($x=$x2_fr,$x>$x1_fr,-1)
   FOR($y=$y1_cap,$y<$y2_cap+1)
      IF(pxl($x,$y) = 0)
         $x2_cap= $x
         $y=$y2_cap+1
         $x=$x1_fr
      END_IF
   END_CYC
END_CYC

//=======================================

ARRPUSH ($num_line_start, $x1_cap)
FOR($x=$x1_cap,$x<$x2_cap)
   FOR($y=$y1_cap,$y<$y2_cap+1)
      IF(pxl($x,$y)  = 0)
         IF((pxl($x+1,$y)  = 0)|(pxl($x+1,$y-1) = 0)|(pxl($x+1,$y+1) = 0))
            $y=999999
         END_IF
      END_IF
     
   END_CYC
   IF($y=$y2_cap+1)
      ARRPUSH ($num_line_end, $x)
      FOR($x_check=$x+1,$x_check<$x2_cap)
         FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
            IF(pxl($x_check,$y_check)  = 0)
               $x= $x_check
               ARRPUSH ($num_line_start, $x)
               $y_check=$y2_cap+1
               $x_check=$x2_cap
            END_IF
         END_CYC
      END_CYC
   END_IF
END_CYC
ARRPUSH ($num_line_end, $x2_cap)
//=============================================
$y2_cap = $mm+$y2_cap
FOR($num=0, $num<arrsize($num_line_start))
   FOR ($y=$y2_cap, $y>$y1_cap, -1)
      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
         IF(pxl($x,$y)  = 0)
            ARRPUSH($num_y2,$y)
            $y=0
            $x=$num_line_end[$num]+1
         END_IF
      END_CYC
   END_CYC
END_CYC

FOR($num=0,$num<arrsize($num_line_start))
   FOR($y=$y1_cap,$y<$y2_cap)
      FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
         IF(pxl($x,$y)  = 0)
            ARRPUSH($num_y1,$y)
            $y=99999
            $x=$num_line_end[$num]+1
         END_IF
      END_CYC
   END_CYC
END_CYC
print("найдено цифр в поле ",arrsize($num_line_start))




if (arrsize($num_line_start)=6)
   FOR($a=0,$a<arrsize($num_line_start))
      FOR($i=0, $i < TFCOUNT($dir))
         $name = TFREAD($dir, $i+1)
         IF_PICTURE_IN($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], STRCONCAT($pref,$name))
            print("нашли", STRCUT($name, 1, 1))
            $i = 99999999 //
         else
            if ($i+1=TFCOUNT($dir))
               FOR($p=99, $p>94, -1)
                  FOR($i2=0, $i2 < TFCOUNT($dir))
                     $name = TFREAD($dir, $i2+1)
                     IF_PICTURE_IN($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], STRCONCAT($pref,$name),-1, $p)
                       
                        $dialog = DIALOGBOX(strconcat("цифра№", $a+1," /// ",STRCUT($name, 1, 1),"- Верно?"), 4, 2)
                        if  ($dialog=6)
                           print("нашли", STRCUT($name, 1, 1))
                           SCREENSHOTEX($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], strconcat(STRCUT($name, 1, 1),"_"), 0)
                           $i2 = 99999999
                           $p=0
                        end_if
                     else
                        if (($p=95)&($i2+1=TFCOUNT($dir)))
                           $text=INPUTBOX(strconcat("ввод цифры ", $a+1), "999999", 100)
                           SCREENSHOTEX($num_line_start[$a],$num_y1[$a],$num_line_end[$a],$num_y2[$a], strconcat($text,"_"), 0)
                        end_if
                     END_IF
                  END_CYC
               END_CYC
            END_IF
         END_IF
      END_CYC
   END_CYC
end_if
LCLICK(314,660)  // переключаемся на  окно бразера для обновления
KEYPRESS(#F5)
WAIT(2)

для теста http://wekings.ru/simple_captcha/simple_captcha?distortion=&image_style=simply_red&time=1457034295
« Last Edit: March 03, 2016, 11:17:17 PM by Кликермен »

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Ну и не только для капчи) набросал скрипт для  копирования номеров с авито, которые там в виде картинок,  для защиты от ботов.


Code: [Select]
18:13:38 найдено цифр в поле 12
18:13:38 нашли8
18:13:38 нашли9
18:13:38 нашли5
18:13:38 нашли2
18:13:38 нашли8
18:13:38 нашли9
18:13:38 нашли7
18:13:38 нашли9
18:13:38 нашли5
18:13:38 нашли9
18:13:38 нашли5
18:13:38 1352 -затрачено мс