const API = require("../../../lib/API.js") const db = require("../../../plugin/DataBase/db.js") const axios = require('axios') const { v4: uuidv4 } = require('uuid') const Redis = require('../../../plugin/DataBase/Redis') const config = require('../../../config.json') const { BaseStdResponse } = require("../../../BaseStdResponse.js") class BeginFaceReco extends API { constructor() { super() this.runpy = config.runpy this.setPath('/Face/BeginFaceReco') this.setMethod('POST') } /** * 获取图片并转换为Base64 * @param {string} url - 图片链接 * @returns {Promise} - Base64字符串 */ async getImageBase64(url) { try { const response = await axios.get(url, { proxy: false, responseType: "arraybuffer" }) const base64 = Buffer.from(response.data, "binary").toString("base64") // 获取图片MIME类型 const contentType = response.headers["content-type"] return `data:${contentType};base64,${base64}` } catch (error) { throw new Error(`获取图片失败: ${error.message}`) } } async onRequest(req, res) { let { student_num, name, captcha, id } = req.body if ([student_num, name, captcha, id].some(value => value === '' || value === null || value === undefined)) return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) try { const code = await Redis.get(`captcha:${id}`) if (!code || code != captcha.toLowerCase()) return res.json({ ...BaseStdResponse.ERR, msg: '验证码错误或已过期!' }) Redis.del(`captcha:${id}`); } catch (err) { this.logger.error(`验证图片验证码失败!${err.stack}`) return res.json({ ...BaseStdResponse.DATABASE_ERR, msg: '验证失败!' }) } try { let sql = 'SELECT student_num, name, user_avatar, academy_name FROM lepao_account WHERE student_num = ? AND name = ?' let rows = await db.query(sql, [student_num, name]) if (!rows) return res.json({ ...BaseStdResponse.DATABASE_ERR, msg: '获取用户人脸信息失败,请重试' }) if (rows.length !== 1) return res.json({ ...BaseStdResponse.ERR, msg: '该用户尚未在RunForge系统中添加,请先添加账号' }) const face_img = await this.getImageBase64('https://lepao-cloud.xxoo365.top/view.php/d0b85269c3683ed48da1fc5e468108c7.jpg') // 此时应该从乐跑获取人脸照片 const key = uuidv4() await Redis.set(`faceReco:${rows[0].student_num}`, key, { EX: 1800 }) let resData = { ...rows[0], key, face_img } res.json({ ...BaseStdResponse.OK, data: resData }) } catch (error) { this.logger.error(`获取用户人脸信息失败。${error.stack}`) return res.json({ ...BaseStdResponse.ERR, msg: '获取用户人脸信息失败,请重试' }) } } } module.exports.BeginFaceReco = BeginFaceReco