Nodejs PNG图片验证码生成 pure javascript no C/C++
Nodejs PNG图片验证码生成 pure javascript no C/C++
https://github.com/brighthas/validat-num-demo
群交流 244728015
Node.js PNG 图片验证码生成 (Pure JavaScript, No C/C++)
摘要
本文介绍如何使用纯JavaScript实现一个简单的PNG图片验证码生成器。我们将利用Node.js环境和一些现有的库来完成这项任务。
示例代码
首先,我们需要安装必要的依赖包。这里我们使用canvas
库来创建和处理图像,以及express
作为Web服务器。
npm install express canvas
接下来,创建一个基本的Express应用,并编写生成验证码的逻辑。
const express = require('express');
const { createCanvas, loadImage } = require('canvas');
const app = express();
const port = 3000;
app.get('/captcha', (req, res) => {
const width = 100;
const height = 40;
const canvas = createCanvas(width, height);
const ctx = canvas.getContext('2d');
// 设置背景颜色
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, width, height);
// 生成随机验证码字符串
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let captchaText = '';
for (let i = 0; i < 6; i++) {
captchaText += chars.charAt(Math.floor(Math.random() * chars.length));
}
// 设置字体样式
ctx.font = '24px Arial';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
// 随机旋转角度
const angle = Math.random() * 20 - 10;
// 绘制每个字符
for (let i = 0; i < captchaText.length; i++) {
ctx.save();
ctx.translate(10 + i * 15, height / 2);
ctx.rotate((Math.PI / 180) * angle);
ctx.fillStyle = `#${Math.floor(Math.random() * 16777215).toString(16)}`;
ctx.fillText(captchaText[i], 0, 0);
ctx.restore();
}
// 添加干扰线
for (let i = 0; i < 4; i++) {
ctx.beginPath();
ctx.moveTo(Math.random() * width, Math.random() * height);
ctx.lineTo(Math.random() * width, Math.random() * height);
ctx.strokeStyle = `#${Math.floor(Math.random() * 16777215).toString(16)}`;
ctx.stroke();
}
// 将canvas转换为Buffer对象
const buffer = canvas.toBuffer('image/png');
// 设置响应头并返回验证码图片
res.setHeader('Content-Type', 'image/png');
res.send(buffer);
});
app.listen(port, () => {
console.log(`Captcha server listening at http://localhost:${port}`);
});
解释
- 创建Canvas: 使用
createCanvas
函数创建一个指定宽度和高度的画布。 - 设置背景: 使用
fillStyle
和fillRect
方法设置画布背景色。 - 生成验证码文本: 随机生成一段由大写字母、小写字母和数字组成的验证码文本。
- 绘制文字: 使用
font
,textAlign
,textBaseline
属性设置字体样式,然后使用rotate
方法随机旋转每个字符的角度,并填充文字。 - 添加干扰线: 使用
beginPath
,moveTo
,lineTo
,stroke
等方法随机绘制几条干扰线。 - 输出验证码: 最后将画布转换为Buffer对象,并通过HTTP响应返回。
总结
通过上述步骤,我们可以使用纯JavaScript(借助canvas
库)在Node.js中生成PNG格式的验证码图片。这种方式无需依赖任何C/C++扩展,适合于需要快速实现验证码功能的项目。
顶一个!
https://github.com/brighthas/random-word
采用random-word替换原有生成
建议添加扭曲效果,另外字符间距需要完全取消。不然顶不住tesseract的OCR识别,挡不住bot
good idea! thx
要使用纯 JavaScript 在 Node.js 中生成 PNG 图片验证码,可以使用 canvas
库。该库允许你在 Node.js 环境中操作 Canvas,并生成图像。下面是一个简单的示例代码,展示如何生成一个包含随机数字的验证码图像。
示例代码
首先,你需要安装必要的依赖包:
npm install canvas
然后,你可以使用以下代码来生成验证码图像:
const { createCanvas, Image } = require('canvas');
const fs = require('fs');
function generateCaptcha() {
const captchaLength = 6;
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let captcha = '';
for (let i = 0; i < captchaLength; i++) {
captcha += chars.charAt(Math.floor(Math.random() * chars.length));
}
const canvas = createCanvas(200, 80);
const ctx = canvas.getContext('2d');
// 设置背景颜色
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 绘制干扰线
ctx.strokeStyle = '#ccc';
ctx.lineWidth = 2;
for (let i = 0; i < 5; i++) {
ctx.beginPath();
ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.stroke();
}
// 绘制文字
ctx.font = 'bold 48px Arial';
ctx.fillStyle = '#000';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(captcha, canvas.width / 2, canvas.height / 2);
// 将结果保存到文件
const out = fs.createWriteStream(__dirname + '/captcha.png');
const stream = canvas.createPNGStream();
stream.pipe(out);
return captcha;
}
const captchaCode = generateCaptcha();
console.log(`Generated captcha code: ${captchaCode}`);
解释
- 生成随机字符串:使用随机字符生成一个 6 位的验证码。
- 创建画布:使用
createCanvas
创建一个 200x80 像素的画布。 - 绘制背景:将画布背景设置为白色。
- 绘制干扰线:绘制一些随机的干扰线,以增加验证码的复杂性。
- 绘制验证码文字:使用指定字体和大小绘制验证码文本。
- 保存图像:将生成的图像保存到本地文件系统中。
运行代码
运行上述代码后,你会在当前目录下看到一个名为 captcha.png
的文件,该文件包含生成的验证码图像。同时,控制台会输出生成的验证码文本。
通过这种方式,你可以生成纯 JavaScript 实现的 PNG 图片验证码,而无需使用任何 C/C++ 编写的扩展库。