Powered by Invision Power Board


  Reply to this topicStart new topicStart Poll

> Человек или спамробот?, Доработка img.php?code
DmitriK
  Отправлено: Dec 12 2009, 19:41 PM
Quote Post


Интересующийся
*

Группа: Members
Сообщений: 1
Пользователь №: 5530
Регистрация: 12-December 09

Рейтинг:
(0%) -----


Давно использую этот код для отправки сообщений с сайта спасибо авторам!
а сегодня перед вставкой кода на новый сайт переработал файлик img.php который рисует так называемую каптчу, вот делюсь:

CODE

<?php
$width = 90;  // Размер КАПТЧИ
$height = 25;
$complicacy=2;  // Сложность (0-6)
# ^ 0-четкая и простая, только для теста, легко разпознается;
# | 1-четкая, тест TTF шрифта, легко разпознается;
# | 2-размытая и волновая, самая комфортная для человека;
# | 3-Самое оно, не линейная, случайный наклон и размер цифр;
# | 4-усложняем Фоновым мусором, двойное размытие;
# | 5-больше активного мусора, 100% защиты но для человека сложно;
# | 6-CrAzYfOrAnTiCaPtChAtEsT!!!11
$red=255;   // Задаем цвет Фона белый
$green=255;
$blue=255;
$bred=0;   // Задаем цвет цифр черный
$bgreen=0;
$bblue=0;
$gred=100;   // Задаем цвет RGB мусора, должен быть близок к символам но не Факт
$ggreen=100;
$gblue=100;

#############################################CODE
$code = (eregi("^[0-9]+$",$_GET['code']))? $_GET['code']:"--";
$code_confirm = hexdec(md5(md5($code.$_SERVER['REMOTE_ADDR'])));
$code_confirm = substr($code_confirm,3,6);

$image = imagecreatetruecolor($width,$height);
$width = ImageSX($image);
$height = ImageSY($image);
// Делаем круче цвет
imagealphablending($image, true);

// Делаем цвет
$background_color = array($red, $green, $blue);
$foreground_color = array($bred, $bgreen, $bblue);
$white=imagecolorallocate($image, $red, $green, $blue);
$black=imagecolorallocate($image, $bred, $bgreen, $bblue);
$grey=imagecolorallocate($image, $gred, $ggreen, $gblue);

// Заливаем фон
imagefilledrectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $white);
if($complicacy>4){
// Нарисуем случайных линий (мусор темный)
for ($i=0;$i<2;$i++) {
$x1=mt_rand(0,$width/2-1);
$x2=mt_rand($width/2-1,$width-1);
$y1=mt_rand(0,$height-1);
$y2=mt_rand(0,$height-1);
imageline($image,$x1,$y1,$x2,$y2,$grey);
}
}

if($complicacy>5){
// Нарисуем горох
for ($i=0;$i<7;$i++) {
$x1=mt_rand(5,$width-5);
$x2=mt_rand(3,5);
$y1=mt_rand(5,$height-5);
$y2=mt_rand(3,5);
imageellipse($image,$x1,$y1,$x2,$y2,$black);
}
}

// Пишем код
if($complicacy==0){
$rndkof=mt_rand(-5,5);
// 1 вариант
imagestring($image,12,13+$rndkof,3, $code_confirm, $grey);
imagestring($image,12,12+$rndkof,2, $code_confirm, $foreground_color);
header("content-type: image/png");
imagepng($image);
imagedestroy($image);
die();
}
$rndttf=mt_rand(1,3);
$font = "data/ttf/".$rndttf.".ttf";
if($complicacy>0 && $complicacy<3){
// 2 вариант
imagettftext($image, 15, 0, 10+$rndkof, 20, $black, $font, $code_confirm);
}
if($complicacy>2){
// 3 вариант
for ($i=0;$i<6;$i++) {
imagettftext($image, 15+mt_rand(-3,1), mt_rand(-12,12), ($i*12)+10+$rndkof, 20, $black, $font, $code_confirm[$i]);
}
}

