Three captcha types
Click, rotate and slider interactions, with random switching plus configurable difficulty and tolerance.
Captcha / Poster / PHP + Rust
Three captcha types and fourteen poster elements, rendered in pure PHP, with one API across six frameworks.
poster-php puts click, rotate and slider verification and chained poster generation in one package. Images and answers are generated in PHP, with no third-party service.
Fourteen poster elements cover text, images, QR codes, tables, charts and calendars. Switch image drivers between GD and ImageMagick, and store captcha state in File, Session, Redis or PSR-16.
A mascot made of a poster body with captcha gear: a QR card in the left hand and a slider puzzle in the right.
Rendering and checks, both mine.Generate, verify and render in one package.
Click, rotate and slider interactions, with random switching plus configurable difficulty and tolerance.
Text, images, QR codes, tables, charts, calendars and more, layered in a chain.
A built-in Model 2 encoder supporting versions 1 to 40 and L/M/Q/H error correction.
JSON templates with variable substitution; builders can be exported and imported.
Laravel, ThinkPHP, Webman, Hyperf, Yii2 and Yii3 share the same core.
One-time checks, brute-force protection, expiry, session rate limits and optional trajectory checks.
Use the Rust implementation alongside the PHP package.
Captcha and posters for Rust
Brings three captcha types and fourteen poster elements to Rust, with a pure Rust image stack.
Every release maps to real commits.
Fixed alpha channels in Imagick masks and circular crops, and synced docs across 13 languages.
Added the jigsaw shape with random tabs on all four sides, sharing one outline for gap and piece.
Added adapters for both Yii frameworks, keeping core behavior consistent across six frameworks.
Landed native.php, a rewritten QR encoder, session rate limits and trajectory checks.
Click an image to enlarge.
Install it, then run a minimal example.
composer require erikwang2013/poster-php$result = captcha_create('click');
$pass = captcha_verify($result['key'], 'click', [[120, 80], [200, 150], [310, 95]]);
$builder = poster_create(750, 1334);
$builder->background('#FFFFFF');
$builder->addText('新品首发', ['x' => 80, 'y' => 120, 'size' => 48, 'color' => '#333333']);
$builder->save('/output/poster.jpg', 90);cargo add poster-rustuse poster::captcha::{Answer, CaptchaManager};
use poster::PosterBuilder;
let manager = CaptchaManager::new()?;
let result = manager.create(Some("click"))?.generate()?;
let pass = manager.verify(&result.key, Answer::Click(vec![(120.0, 80.0)]))?;
let mut builder = PosterBuilder::new()?;
builder.background("#FFFFFF");
builder.save("/output/poster.jpg", None)?;Hover and the mood changes.