128 lines
4.8 KiB
Python
128 lines
4.8 KiB
Python
import json
|
||
import base64
|
||
from io import BytesIO
|
||
|
||
from .bottle import request
|
||
from ..mission.mission_qrcode import MissionQRCode
|
||
|
||
|
||
# 从base64识别二维码图片。传入data指令字典 {"base64", "options"}
|
||
# 返回字典 {"code", "data"}
|
||
def base2text(data):
|
||
base64 = data["base64"]
|
||
opt = data.get("options", {})
|
||
res = MissionQRCode.addMissionWait(opt, [{"base64": base64}])
|
||
return res[0]["result"]
|
||
|
||
|
||
# 从文本生成base64。传入data指令字典 {"text", "xxx"}
|
||
# 返回 {"code", "data"}
|
||
def text2base(data):
|
||
text = data["text"]
|
||
opt = data.get("options", {})
|
||
format = opt.get("format", "QRCode")
|
||
w = opt.get("w", 0)
|
||
h = opt.get("h", 0)
|
||
quiet_zone = opt.get("quiet_zone", -1)
|
||
ec_level = opt.get("ec_level", -1)
|
||
try:
|
||
pil = MissionQRCode.createImage(text, format, w, h, quiet_zone, ec_level)
|
||
buffered = BytesIO()
|
||
pil.save(buffered, format="JPEG")
|
||
b64 = base64.b64encode(buffered.getvalue()).decode("ascii")
|
||
res = {"code": 100, "data": b64}
|
||
except Exception as e:
|
||
res = {"code": 200, "data": f"[Error] {str(e)}"}
|
||
return res
|
||
|
||
|
||
# 路由函数
|
||
def init(UmiWeb):
|
||
|
||
@UmiWeb.route("/api/qrcode", method="POST")
|
||
def _qrcode():
|
||
try:
|
||
data = request.json
|
||
except Exception as e:
|
||
return json.dumps({"code": 800, "data": f"请求无法解析为json。"})
|
||
if not data:
|
||
return json.dumps({"code": 801, "data": f"请求为空。"})
|
||
|
||
if "base64" in data:
|
||
return json.dumps(base2text(data))
|
||
elif "text" in data:
|
||
return json.dumps(text2base(data))
|
||
return json.dumps({"code": 802, "data": '指令中不存在 "base64" 或 "text"'})
|
||
|
||
|
||
"""
|
||
// 文本 → 二维码base64
|
||
const url = "http://127.0.0.1:1224/api/qrcode";
|
||
const text = "测试文本";
|
||
const data = {
|
||
// 必填
|
||
"text": text,
|
||
// 选填
|
||
"options": {
|
||
"format": "QRCode", // 码类型
|
||
"w": 0, // 图像宽度,0为自动设为最小宽度
|
||
"h": 0, // 图像高度
|
||
"quiet_zone": -1, // 码四周的空白边缘宽度,-1为自动
|
||
"ec_level": -1, // 纠错等级,-1为自动
|
||
}
|
||
};
|
||
|
||
fetch(url, {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json"
|
||
},
|
||
body: JSON.stringify(data)
|
||
})
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if(data.code === 100) {
|
||
console.log("生成二维码base64:", data.data);
|
||
}
|
||
else {
|
||
console.log("生成二维码base64失败!错误码:", data.code, " 错误信息:", data.data);
|
||
}
|
||
})
|
||
.catch(error => {
|
||
console.error(error);
|
||
});
|
||
|
||
|
||
// 二维码base64 → 文本
|
||
const url = "http://127.0.0.1:1224/api/qrcode";
|
||
const base64 = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAdAB0BAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APU/GfjM+EjAzW9o0DW8txNPdXEkSxKkkMYAEcUjMS069hjBrn3+K0yi3B0/RozO52y3OtG3gaPy7WRWV5IVJO27DFSoIEbYycCrF18Sb2z1a20u70rTbO8uLiKzigutRl3NcNDBIyAxW7rhTcIu4sAcE8Cu00LU/wC2/D2mat5Pk/brSK58rdu2b0Dbc4GcZxnAri/iSdPGs6AuqySW+nzpcW11dg27xwIzQspkimikDIZUiG/5QhK5PzCuPI1qz8ISalajUtNu1czLGsxnt7tHhhhiijNmkSF22W8aFeFWZ2RjIjeVXvrq0t/EWmaTpq3d9rTXFpCqpa2iRW92sCJOUP2WZYjEsNszrG7Bd/GNhr2zQtP/ALI8PaZpuMfY7SK3x5nmY2IF+9tXd067Vz6DpXH/ABK1LVrN7SLTIr6622k159isYYnknkjuLVUI8yGXGzzWfhc5UHPFeeSyav4dtI9R8O+Ho5dYS4WNrSK1EV2sb29ncFJY7aOPzIkkYhjhSGaME7WdHy72y8NWthbfDxrrfDDdpdXH2eVvtIu/IcStcOUaCGFMqGKNKUELZDEsU+g/DUcMXhXSI7cRrAllCsYjIKhQgxgh3BGP9t/95upk1PQtH1vyv7W0qxv/ACc+X9rt0l2ZxnG4HGcDp6Co7Xw1oNiipaaJptuiPvVYbVEAbcjZGB13RxnPqin+EYksdC0fTIo4rDSrG0jjlM6JBbpGFkKlC4AHDFSVz1wcdKuQQQ2tvFb28UcMESBI441CqigYAAHAAHGK/9k="
|
||
const data = { "base64": base64 };
|
||
|
||
fetch(url, {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json"
|
||
},
|
||
body: JSON.stringify(data)
|
||
})
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if(data.code === 100) {
|
||
console.log("识别二维码成功!图片中的二维码数量:", data.data.length);
|
||
console.log("所有码的内容:");
|
||
for (let d of data.data) {
|
||
console.log(" 文本:", d.text);
|
||
console.log(" 格式:", d.format);
|
||
console.log(" 方向:", d.orientation);
|
||
console.log(" ====");
|
||
}
|
||
}
|
||
else {
|
||
console.log("识别二维码失败!错误码:", data.code, " 错误信息:", data.data);
|
||
}
|
||
})
|
||
.catch(error => {
|
||
console.error(error);
|
||
});
|
||
"""
|