if($complicacy>1){
// Приготовились? Поехали! Искривлять
$x = ImageSX($image);
$y = ImageSY($image);
$center=$x/2;
$img2=imagecreatetruecolor(ImageSX($image), ImageSY($image));

// случайные параметры (можно поэкспериментировать с коэффициентами):
// частоты
$rand1=mt_rand(250000,1200000)/10000000;
$rand2=mt_rand(450000,1200000)/10000000;
$rand3=mt_rand(650000,1200000)/10000000;
$rand4=mt_rand(850000,1200000)/10000000;
// фазы
$rand5=mt_rand(0,3141592)/100000;
$rand6=mt_rand(0,3141592)/200000;
$rand7=mt_rand(0,3141592)/300000;
$rand8=mt_rand(0,3141592)/500000;
// амплитуды
$rand9=mt_rand(210,310)/110;
$rand10=mt_rand(210,310)/110;
// Сам процесс искривления
for($x=0;$x<ImageSX($image);$x++){
   for($y=0;$y<ImageSY($image);$y++){
       $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
       $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
       if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
           $color=255;
           $color_x=255;
           $color_y=255;
           $color_xy=255;
       }else{
           $color=imagecolorat($image, $sx, $sy) & 0xFF;
           $color_x=imagecolorat($image, $sx+1, $sy) & 0xFF;
           $color_y=imagecolorat($image, $sx, $sy+1) & 0xFF;
           $color_xy=imagecolorat($image, $sx+1, $sy+1) & 0xFF;
       }
       if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
           $newred=$foreground_color[0];
           $newgreen=$foreground_color[1];
           $newblue=$foreground_color[2];
       }else if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
           $newred=$background_color[0];
           $newgreen=$background_color[1];
           $newblue=$background_color[2];
       }else{
           $frsx=$sx-floor($sx);
           $frsy=$sy-floor($sy);
           $frsx1=1-$frsx;
           $frsy1=1-$frsy;
           $newcolor=(
               $color*$frsx1*$frsy1+
               $color_x*$frsx*$frsy1+
               $color_y*$frsx1*$frsy+
               $color_xy*$frsx*$frsy);
           if($newcolor>255) $newcolor=255;
           $newcolor=$newcolor/255;
           $newcolor0=1-$newcolor;
           $newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
           $newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
           $newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
       }
       imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
   }
}
}
if($complicacy==1) $img2=$image;
if($complicacy>3){
// Пост обработка
// Нарисуем случайных линий (мусор)
for ($i=0;$i<2;$i++) {
$x1=mt_rand(0,$width/2-1);
$x2=mt_rand($width/2-1,$width-1);
$y1=mt_rand(0,$height-1);
$y2=mt_rand(0,$height-1);
imageline($img2,$x1,$y1,$x2,$y2,imagecolorallocate($img2, $newred, $newgreen, $newblue));
}
}

if($complicacy>1){
// Размазываем, можно несколько раз
$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($img2, $gaussian, 16, 0);}
if($complicacy>3) imageconvolution($img2, $gaussian, 16, 0);
if($complicacy>5) imageconvolution($img2, $gaussian, 16, 0);
// Отображаем, рисуем то что вышло
header("content-type: image/png");
imagepng($img2);
imagedestroy($img2);
imagedestroy($image);
?>

вот такие КАПТЧИ рисует этот код. Мож кому и нужно.
средняя
user posted image
сложнее
user posted image
еще сложнее
user posted image
и т.д. см код
user posted image

ЗЫ: код можете переделывать как угодно!
ЗЫ2: Забыл! Для каптчи нужны TTF шрифты! которые лежат в папке DATA/TTF/*.TTF
тут использовано 3 шрифта имена у шрифтов рандомные 1,2 или 3! так что не забывайте!

Это сообщение отредактировал DmitriK - Dec 12 2009, 19:45 PM
PMEmail Poster
tsb
Отправлено: Dec 19 2009, 23:47 PM
Quote Post


Администратор
********

Группа: Admin
Сообщений: 8647
Пользователь №: 1
Регистрация: 14-August 04



Меня стандартный пока не подводил smile.gif


--------------------
PMEmail PosterUsers Website
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Topic Options Reply to this topicStart new topicStart Poll

 



[ Script Execution time: 0.1632 ]   [ 13 queries used ]   [ GZIP включён ]


A fatal MySQL error occured:

Duplicate entry '7394842' for key 1

INSERT INTO cns_log (date,ip,type,proxy,page,agent,referer,language,type1,uid,tid,hid,res,depth,cookie,country,city,title,isrobot,prevdate) VALUES ('2010-09-06 13:39:39','644595545',1,'-1','http%3A%2F%2Ftsbs.ru%2Fforum%2Findex.php%3Fshowtopic%3D7456','CCBot/1.0 (+http://www.commoncrawl.org/bot.html)','','en-us,en;q=0.5','1','1','0','1','0','0','0','21843','|','','user',-1)