Node.js识别验证码
前几天查成绩想要写一个程序自动查询,刚开始考虑无头浏览器+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);