За последние 24 часа нас посетили 22012 программистов и 1103 робота. Сейчас ищут 762 программиста ...

Captcha (может кому и пригодится)

Тема в разделе "Решения, алгоритмы", создана пользователем Тигренок, 6 фев 2009.

  1. Тигренок

    Тигренок Активный пользователь

    С нами с:
    29 дек 2008
    Сообщения:
    133
    Симпатии:
    0
    Адрес:
    ты такой нарисовался?
    GB и немного OOP.

    все это хоязйство выводится так:
    <img src="captcha.php" />

    captcha.php
    PHP:
    1. <?  
    2.  
    3. # Тигренок, Алматы 2009.
    4.  
    5. $capt=new myCaptcha();
    6. $capt->new_captcha();
    7.  
    8. class myCaptcha
    9. {
    10. var $img_x          = 160;  # Ширина
    11. var $img_y          = 50;   # Высота
    12. var $num_n          = 5;    # Кол-во цифр
    13. var $font_min_size  = 12;   # Минимальный размер шрифта
    14. var $lines_n_max    = 8;    # Максимальное число шумовых линий
    15. var $nois_percent   = 4;    # Зашумленность цветами фона и текста, в процентах.
    16. var $angle_max      = 30;   # Максимальный угол отклонения от горизонтали по часовой стрелке и против.
    17. var $fonts_dir="ttf/";      # дирректория со шрифтами *.TTF можно заливать красивые (а главное понятные) шрифты
    18. var $back = array(255,255,240); # задний фон капчи
    19. var $colors=array(          # цвет символов
    20.        array(22,163,35),   # зеленый
    21.        array(214,36,7),    # красный
    22.        array(0,0,255),     # синий
    23. );
    24. var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';  
    25. # флаги эффектов, true - новый эффект, false - эффект спит. Поиграйте с различными комбинациями флагов. 9 вариантов.
    26. var $Nois=false;
    27. var $Line=false;        
    28. var $Blur=false;  
    29. var $mysession="captcha";  # на выходе - $captcha;
    30. var $number='';              # пустая переменная, в нее будет записыватся сгенерированная капча.
    31.  
    32.  function new_captcha() {
    33.   if(is_dir($this->fonts_dir)) { # не забудьте проставить chmod()
    34.   $dh=opendir($this->fonts_dir);
    35.  
    36.    while ($file = readdir($dh)) {
    37.    if($file != "." && $file != "..") {  # отсекаем текущий и родительский каталоги
    38.     $fonts[]=$file;
    39.    }
    40.    }
    41.  
    42.    $this->font=$this->fonts_dir.$fonts[rand(0,count($fonts)-1)];
    43.    closedir($dh);
    44.   } else {
    45.    die("Шрифты на родину верните. :)");
    46.   }    
    47.  
    48.  $this->handle=imagecreatetruecolor($this->img_x, $this->img_y);
    49.  $this->nois_color = imagecolorallocate($this->handle, 88, 59, 110);
    50.  $this->backHandle=imagecolorallocate($this->handle,
    51.      $this->back[0],
    52.      $this->back[1],
    53.      $this->back[2]
    54.    );
    55.  $color = $this->colors[mt_rand(0, sizeof($this->colors)-1)];
    56.  $this->FontColor = imagecolorallocate($this->handle, $color[0], $color[1], $color[2]);
    57.  imagefilledrectangle($this->handle, 0, 0, $this->img_x, $this->img_y, $this->backHandle);  
    58.  
    59.  #$number='';
    60. for ($n=0; $n < $this->num_n; $n++){
    61.     $num = $this->chars[rand(0, strlen($this->chars)-1)];
    62.     $this->number .= $num;    
    63.     $font_size=rand($this->font_min_size, $this->img_y/2);
    64.     $angle=rand(360-$this->angle_max,360+$this->angle_max);
    65.  
    66.     # вычисление координат для каждой цифры, что обеспечивают нормальное расположние
    67.    # при любых значениях размеров цифры и изображения
    68.    $y=rand(($this->img_y-$font_size)/4+$font_size, ($this->img_y-$font_size)/2+$font_size);
    69.     $x=rand(($this->img_x/$this->num_n-$font_size)/2, $this->img_x/$this->num_n-$font_size)+$n*$this->img_x/$this->num_n;
    70.    
    71.     imagettftext($this->handle, $font_size, $angle, $x, $y, $this->FontColor, $this->font, $num);
    72. }
    73.  # --- пошли эффекты ---
    74. # Шумовые пиксели
    75. if($this->Nois) {
    76.  $nois_n_pix=round($this->img_x*$this->img_y*$this->nois_percent/100);
    77.  for ($n=0; $n<$nois_n_pix; $n++){
    78.     $x=rand(0, $this->img_x);
    79.     $y=rand(0, $this->img_y);
    80.     imagesetpixel($this->handle, $x, $y, $this->nois_color);
    81.  }
    82.  for ($n=0; $n<$nois_n_pix; $n++){
    83.     $x=rand(0, $this->img_x);
    84.     $y=rand(0, $this->img_y);
    85.     imagesetpixel($this->handle, $x, $y, $this->backHandle);
    86.  };
    87. }
    88. # линии  
    89. if($this->Line){
    90.  $lines_n=rand(0,$this->lines_n_max);
    91.  for ($n=0; $n < $lines_n; $n++){
    92.      $x1=rand(0, $this->img_x);
    93.      $y1=rand(0, $this->img_y);
    94.      $x2=rand(0, $this->img_x);
    95.      $y2=rand(0, $this->img_y);
    96.      imageline($this->handle, $x1, $y1, $x2, $y2, $this->nois_color);
    97.  }
    98. }
    99. # Гауссовская размазка
    100. if($this->Blur){
    101.     imagefilter($this->handle, IMG_FILTER_GAUSSIAN_BLUR);
    102. }
    103.  
    104. Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    105. Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
    106. Header("Cache-Control: no-cache, must-revalidate");
    107. Header("Pragma: no-cache");
    108.  
    109. header("Content-type: image/png");
    110. imagepng($this->handle);
    111. imagedestroy($this->handle);
    112. $_SESSION[$this->mysession]=$this->number;
    113. }
    114. }
    115. ?>
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Хотя бы скриншот сюда запостил?
     
  3. Тигренок

    Тигренок Активный пользователь

    С нами с:
    29 дек 2008
    Сообщения:
    133
    Симпатии:
    0
    Адрес:
    ты такой нарисовался?
    хорошо, сейчас сделаю.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    А скриншот где? о_0
     
  5. Тигренок

    Тигренок Активный пользователь

    С нами с:
    29 дек 2008
    Сообщения:
    133
    Симпатии:
    0
    Адрес:
    ты такой нарисовался?
  6. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    Крэкеру подарок :D
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    sylex
    Ну мне нужно, чтобы был реальный сайт, где она стоит.

    А вообще, давно мечтаю тестировать каптчу на распознавание. Все руки никак не дойдут...
     
  8. Тигренок

    Тигренок Активный пользователь

    С нами с:
    29 дек 2008
    Сообщения:
    133
    Симпатии:
    0
    Адрес:
    ты такой нарисовался?
    почему подарок? для антикапчи?:)
     
  9. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    Kreker
    в известной программе для регистрации сайта по каталогам AllSubmitter есть анализ каптчи... процентов 50 точно угадывает верно, но это тока потому, что в основном везде они простые...

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