Nodejs PNG图片验证码生成 pure javascript no C/C++

Nodejs PNG图片验证码生成 pure javascript no C/C++

https://github.com/brighthas/validat-num-demo

群交流 244728015

demo


7 回复

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}`);
});

解释

  1. 创建Canvas: 使用createCanvas函数创建一个指定宽度和高度的画布。
  2. 设置背景: 使用fillStylefillRect方法设置画布背景色。
  3. 生成验证码文本: 随机生成一段由大写字母、小写字母和数字组成的验证码文本。
  4. 绘制文字: 使用font, textAlign, textBaseline属性设置字体样式,然后使用rotate方法随机旋转每个字符的角度,并填充文字。
  5. 添加干扰线: 使用beginPath, moveTo, lineTo, stroke等方法随机绘制几条干扰线。
  6. 输出验证码: 最后将画布转换为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}`);

解释

  1. 生成随机字符串:使用随机字符生成一个 6 位的验证码。
  2. 创建画布:使用 createCanvas 创建一个 200x80 像素的画布。
  3. 绘制背景:将画布背景设置为白色。
  4. 绘制干扰线:绘制一些随机的干扰线,以增加验证码的复杂性。
  5. 绘制验证码文字:使用指定字体和大小绘制验证码文本。
  6. 保存图像:将生成的图像保存到本地文件系统中。

运行代码

运行上述代码后,你会在当前目录下看到一个名为 captcha.png 的文件,该文件包含生成的验证码图像。同时,控制台会输出生成的验证码文本。

通过这种方式,你可以生成纯 JavaScript 实现的 PNG 图片验证码,而无需使用任何 C/C++ 编写的扩展库。

回到顶部