ocr_script.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. # -*- coding: utf-8 -*-
  2. import base64
  3. from PIL import Image
  4. import ddddocr
  5. import json
  6. from http.server import BaseHTTPRequestHandler, HTTPServer
  7. import requests
  8. import ssl
  9. from urllib.parse import urlencode
  10. ssl._create_default_https_context = ssl._create_unverified_context
  11. class MyRequestHandler(BaseHTTPRequestHandler):
  12. def do_GET(self):
  13. self.send_response(200)
  14. self.send_header('Content-type', 'text/html')
  15. self.end_headers()
  16. self.wfile.write(b"Hello, this is a GET response!")
  17. def do_POST(self):
  18. content_length = int(self.headers['Content-Length'])
  19. post_data = self.rfile.read(content_length)
  20. try:
  21. data = json.loads(post_data.decode('utf-8'))
  22. print(data)
  23. cmd = data.get('cmd')
  24. print(cmd)
  25. if cmd == "ocr":
  26. base64_image_data = data.get('base64_image_data') # 确保键名与发送的数据匹配
  27. if not base64_image_data:
  28. raise ValueError("Missing 'base64_image_data' in JSON payload")
  29. print("This is OCR command.")
  30. ocr(base64_image_data,self)
  31. elif cmd == "create_link":
  32. name = data.get('name')
  33. bookId = data.get('bookId')
  34. topUpTemplateId = data.get('topUpTemplateId')
  35. passBackTemplateId = data.get('passBackTemplateId')
  36. paidPoint = data.get('paidPoint')
  37. token = data.get('token')
  38. create_link(name,bookId,topUpTemplateId,passBackTemplateId,paidPoint,token,self)
  39. print("Command is empty.")
  40. elif cmd == "chapterSpread":
  41. if not all(k in data for k in ['cbid', 'OPENSESSID']):
  42. raise ValueError("Missing required parameters for chapterSpread")
  43. response = {
  44. "message": "Data received successfully",
  45. "received_data": temp_chapterSparead(data),
  46. }
  47. # chapterSpread(data)
  48. response_str = json.dumps(response)
  49. self.send_response(200)
  50. self.send_header('Content-type', 'application/json')
  51. self.end_headers()
  52. self.wfile.write(response_str.encode('utf-8'))
  53. elif cmd == "get_fq_book":
  54. key = data.get('key')
  55. response = {
  56. "message": "Data received successfully",
  57. "received_data": getFqBook(key,None),
  58. }
  59. response_str = json.dumps(response)
  60. self.send_response(200)
  61. self.send_header('Content-type', 'application/json')
  62. self.end_headers()
  63. self.wfile.write(response_str.encode('utf-8'))
  64. elif cmd == "get_gap":
  65. base64_image_data1 = data.get('base64_image_data1')
  66. base64_image_data0 = data.get('base64_image_data0')
  67. if not base64_image_data1:
  68. raise ValueError("Missing 'base64_image_data1' in JSON payload")
  69. if not base64_image_data0:
  70. raise ValueError("Missing 'base64_image_data0' in JSON payload")
  71. print("This is get_gap command.")
  72. response = {
  73. "message": "Data received successfully",
  74. "received_data": get_gap(key,None),
  75. }
  76. response_str = json.dumps(response)
  77. self.send_response(200)
  78. self.send_header('Content-type', 'application/json')
  79. self.end_headers()
  80. self.wfile.write(response_str.encode('utf-8'))
  81. else:
  82. self.send_response(200)
  83. self.send_header('Content-type', 'application/json')
  84. self.end_headers()
  85. self.wfile.write("not func")
  86. print("Unknown command.")
  87. except json.JSONDecodeError:
  88. self.send_error(400, "Invalid JSON data")
  89. except (ValueError, base64.binascii.Error, IOError) as e:
  90. self.send_error(400, f"Invalid base64 image data: {str(e)}")
  91. except Exception as e:
  92. self.send_error(500, f"Internal server error: {str(e)}")
  93. def ocr(base64_image_data,server):
  94. image_data = base64.b64decode(base64_image_data)
  95. image = Image.open(io.BytesIO(image_data)) # 直接在内存中处理图像
  96. ocr = ddddocr.DdddOcr()
  97. result = ocr.classification(image)
  98. response = {
  99. "message": "Data received successfully",
  100. "received_data": result,
  101. }
  102. response_str = json.dumps(response)
  103. server.send_response(200)
  104. server.send_header('Content-type', 'application/json')
  105. server.end_headers()
  106. server.wfile.write(response_str.encode('utf-8'))
  107. def create_link(name,bookId,topUpTemplateId,passBackTemplateId,paidPoint,token,server):
  108. url = "https://ms.zhangwenpindu.cn/manage/distribution/createLink"
  109. data = {
  110. "name": name,
  111. "bookId": bookId,
  112. "passBackTemplateId": passBackTemplateId,#"5", 回传规则
  113. "adPassbackTemplateId": "",
  114. "topUpTemplateId": topUpTemplateId, #充值
  115. "mediaChannel": "1", #媒体渠道
  116. "group": "35", #合作站点
  117. "paidPoint": paidPoint,#"", #卡点收费
  118. "site": "5" #推广平台
  119. }
  120. headers['Authorization']=f'Bearer {token}'
  121. res = requests.post(url, headers=headers, data=data).json()
  122. # f'{"=" * 40}\n'
  123. # f'原始ID:{res.get("data").get("originalId")}\n'
  124. # f'小程序ID:{res.get("data").get("appId")}\n'
  125. # f'小程序启动页面:{res.get("data").get("launchPath")}\n'
  126. # f'小程序启动参数:{res.get("data").get("launchParam")}\n'
  127. # f'跳转路径参数:{res.get("data").get("fullPath")}\n'
  128. # f'微信站外链接:{res.get("data").get("wxMountLink")}\n'
  129. # f'{"=" * 40}\n',
  130. response = {
  131. "message": "create_link successfully",
  132. "received_data":{"originalId":res.get("data").get("originalId"),
  133. "appId":res.get("data").get("appId"),
  134. "launchPath":res.get("data").get("launchPath"),
  135. "fullPath":res.get("data").get("fullPath"),
  136. "wxMountLink":res.get("data").get("wxMountLink")}
  137. }
  138. response_str = json.dumps(response)
  139. server.send_response(200)
  140. server.send_header('Content-type', 'application/json')
  141. server.end_headers()
  142. server.wfile.write(response_str.encode('utf-8'))
  143. # print(res)
  144. print(data)
  145. def run(server_class=HTTPServer, handler_class=MyRequestHandler, port=8080):
  146. server_address = ('', port)
  147. httpd = server_class(server_address, handler_class)
  148. print(f"Serving on port {port}")
  149. httpd.serve_forever()
  150. headers_str = '''
  151. Accept: application/json, text/plain, */*
  152. Accept-Language: zh-CN,zh;q=0.9
  153. Cache-Control: no-cache
  154. Connection: keep-alive
  155. Content-Type: application/x-www-form-urlencoded
  156. Origin: https://manage.zhangwenpindu.cn
  157. Pragma: no-cache
  158. Referer: https://manage.zhangwenpindu.cn/
  159. Sec-Fetch-Dest: empty
  160. Sec-Fetch-Mode: cors
  161. Sec-Fetch-Site: same-site
  162. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
  163. sec-ch-ua: "Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"
  164. sec-ch-ua-mobile: ?0
  165. sec-ch-ua-platform: "Windows"
  166. '''
  167. headers = dict(
  168. [[y.strip() for y in x.strip().split(':', 1)] for x in headers_str.strip().split('\n') if x.strip()])
  169. def getFqBook( key,post_data=None):
  170. return {
  171. 'header': '',
  172. 'body': '',
  173. 'http_code': 0
  174. }
  175. def temp_chapterSparead(data):
  176. cookies = {
  177. 'Hm_lvt_990f9ab9737a266517417cc2949bb3f4': '1736394515',
  178. 'csrfToken': 'vN8OkvTZZfzerTHhodh7rc81',
  179. 'OPENSESSID': data['OPENSESSID'],
  180. 'yw_open_token': '6785d8c2ec046',
  181. 'is_read_notice': '6785d8c2ec046',
  182. 'sidebarStatus': '0',
  183. }
  184. print(cookies)
  185. headers = {
  186. 'authority': 'open.yuewen.com',
  187. 'accept': 'application/json, text/plain, */*',
  188. 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  189. 'priority': 'u=1, i',
  190. 'referer': 'https://open.yuewen.com/new/library',
  191. 'sec-ch-ua': '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
  192. 'sec-ch-ua-mobile': '?0',
  193. 'sec-ch-ua-platform': '"Windows"',
  194. 'sec-fetch-dest': 'empty',
  195. 'sec-fetch-mode': 'cors',
  196. 'sec-fetch-site': 'same-origin',
  197. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
  198. }
  199. url = 'https://open.yuewen.com/api/wechatspread/chapterSpread'
  200. params = {
  201. 'cbid': data['cbid']
  202. }
  203. print(params)
  204. response = requests.get(url, params=params, cookies=cookies, headers=headers)
  205. return response.json()
  206. def get_gap(target_img:bytes, background_img:bytes):
  207. det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
  208. res = det.slide_match(target_img, background_img,simple_target=True)
  209. print(res)
  210. return res["target"][0]
  211. if __name__ == "__main__":
  212. import io # 确保导入了 io 模块以处理内存中的图像
  213. run(port=8080)