Авторские статьи Капчу вводить - не мешки ворочить!

Discussion in 'Статьи' started by NOmeR1, 27 Jan 2008.

  1. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    [ 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, $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. Обо всех ошибках прошу сообщать в этой теме или в личку.
     
    #1 NOmeR1, 27 Jan 2008
    Last edited: 27 Jan 2008
    7 people like this.
  2. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    там обычный rand() нанесеный на готовую картинку )) это капчта только формально.
     
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    NOmeR1, через час будет другая каптча и твоя статья будет неактуальная.

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

    DimOnOID Banned

    Joined:
    5 Dec 2006
    Messages:
    407
    Likes Received:
    126
    Reputations:
    4
    NOmeR1 Спс за скрипт..отличн!!
    Isis ну вот....... :mad: :mad:
     
  5. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Isis, хоть скрипт будет не актуален, статья будет актуальна. Я ведь не специально для твоего сайта писал. Я просто привёл пример.
     
    1 person likes this.
  6. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Усложнил чуть каптчу...
     
  7. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Это без прокси ;)
    Не бойся, прокси продаются :D
     
    1 person likes this.
  8. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Сделай для букв =)
     
  9. WAYS

    WAYS New Member

    Joined:
    12 Nov 2008
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Статья хорошая, но жаль что при смене цвета сразу перестает работать :(
     
  10. FallenLord

    FallenLord New Member

    Joined:
    23 Feb 2010
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    археолог. статье 2 года =\
     
  11. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    613
    Likes Received:
    229
    Reputations:
    69
    и за эти 2 года каптча притерпела очччень много изменений....