<?php

echo '<body bgcolor="#aaa"><pre>';
captcha();
echo '</pre>';

function captcha() {
    $captcha_random = captcha_random_string();
    $captcha_glyphs = captcha_alpha_numeric();
    $captcha_inject = '01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%&?@';

    for ($i = 0; $i < 7; $i++) {
        for ($c = 0; $c < strlen($captcha_random); $c++) {
            $char = $captcha_random[$c];
            $char = $captcha_glyphs[$char];
            $char = $char[$i];
            $fill = array();
            for ($n = 0; $n < strlen($char); $n++) {
                $x = $char[$n];
                $r = $captcha_inject[rand(0, strlen($captcha_inject) - 1)];
                $hi_r = 16+rand()%50;
                $hi_g = 16+rand()%50;
                $hi_b = 16+rand()%50;
                $lo_r = 200+rand()%50;
                $lo_g = 200+rand()%50;
                $lo_b = 200+rand()%50;
                $hi = sprintf("%x%x%x", $hi_r, $hi_g, $hi_b);
                $lo = sprintf("%x%x%x", $lo_r, $lo_g, $lo_b);
                if ($x == '#') {
                    $x = "<font color=$hi><b>$r</b></font>";
                }
                else {
                    $x = "<font color=$lo><b>$r</b></font>";
                }
                $fill[] = $x;
            }
            echo implode($fill);
        }
        echo "\n";
    }
}

function captcha_random_string($length = 10) {

    $alphanumeric = '1457ACEFHIJKLMNPRTUVWXYZ';
    $randomstring = array();

    for ($i = $length; $i > 0; $i--) {
        $n = rand(0, 23);
        $randomstring[] = $alphanumeric[$n];
    }

    return implode($randomstring);

}

