<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic CAPTCHA Generator</title>
<style>
.captcha-container {
display: flex;
align-items: center;
gap: 10px;
}
canvas {
border: 2px solid #ddd;
border-radius: 5px;
background-color: #f9f9f9;
}
.refresh-btn {
padding: 5px 10px;
border: none;
background-color: #4caf50;
color: white;
cursor: pointer;
border-radius: 5px;
transition: background-color 0.3s;
}
.refresh-btn:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="captcha-container">
<canvas id="captchaCanvas" width="150" height="50"></canvas>
<button class="refresh-btn" onclick="generateCaptcha()">Refresh</button>
</div>
<script>
function generateCaptcha() {
const canvas = document.getElementById('captchaCanvas');
const ctx = canvas.getContext('2d');
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
let captchaText = '';
// Generate random 6-character CAPTCHA
for (let i = 0; i < 6; i++) {
captchaText += chars.charAt(Math.floor(Math.random() * chars.length));
}
// Draw background
ctx.fillStyle = '#f9f9f9';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Add random lines for distortion
for (let i = 0; i < 5; i++) {
ctx.strokeStyle = `rgba(${Math.floor(Math.random() * 255)}, ${Math.floor(Math.random() * 255)}, ${Math.floor(Math.random() * 255)}, 0.7)`;
ctx.beginPath();
ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.stroke();
}
// Draw CAPTCHA text
ctx.font = '30px Arial';
ctx.fillStyle = '#333';
ctx.setTransform(1, Math.random() * 0.2, Math.random() * 0.2, 1, Math.random() * 5, Math.random() * 5);
ctx.fillText(captchaText, 25, 35);
ctx.setTransform(1, 0, 0, 1, 0, 0); // Reset transform
// Store CAPTCHA text for validation
document.getElementById('captchaCanvas').dataset.captcha = captchaText;
}
// Generate initial CAPTCHA on page load
window.onload = generateCaptcha;
</script>
</body>
</html>