[ intro ]Совсем недавно я занялся автореггером, но меня остановила простая капча.. Новый алгоритом расшифровки писать было не охото. Я решил сделать всё гораздо проще. [ Приспособления ][1] => Капча [2] => Скрипт [3] => Руки [ Скрипт ]Возьмём простую капчу PHP: <?php $rand = rand(10000,99999); for($i = 0; $i < 5; $i++) { $arr[$i] = substr($rand, $i, 1); } $im = imagecreate(89,20); imagecolorallocate($im, 34, 34, 34); $a = 0; for($i = 0; $i < 5;$i++) { $color = imagecolorallocate($im, 255, 255, 255); imagestring($im, 3, $a += 14, 4, $arr[$i], $color); } header("Content-type: image/jpeg"); imagejpeg($im, '', 100); ?> (c) Isis Нам нужны будут отличительные особенности каждого символа, поэтому мы переводим картинку капчи в символы _ и #, используя такой код: PHP: <? $captcha_url = 'http://site/captcha.php'; // Урл капчи $a = 'img.jpg'; $f = fopen($a, 'w'); fwrite($f, file_get_contents($captcha_url)); fclose($f); ?> <img src="<?=$a?>"><br><br> <? $split = 14; //Расстояние от начала одного символа до начала другого (в пикселях) $i = imagecreatefromjpeg($a); $o = imagecreate(imagesx($i), imagesy($i)); for ($n = 0; $n < 256; $n++) { imagecolorallocate($o, $n, $n, $n); } imagecopy ($o, $i, 0, 0, 0, 0, imagesx ($i), imagesy ($i)); $lim = 256/2; $stroki = array(); for ($y = 0; $y < imagesy ($o); $y++) { $stroka = ''; for ($x = 0; $x < imagesx ($o); $x++) { if((imagecolorat($o, $x, $y) & 0xFF)>$lim) { $stroka .= "_"; } else { $stroka .= "#"; } } array_push($stroki, $stroka); } $array = array(); for($i = 0; $i < count($stroki); $i++) { array_push($array, array()); foreach(str_split($stroki[$i], $split) as $arr) { if(strlen($arr) == $split) { array_push($array[$i], $arr); } } } for($k = 0; $k < count($array[0]); $k++) { for($pict = '', $i = 0; $i<count($array); $i++) { $pict .= $array[$i][$k]."\n"; } echo(nl2br($pict."\n\n\n")); } ?> Как видно - изменять здесь нужно только 2 переменные: $captcha_url и $split. Теперь необходимо состаить функцию, которая определит, что это за символ. Как видно, первый символ - пустой, состоит из 20-ти таких строчек: Code: ############## Поэтому код будет выглядеть так: Code: if(substr_count($picture,"[COLOR=DeepSkyBlue]##############[/COLOR]") == [COLOR=DeepSkyBlue]20[/COLOR]){return [COLOR=DeepSkyBlue]NULL[/COLOR];} Займёмся цифрой 0 (да, да, и такая есть). Code: if(substr_count($picture, "[COLOR=DeepSkyBlue]___#__[/COLOR]") == [COLOR=DeepSkyBlue]1[/COLOR] ){return [COLOR=DeepSkyBlue]0[/COLOR];} Потому что у неё одной строка ___#__ встречается 1 раз. У цифры 1 - ##__########## повторяется 5 раз, поэтому и код будет таким Code: if(substr_count($picture, "[COLOR=DeepSkyBlue]##__##########[/COLOR]") == [COLOR=DeepSkyBlue]5[/COLOR]){return [COLOR=DeepSkyBlue]1[/COLOR];} И так далее к каждому символу свой код. И вот, у нас получилась функция для расшифровки капчи. Code: function what_pictured($picture) { if(substr_count($picture,"##############") == 20){return NULL;} elseif(substr_count($picture, "___#__") == 1 ){return 0;} elseif(substr_count($picture, "##__##########") == 5){return 1;} elseif(substr_count($picture, "#__###########") == 1){return 2;} elseif(substr_count($picture, "####__########") == 3 && substr_count($picture, "#____#########") == 3){return 3;} elseif(substr_count($picture, "#__#__########") == 1){return 4;} elseif(substr_count($picture, "####__########") == 2){return 5;} elseif(substr_count($picture, "#____#########\n__##__########\n__############") == 1){return 6;} elseif(substr_count($picture, "#__###########") == 2){return 7;} elseif(substr_count($picture, "__##__########") == 5){return 8;} else{return 9;} } Теперь просто-напросто добавляем в PHP скрипт выше эту функцию (в самый верх) и изменяем Code: echo([COLOR=YellowGreen]nl2br($pict."\n\n\n")[/COLOR]); на Code: echo([COLOR=YellowGreen]what_pictured($pict)[/COLOR]); [ Итог ]Подводя итог можно сказать, что этот метод не всегда точен и работает только на простых капчах, но он прост. Я думаю, каждый разберётся, что к чему. P.S. Получившийся код можете смотреть тут P.P.S. Обо всех ошибках прошу сообщать в этой теме или в личку.
NOmeR1, через час будет другая каптча и твоя статья будет неактуальная. Да и к тому же больше 5 человек вы не зарегите т.к. попадете в бан лист.. Удачи регерам
Isis, хоть скрипт будет не актуален, статья будет актуальна. Я ведь не специально для твоего сайта писал. Я просто привёл пример.