# Import FastAPI Libs from pydantic import BaseModel # Import Other Common Libs import json import base64 import os import requests # ------------------------------------------------ # Define constants # ------------------------------------------------ c_ret_code_success = 0 c_ret_code_error = 1 credential_file = '/home/oracle/python/apex/credential/credential.json' # env = 'aliyun_ecs' env = 'ctyun_ecs' # ------------------------------------------------ # Define OCR Request Service Request and Response # ------------------------------------------------ class ocr_req_basemodel(BaseModel): ocr_tool: str # Q: Qcloud, LP: Local PaddleOCR dir: str file_name: str class ocr_res_basemodel(BaseModel): result: int result_message: str detected_text: list # ------------------------------------------------ # Get credentials # ------------------------------------------------ def get_credentials(file: str, env: str) -> tuple: try: # Open and read the JSON file with open(file, "r") as credential_file: data = json.load(credential_file) # Access data from the JSON base_url = data['paddle'][env]['base_url'] client_id = data['paddle'][env]['client_id'] client_secret = data['paddle'][env]['client_secret'] return base_url, client_id, client_secret except Exception as e: print(e) return None, None, None # ------------------------------------------------ # Function of OCR request to Paddle OCR # ------------------------------------------------ def get_detected_text(ocr_req: ocr_req_basemodel) -> tuple: ret_code = c_ret_code_success err_msg = "" # ------------------------------------------------ # Get URL and credential # ------------------------------------------------ base_url, client_id, client_secret = get_credentials(credential_file, env); if base_url == None or client_id == None or client_secret == None: ret_code = c_ret_code_error err_msg = "Failed to get credential from file [" + credential_file + "] and env [" + env + "]" ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res # ------------------------------------------------ # Get Token # ------------------------------------------------ url = base_url + "/token" access_token = "" headers = { "Authorization": "Bearer " + access_token, "Content-type": "application/x-www-form-urlencoded" } req_body = "grant_type=&username={0}&password={1}".format(client_id, client_secret) try: response = requests.post( url = url, headers = headers, data = req_body, verify = False) response.raise_for_status response_dict = response.json() print(response.text) access_token = response_dict["access_token"] print(access_token) except requests.exceptions.HTTPError as httpError: print("httpError") print(httpError) ret_code = c_ret_code_error err_msg = "HTTP Error: Failed to get access token: " + str(httpError) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res except Exception as err: print("err") print(err) ret_code = c_ret_code_error err_msg = "Unexpected Error: Failed to get access token: " + str(err) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res # ------------------------------------------------ # Get Detected Text # ------------------------------------------------ url = base_url + "/paddleocr/read-image" # 打开文件 with open(os.path.normpath(os.path.join(ocr_req.dir, ocr_req.file_name)), "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') # print(encoded_string) headers = { "accept": "application/json", "Authorization": "Bearer " + access_token, "Content-Type": "application/json" } data = { "image_b64_string": encoded_string } json_data = json.dumps(data) try: response = requests.post( url = url, headers = headers, data = json_data, verify = False) response.raise_for_status response_dict = response.json() ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = response_dict ) return ocr_res except requests.exceptions.HTTPError as httpError: ret_code = c_ret_code_error err_msg = "HTTP Error: Failed to get detected text: " + str(httpError) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res except Exception as err: ret_code = c_ret_code_error if (response.text): err_msg = "Unexpected Error: Failed to get detected text: " + str(err) + ", " + response.text else: err_msg = "Unexpected Error: Failed to get detected text: " + str(err) ocr_res = ocr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = [] ) return ocr_res