qrcode_server.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import json
  2. import base64
  3. from io import BytesIO
  4. from .bottle import request
  5. from ..mission.mission_qrcode import MissionQRCode
  6. # 从base64识别二维码图片。传入data指令字典 {"base64", "options"}
  7. # 返回字典 {"code", "data"}
  8. def base2text(data):
  9. base64 = data["base64"]
  10. opt = data.get("options", {})
  11. res = MissionQRCode.addMissionWait(opt, [{"base64": base64}])
  12. return res[0]["result"]
  13. # 从文本生成base64。传入data指令字典 {"text", "xxx"}
  14. # 返回 {"code", "data"}
  15. def text2base(data):
  16. text = data["text"]
  17. opt = data.get("options", {})
  18. format = opt.get("format", "QRCode")
  19. w = opt.get("w", 0)
  20. h = opt.get("h", 0)
  21. quiet_zone = opt.get("quiet_zone", -1)
  22. ec_level = opt.get("ec_level", -1)
  23. try:
  24. pil = MissionQRCode.createImage(text, format, w, h, quiet_zone, ec_level)
  25. buffered = BytesIO()
  26. pil.save(buffered, format="JPEG")
  27. b64 = base64.b64encode(buffered.getvalue()).decode("ascii")
  28. res = {"code": 100, "data": b64}
  29. except Exception as e:
  30. res = {"code": 200, "data": f"[Error] {str(e)}"}
  31. return res
  32. # 路由函数
  33. def init(UmiWeb):
  34. @UmiWeb.route("/api/qrcode", method="POST")
  35. def _qrcode():
  36. try:
  37. data = request.json
  38. except Exception as e:
  39. return json.dumps({"code": 800, "data": f"请求无法解析为json。"})
  40. if not data:
  41. return json.dumps({"code": 801, "data": f"请求为空。"})
  42. if "base64" in data:
  43. return json.dumps(base2text(data))
  44. elif "text" in data:
  45. return json.dumps(text2base(data))
  46. return json.dumps({"code": 802, "data": '指令中不存在 "base64" 或 "text"'})
  47. """
  48. // 文本 → 二维码base64
  49. const url = "http://127.0.0.1:1224/api/qrcode";
  50. const text = "测试文本";
  51. const data = {
  52. // 必填
  53. "text": text,
  54. // 选填
  55. "options": {
  56. "format": "QRCode", // 码类型
  57. "w": 0, // 图像宽度,0为自动设为最小宽度
  58. "h": 0, // 图像高度
  59. "quiet_zone": -1, // 码四周的空白边缘宽度,-1为自动
  60. "ec_level": -1, // 纠错等级,-1为自动
  61. }
  62. };
  63. fetch(url, {
  64. method: "POST",
  65. headers: {
  66. "Content-Type": "application/json"
  67. },
  68. body: JSON.stringify(data)
  69. })
  70. .then(response => response.json())
  71. .then(data => {
  72. if(data.code === 100) {
  73. console.log("生成二维码base64:", data.data);
  74. }
  75. else {
  76. console.log("生成二维码base64失败!错误码:", data.code, " 错误信息:", data.data);
  77. }
  78. })
  79. .catch(error => {
  80. console.error(error);
  81. });
  82. // 二维码base64 → 文本
  83. const url = "http://127.0.0.1:1224/api/qrcode";
  84. 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="
  85. const data = { "base64": base64 };
  86. fetch(url, {
  87. method: "POST",
  88. headers: {
  89. "Content-Type": "application/json"
  90. },
  91. body: JSON.stringify(data)
  92. })
  93. .then(response => response.json())
  94. .then(data => {
  95. if(data.code === 100) {
  96. console.log("识别二维码成功!图片中的二维码数量:", data.data.length);
  97. console.log("所有码的内容:");
  98. for (let d of data.data) {
  99. console.log(" 文本:", d.text);
  100. console.log(" 格式:", d.format);
  101. console.log(" 方向:", d.orientation);
  102. console.log(" ====");
  103. }
  104. }
  105. else {
  106. console.log("识别二维码失败!错误码:", data.code, " 错误信息:", data.data);
  107. }
  108. })
  109. .catch(error => {
  110. console.error(error);
  111. });
  112. """