Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Капчу вводить - не мешки ворочить! (https://forum.antichat.xyz/showthread.php?t=60049)

NOmeR1 27.01.2008 14:24

Капчу вводить - не мешки ворочить!
 
[ intro ]
Совсем недавно я занялся автореггером, но меня остановила простая капча..
Новый алгоритом расшифровки писать было не охото. Я решил сделать всё гораздо проще.
[ Приспособления ]
[1] => Капча
[2] => Скрипт
[3] => Руки
[ Скрипт ]
Возьмём простую капчу

PHP код:

<?php
    $rand 
rand(10000,99999);
    for(
$i 0$i 5$i++)
    {
        
$arr[$i] = substr($rand$i1);
    }
    
$im imagecreate(89,20);
    
imagecolorallocate($im343434);
    
$a 0;
    for(
$i 0$i 5;$i++)
    {
        
$color imagecolorallocate($im255255255);
        
imagestring($im3$a += 144$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($ffile_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$i0000imagesx ($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-ти таких строчек:
Код:

##############
Поэтому код будет выглядеть так:
Код:

if(substr_count($picture,"##############") == 20){return NULL;}
Займёмся цифрой 0 (да, да, и такая есть).
Код:

if(substr_count($picture, "___#__") == 1 ){return 0;}
Потому что у неё одной строка ___#__ встречается 1 раз.

У цифры 1 - ##__########## повторяется 5 раз, поэтому и код будет таким
Код:

if(substr_count($picture, "##__##########") == 5){return 1;}
И так далее к каждому символу свой код.

И вот, у нас получилась функция для расшифровки капчи.
Код:

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 скрипт выше эту функцию (в самый верх) и изменяем
Код:

echo(nl2br($pict."\n\n\n"));
на
Код:

echo(what_pictured($pict));
[ Итог ]
Подводя итог можно сказать, что этот метод не всегда точен и работает только на простых капчах, но он прост. Я думаю, каждый разберётся, что к чему.

P.S. Получившийся код можете смотреть тут
P.P.S. Обо всех ошибках прошу сообщать в этой теме или в личку.

GreenBear 27.01.2008 18:34

там обычный rand() нанесеный на готовую картинку )) это капчта только формально.

Isis 27.01.2008 19:03

NOmeR1, через час будет другая каптча и твоя статья будет неактуальная.

Да и к тому же больше 5 человек вы не зарегите т.к. попадете в бан лист..
Удачи регерам

DimOnOID 27.01.2008 19:06

NOmeR1 Спс за скрипт..отличн!!
Isis ну вот....... :mad: :mad:

NOmeR1 27.01.2008 19:08

Isis, хоть скрипт будет не актуален, статья будет актуальна. Я ведь не специально для твоего сайта писал. Я просто привёл пример.

Isis 27.01.2008 19:13

Усложнил чуть каптчу...

Macro 27.01.2008 19:18

Цитата:

Сообщение от Isis
Да и к тому же больше 5 человек вы не зарегите т.к. попадете в бан лист..
Удачи регерам

Это без прокси ;)
Не бойся, прокси продаются :D

-Hormold- 02.02.2008 23:17

Сделай для букв =)


Время: 14:21