'; $svg .= ''; // 3–5 шумовых кривых (кубические Безье через всё поле). $curves = random_int(3, 5); for ($i = 0; $i < $curves; $i++) { $x1 = random_int(-10, 30); $y1 = random_int(0, 60); $x2 = random_int(60, 140); $y2 = random_int(0, 60); $x3 = random_int(170, 210); $y3 = random_int(0, 60); $color = $palette[random_int(0, count($palette) - 1)]; $width = random_int(1, 2); $svg .= ''; } // Glyph'ы: случайные поворот, сдвиг и размер каждого символа. for ($i = 0; $i < 5; $i++) { $x = 22 + $i * 36 + random_int(-4, 4); $y = random_int(34, 44); $angle = random_int(-25, 25); $size = random_int(26, 34); $color = $palette[random_int(0, count($palette) - 1)]; $svg .= '' . $code[$i] . ''; } $svg .= ''; header('Content-Type: image/svg+xml'); if (getenv('GOLEARN_TEST') === '1') { // Только тестовый режим: отладочная выдача кода smoke-тесту. header('X-Captcha-Debug: ' . $code); } echo $svg; } catch (Throwable $e) { error_log('captcha: ' . $e->getMessage()); error_out(500, 'internal'); }