Гайд - Создаем свою капчу на PHP | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Создаем свою капчу на PHP

u dont sure

Сеньор
Автор темы
7 Июл 2023
14
52
0
Часто в проектах требуется прикрепить капчу на различные формы. Предлагаю свой простой класс для работы с капчей, который позволяет сгенерировать проверочное изображение по заданным вами параметрам, а так же произвести проверку введенных данных.
Capcha Class:
class Captcha
{
    private
        $length = 5,
        $width  = 200,
        $height = 36,
        $letters = "0123456789",
        $fontsize = 20,
        $font = "ПутьДоШрифта",
        $noise = true;

    public function __construct($params = null)
    {
        if(is_array($params))
            foreach($params as $key=>$value)
                if(isset($this->$key)) $this->key = $value;
    }

    private function RandWord()
    {
        $word = "";
        for($i = 0; $i < $this->length; $i++)
            $word .= $this->letters[rand(0, strlen($this->letters) - 1)];
        return $word;
    }

    public function Get()
    {
        header('Content-type: image/png');
        $word = $this->RandWord();
        $image = imagecreatetruecolor($this->width, $this->height);
        imagesavealpha($image, true);
        $background = imagecolorallocatealpha($image, 0, 0, 0, 127);
        imagefill($image, 0, 0, $background);
        if($this->noise) $this->AddNoise($image);
        for($i = 0; $i < $this->length; $i++)
        {
            $x = ($this->width - 20) / $this->length * $i + 10; $x = rand($x, $x + 4);
            $y = $this->height - (($this->height - $this->fontsize) / 2);
            $color = imagecolorallocate($image, rand(0, 130), rand(0, 130), rand(0, 130));
            $angle = rand(-25, 25);
            imagettftext($image, $this->fontsize, $angle, $x, $y, $color, $this->font, $word[$i]);
        }
        $_SESSION['captcha'] = $word;
        imagepng($image);
        imagedestroy($image);
    }

    private function AddNoise($image)
    {
        for($i=0; $i<1000; $i++) {
            $color = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100));
            imagesetpixel($image, rand(0, $this->width), rand(0, $this->height), $color);
        }
        for($i = 0; $i < rand(2, 5); $i++)
        {
            $color = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100));
            imageline($image, 0, rand(0, $this->height), $this->width, rand(0, $this->height), $color);
        }
    }

    public static function Verify($captcha)
    {
        if(!isset($_SESSION['captcha'])) return false;
        return (strtolower($captcha) == strtolower($_SESSION['captcha']));
    }
    
}

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

Пример использования:


Пример использования:
# Создаем экземпляр класса, можно указать свои параметры
$captcha = new Captcha(["font"=>"FONT.ttf", "width"=>150, "height"=>40]);

# В нужном месте вашего скрипта выводим само изображение
# Капча храниться в массиве $_SESSION
$captcha->Get();

# Статическим методом Verify можем проверить правильность введеных данных
Captcha::Verify("Введенные пользователем символы");

Удачи :catlove
 
Like
  • 3
Реакции: 2 users
Активность:
Пока что здесь никого нет