likes
comments
collection
share

Node.js识别验证码

作者站长头像
站长
· 阅读数 41

前几天查成绩想要写一个程序自动查询,刚开始考虑无头浏览器+Chrome插件填充,但是云服务器没有GPU插件无法使用,所以选择使用其他插件解决问题。 现在在网上搜索Nodejs识别验证码都是推荐使用tesseract 但是没有经过训练的话非常的不准。本文推荐使用dddocr实现简单的验证码识别,简单使用的话无需训练不超过10行代码就上手使用。

项目地址https://github.com/sml2h3/ddddocr

这个项目的好处是不需要训练也可以解决大多数的验证码,同时支持数字英文、计算、滑动验证码,同时一键部署,而且可以使用插件生成验证码供插件训练,非常简单。

完整接口(普通+滑动)

from flask import Flask, request, jsonify
import ddddocr
import base64

app = Flask(__name__)

# 初始化识别器
common_ocr = ddddocr.DdddOcr(show_ad=False)
slide_detector = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)


def validate_image_base64(base64):
    """验证图片缓冲区有效性"""
    if not base64 or len(base64) < 100:  # 简单验证文件大小
        raise ValueError("Invalid image base64")


@app.route('/common', methods=['POST'])
def common_captcha():
    """普通验证码识别接口"""
    try:
        # 从 JSON 中获取 base64 参数
        data = request.get_json()
        if not data or 'base64' not in data:
            return jsonify({'error': 'Missing base64 parameter in JSON'}), 400

        # 解码 base64 图片数据
        image_base64 = base64.b64decode(data['base64'])

        # 验证缓冲区有效性
        validate_image_base64(image_base64)

        # 执行识别
        result = common_ocr.classification(image_base64)
        return jsonify({'captcha_text': result}), 200

    except Exception as e:
        return jsonify({'error': str(e)}), 500


@app.route('/slide', methods=['POST'])
def slide_captcha():
    """滑动验证码识别接口"""
    try:
        # 从 JSON 中获取 base64 参数
        data = request.get_json()
        if not data or 'bg_base64' not in data or 'gap_base64' not in data:
            return jsonify({'error': 'Missing bg_base64 or gap_base64 parameter in JSON'}), 400

        # 解码 base64 图片数据
        bg_bytes = base64.b64decode(data['bg_base64'])
        gap_bytes = base64.b64decode(data['gap_base64'])

        # 验证缓冲区有效性
        validate_image_base64(bg_bytes)
        validate_image_base64(gap_bytes)

        # 执行滑动匹配
        result = slide_detector.slide_match(gap_bytes, bg_bytes, simple_target=True)
        return jsonify({
            'offset_x': result['target'][0],
            'track': generate_slide_track(result['target'][0])
        }), 200

    except Exception as e:
        return jsonify({'error': str(e)}), 500


def generate_slide_track(offset_x):
    """生成模拟滑动轨迹(带随机抖动)"""
    return [{
        'x': offset_x + int((offset_x * 0.02) * (0.5 - (i / 100))),
        'y': int(5 * (0.5 - (i / 100))),
        'time': i * 10
    } for i in range(1, 101)]


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=4455)

测试:

const axios = require("axios");
const fs = require("fs");

// 读取图片并编码为 base64
const bgBase64 = fs.readFileSync("bg.png").toString("base64");
const gapBase64 = fs.readFileSync("gap.png").toString("base64");

// 发送 JSON 请求
axios
  .post("http://localhost:4455/slide", {
    bg_base64: bgBase64,
    gap_base64: gapBase64,
  })
  .then(res => {
    console.log(res.data);
  })
  .catch(err => {
    console.error(err.response.data);
  });

const axios = require("axios");
const fs = require("fs");

// 读取图片并编码为 base64
const imageBase64 = fs.readFileSync("getVerify.jpg").toString("base64");

// 发送 JSON 请求
axios
  .post("http://localhost:4455/common", {
    base64: imageBase64,
  })
  .then(res => {
    console.log(res.data);
  })
  .catch(err => {
    console.error(err.response.data);
  });

Demo Python:

可以考虑使用ddddocr-fastapi或者自己复制代码运行

我也不会Py用大模型生成的代码

运行安装依赖 pip install flask ddddocr

from flask import Flask, request, jsonify
import ddddocr
import io

app = Flask(__name__)

# 初始化 ddddocr
ocr = ddddocr.DdddOcr(show_ad=False)

@app.route('/', methods=['POST'])
def recognize_captcha():
    # 检查是否有文件上传
    if 'file' not in request.files:
        return jsonify({'error': 'No file uploaded'}), 400

    file = request.files['file']

    # 检查文件是否为空
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400

    # 读取图片文件
    try:
        image_bytes = file.read()
        # 使用 ddddocr 识别验证码
        captcha_text = ocr.classification(image_bytes)
        return jsonify({'captcha_text': captcha_text}), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=4455)

滑动验证码Py Demo

import ddddocr

det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)

with open('缺口.png', 'rb') as f:
    target_bytes = f.read()

with open('背景.png', 'rb') as f:
    background_bytes = f.read()

res = det.slide_match(target_bytes, background_bytes, simple_target=True)
print(res) #{'target_y': 0, 'target': [142, 0, 207, 170]}

Node.js Demo

https://github.com/rhy3h/ddddocr-node Nodejs版本使用此插件实现

在函数的使用上和Py版本无异

yarn add ddddocr-node

const { DdddOcr } = require('ddddocr-node');

const ddddOcr = new DdddOcr();

const result = await ddddOcr.classification('example.jpg');
console.log(result);
评论
请登录