captcha_interface.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import base64
  2. import json
  3. import logging
  4. import os
  5. import sys
  6. import time
  7. import traceback
  8. from glob import glob
  9. import cv2
  10. sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
  11. from flask import Flask, request
  12. from utils import request_post, bytes2np, np2bytes
  13. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  14. bdr_url = "http://127.0.0.1:17053/bdr"
  15. chd_url = "http://127.0.0.1:17054/chd"
  16. chr_url = "http://127.0.0.1:17055/chr"
  17. cho_url = "http://127.0.0.1:17056/cho"
  18. pzd_url = "http://127.0.0.1:17057/pzd"
  19. captcha_url = "http://127.0.0.1:17058/captcha"
  20. # 接口配置
  21. app = Flask(__name__)
  22. @app.route('/captcha', methods=['POST'])
  23. def captcha():
  24. start_time = time.time()
  25. logging.info("into captcha_interface captcha")
  26. try:
  27. # 接收网络数据
  28. if not request.form:
  29. logging.info("captcha no data!")
  30. return json.dumps({"success": False})
  31. base64_data = request.form.get("base64pic")
  32. base64_data2 = request.form.get("base64pic2")
  33. code = request.form.get("code")
  34. logging.info("captcha_interface get data time" + str(time.time()-start_time))
  35. if base64_data2 is None:
  36. result = get_captcha_result([base64_data], code)
  37. else:
  38. result = get_captcha_result([base64_data, base64_data2], code)
  39. return json.dumps({"predict": result, "success": True})
  40. except:
  41. traceback.print_exc()
  42. return json.dumps({"success": False})
  43. finally:
  44. logging.info("captcha interface finish time " + str(time.time()-start_time))
  45. def get_captcha_result(base64_list, code):
  46. """
  47. 验证码类型:
  48. 1: 拖拽还原拼图
  49. 2: 拖拽还原图片
  50. 3: 点击中文(带提示)
  51. 4: 点击中文(按语序)
  52. 5:
  53. :param base64_list: base64格式图片列表
  54. :param code: 验证码类型
  55. :return:
  56. """
  57. if code == 1:
  58. result = json.loads(request_post(pzd_url, prepare_data(base64_list[0], "pzd")))
  59. if result.get("success"):
  60. predict = result.get("data")
  61. return predict
  62. elif code == 2:
  63. result = json.loads(request_post(bdr_url, prepare_data(base64_list[0], "bdr")))
  64. if result.get("success"):
  65. predict = result.get("data")
  66. return predict
  67. elif code == 3:
  68. # detect tips
  69. result = json.loads(request_post(chd_url, prepare_data(base64_list[0], "chd2")))
  70. if result.get("success"):
  71. box_list_tips = result.get("data")
  72. else:
  73. return None
  74. # recognize tips
  75. result = json.loads(request_post(chr_url, prepare_data([base64_list[0], box_list_tips], "chr")))
  76. if result.get("success"):
  77. char_list_tips = result.get("data")
  78. else:
  79. return None
  80. if len(char_list_tips) != len(box_list_tips):
  81. return None
  82. # detect
  83. result = json.loads(request_post(chd_url, prepare_data(base64_list[1], "chd")))
  84. if result.get("success"):
  85. box_list = result.get("data")
  86. else:
  87. return None
  88. # recognize
  89. result = json.loads(request_post(chr_url, prepare_data([base64_list[1], box_list], "chr")))
  90. if result.get("success"):
  91. char_list = result.get("data")
  92. else:
  93. return None
  94. if len(char_list) != len(box_list):
  95. return None
  96. for c in char_list_tips:
  97. if c not in char_list:
  98. return None
  99. _dict = {char_list[i]: box_list[i] for i in range(len(box_list))}
  100. predict = [_dict.get(x) for x in char_list_tips]
  101. return predict
  102. elif code == 4:
  103. # detect
  104. result = json.loads(request_post(chd_url, prepare_data(base64_list[0], "chd")))
  105. if result.get("success"):
  106. box_list = result.get("data")
  107. else:
  108. return None
  109. # recognize
  110. result = json.loads(request_post(chr_url, prepare_data([base64_list[0], box_list], "chr")))
  111. if result.get("success"):
  112. char_list = result.get("data")
  113. else:
  114. return None
  115. if len(char_list) != len(box_list):
  116. return None
  117. # order
  118. result = json.loads(request_post(cho_url, prepare_data(char_list, "cho")))
  119. if result.get("success"):
  120. ordered_char_list = result.get("data")
  121. else:
  122. return None
  123. _dict = {char_list[i]: box_list[i] for i in range(len(box_list))}
  124. predict = [_dict.get(x) for x in ordered_char_list]
  125. return predict
  126. return None
  127. def prepare_data(data, _type):
  128. if _type in ['pzd', 'bdr', 'chd']:
  129. return {"data": data}
  130. elif _type in ['chd2']:
  131. return {"data": data, "tips": 1}
  132. elif _type in ['chr']:
  133. image_base64 = data[0]
  134. box_list = data[1]
  135. image_bytes = base64.b64decode(image_base64)
  136. image_np = bytes2np(image_bytes)
  137. str_list = []
  138. for box in box_list:
  139. file_bytes = np2bytes(image_np[box[1]:box[3], box[0]:box[2], :])
  140. file_base64 = base64.b64encode(file_bytes)
  141. file_str = file_base64.decode("utf-8")
  142. str_list.append(file_str)
  143. return {"data": json.dumps(str_list)}
  144. elif _type in ['cho']:
  145. return {"data": json.dumps(data)}
  146. else:
  147. raise
  148. def test_interface(from_remote=True):
  149. paths = glob("D:/Project/captcha/data/test/phrase_5.jpg")
  150. for file_path in paths:
  151. img_np = cv2.imread(file_path)
  152. file_bytes = np2bytes(img_np)
  153. file_base64 = base64.b64encode(file_bytes)
  154. if from_remote:
  155. file_json = {"base64pic": file_base64}
  156. result = json.loads(request_post(captcha_url, file_json))
  157. if result.get("success"):
  158. out_boxes = result.get("data")
  159. print("out_boxes", out_boxes)
  160. for box in out_boxes:
  161. cv2.rectangle(img_np, (box[0], box[1]), (box[2], box[3]), (0, 0, 255))
  162. cv2.imshow("img_np", img_np)
  163. cv2.waitKey(0)
  164. else:
  165. print("failed!")
  166. if __name__ == "__main__":
  167. app.run(host='127.0.0.1', port=17058, debug=False)
  168. # test_interface()