function captcha_alpha_numeric() {

    $alphanumeric = array(
        '1' => array(
            "   #    ",
            "  ##    ",
            " # #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            " #####  ",
        ),
        '4' => array(
            "#       ",
            "#    #  ",
            "#    #  ",
            "#    #  ",
            "####### ",
            "     #  ",
            "     #  ",
        ),
        '5' => array(
            "####### ",
            "#       ",
            "#       ",
            "######  ",
            "      # ",
            "#     # ",
            " #####  ",
        ),
        '7' => array(
            "####### ",
            "#    #  ",
            "    #   ",
            "   #    ",
            "  #     ",
            "  #     ",
            "  #     ",
        ),
        'A' => array(
            "   #    ",
            "  # #   ",
            " #   #  ",
            "#     # ",
            "####### ",
            "#     # ",
            "#     # ",
        ),
        'C' => array(
            " #####  ",
            "#     # ",
            "#       ",
            "#       ",
            "#       ",
            "#     # ",
            " #####  ",
        ),
        'E' => array(
            "####### ",
            "#       ",
            "#       ",
            "#####   ",
            "#       ",
            "#       ",
            "####### ",
        ),
        'F' => array(
            "####### ",
            "#       ",
            "#       ",
            "#####   ",
            "#       ",
            "#       ",
            "#       ",
        ),
        'H' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "####### ",
            "#     # ",
            "#     # ",
            "#     # ",
        ),
        'I' => array(
            "###     ",
            " #      ",
            " #      ",
            " #      ",
            " #      ",
            " #      ",
            "###     ",
        ),
        'J' => array(
            "      # ",
            "      # ",
            "      # ",
            "      # ",
            "#     # ",
            "#     # ",
            " #####  ",
        ),
        'K' => array(
            "#    #  ",
            "#   #   ",
            "#  #    ",
            "###     ",
            "#  #    ",
            "#   #   ",
            "#    #  ",
        ),
        'L' => array(
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "####### ",
        ),
        'M' => array(
            "#     # ",
            "##   ## ",
            "# # # # ",
            "#  #  # ",
            "#     # ",
            "#     # ",
            "#     # ",
        ),
        'N' => array(
            "#     # ",
            "##    # ",
            "# #   # ",
            "#  #  # ",
            "#   # # ",
            "#    ## ",
            "#     # ",
        ),
        'P' => array(
            "######  ",
            "#     # ",
            "#     # ",
            "######  ",
            "#       ",
            "#       ",
            "#       ",
        ),
        'R' => array(
            "######  ",
            "#     # ",
            "#     # ",
            "######  ",
            "#   #   ",
            "#    #  ",
            "#     # ",
        ),
        'T' => array(
            "####### ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
        ),
        'U' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            " #####  ",
        ),
        'V' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
        ),
        'W' => array(
            "#     # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            " ## ##  ",
        ),
        'X' => array(
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
            "  # #   ",
            " #   #  ",
            "#     # ",
        ),
        'Y' => array(
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
        ),
        'Z' => array(
            "####### ",
            "     #  ",
            "    #   ",
            "   #    ",
            "  #     ",
            " #      ",
            "####### ",
        ),
    );

    return $alphanumeric;

}
  • SpoofingOP
    link
    fedilink
    arrow-up
    0
    ·
    4 years ago

    парсер написать легко только потому что буквы тёмного цвета, слишком маленькая сумма R+G+B, но если буквально одну-две буквы пропускать и делать их под цвет фона, то парсер угадыватель капчи обосрётся и не разгадает ничего

    дискасс

    • torvn77
      link
      fedilink
      arrow-up
      0
      ·
      4 years ago

      но если буквально одну-две буквы пропускать и делать их под цвет фона

      А если кластеризовать цвета букв?

      И вообще, если под картинку будет писаться парсер то почему тогда не закрашивать прямоугольной буквы в цвет этой буквы и только потом вести дальнейшую разработку?

      • torvn77
        link
        fedilink
        arrow-up
        0
        ·
        edit-2
        4 years ago

        Думаю что капча должна содержать междустроковый текст.
        Например одному и тому же заданию "найди зелёное" может соответствовать такие варианты теста:
        . Фотографии различных дебилок все зелённого цвета, но одна из них Грета Тумберг
        . Фотографии разных протестов на одной из которых одна женщина обливает красной жидкостью другую женщину
        . Куча чёрнобелых фотографий одна из которых Есентуки, Полюстрово и т.д. . Чёрнобелые фотографии автомашин одна из которых советские Жигули(зелёные машины популярны только в СССР) . Чёрнобелые фотографии разных агрегатов одна из которых фрезерный или токарный станок(в СССР их красили в зелёный цвет)

        Теже фотки станков могут быть в задании "найди красное" или "найди страшный предмет"

        При этом если рядом со станком показана косоворотка то ответом на поиск красного становится она(ибо она красная сейчас)

  • SpoofingOP
    link
    fedilink
    arrow-up
    0
    ·
    4 years ago

    парсерсу надо будет каждый font color= цвет смотреть, если светлый цвет, значит это фон, если тёмный, значит часть буквы. но какой буквы? глифы то тоже можно рисовать любые. а ещё одну-две буквы (кусочки начертания глифа) пропустить и сделать под цвет фона, и всё, и приехали.

    не напишешь разгадыватель капчи.

    ммм?

    • Harald
      link
      fedilink
      arrow-up
      0
      ·
      4 years ago

      а если сначала произвести над изображением некие элементарные преобразования, типа заблюрить, то задача распознавания становится намного проще

      • SpoofingOP
        link
        fedilink
        arrow-up
        0
        ·
        4 years ago

        но это не изображение, это буквы

        • Harald
          link
          fedilink
          arrow-up
          0
          ·
          4 years ago

          значит, скриншот сначала с буков делаем, и дальше как обычно :)

          • Harald
            link
            fedilink
            arrow-up
            0
            ·
            4 years ago

            точнее, рендерим буквы в картинку

      • Harald
        link
        fedilink
        arrow-up
        0
        ·
        4 years ago

        раз-два-три, спуфингокапча поломайся! $ ffmpeg -i fsa9i5.png -vf “avgblur=sizeX=8,edgedetect=high=0.5:low=0.1:mode=colormix” -f mjpeg - | tesseract stdin stdout --psm 8 -l eng

        LTNUXTALKS) ну почти, I упорно за T принимает, надо подкрутить параметры где-то, дальше лень было

  • w
    link
    fedilink
    arrow-up
    0
    ·
    4 years ago

    Это ничем не лучше обычной капчи, только шрифты вручную в код вбивать приходится вместо возможности использования тысяч готовых шрифтов.

    • SpoofingOP
      link
      fedilink
      arrow-up
      0
      ·
      4 years ago

      я не хотел компилировать php gd библиотеку для работы с графикой, поэтому текстовая капча лучше тем, что

      1. будет отображаться даже в консольных браузерах

      2. не требует php gd

      • XoFfiCEr
        link
        fedilink
        arrow-up
        0
        ·
        4 years ago

        PHP GD обычно и так есть в phpinfo

        • deep-purple
          link
          fedilink
          arrow-up
          0
          ·
          4 years ago

          Без обид. Вот опять ты хуйню сморозил. Пхпинфо это тупо встроенная функция, которая вываливает все, что есть в данной сборке пхп. А есть ли там искомые модули, зависит от того, как этот пхп был собран. И нынешний современный пхп еще более сегментирован на отдельные модули, чем старые версии. А что там и как у этого ниньзи спуфинга собрано – вообще, как обычно, черт ногу сломит.