
<?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;
}
парсер написать легко только потому что буквы тёмного цвета, слишком маленькая сумма R+G+B, но если буквально одну-две буквы пропускать и делать их под цвет фона, то парсер угадыватель капчи обосрётся и не разгадает ничего
дискасс
но если буквально одну-две буквы пропускать и делать их под цвет фона
А если кластеризовать цвета букв?
И вообще, если под картинку будет писаться парсер то почему тогда не закрашивать прямоугольной буквы в цвет этой буквы и только потом вести дальнейшую разработку?
Думаю что капча должна содержать междустроковый текст.
Например одному и тому же заданию "найди зелёное" может соответствовать такие варианты теста:
. Фотографии различных дебилок все зелённого цвета, но одна из них Грета Тумберг
. Фотографии разных протестов на одной из которых одна женщина обливает красной жидкостью другую женщину
. Куча чёрнобелых фотографий одна из которых Есентуки, Полюстрово и т.д. . Чёрнобелые фотографии автомашин одна из которых советские Жигули(зелёные машины популярны только в СССР) . Чёрнобелые фотографии разных агрегатов одна из которых фрезерный или токарный станок(в СССР их красили в зелёный цвет)Теже фотки станков могут быть в задании "найди красное" или "найди страшный предмет"
При этом если рядом со станком показана косоворотка то ответом на поиск красного становится она(ибо она красная сейчас)
парсерсу надо будет каждый font color= цвет смотреть, если светлый цвет, значит это фон, если тёмный, значит часть буквы. но какой буквы? глифы то тоже можно рисовать любые. а ещё одну-две буквы (кусочки начертания глифа) пропустить и сделать под цвет фона, и всё, и приехали.
не напишешь разгадыватель капчи.
ммм?
а если сначала произвести над изображением некие элементарные преобразования, типа заблюрить, то задача распознавания становится намного проще
но это не изображение, это буквы
значит, скриншот сначала с буков делаем, и дальше как обычно :)
точнее, рендерим буквы в картинку
раз-два-три, спуфингокапча поломайся! $ 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 принимает, надо подкрутить параметры где-то, дальше лень было
Это ничем не лучше обычной капчи, только шрифты вручную в код вбивать приходится вместо возможности использования тысяч готовых шрифтов.
я не хотел компилировать php gd библиотеку для работы с графикой, поэтому текстовая капча лучше тем, что
-
будет отображаться даже в консольных браузерах
-
не требует php gd
PHP GD обычно и так есть в phpinfo
Без обид. Вот опять ты хуйню сморозил. Пхпинфо это тупо встроенная функция, которая вываливает все, что есть в данной сборке пхп. А есть ли там искомые модули, зависит от того, как этот пхп был собран. И нынешний современный пхп еще более сегментирован на отдельные модули, чем старые версии. А что там и как у этого ниньзи спуфинга собрано – вообще, как обычно, черт ногу сломит.
-
[ message lost ]
[ message lost ]
[ message lost ]
[ message lost ]




