fix: 1、合入OCR负载均衡的功能代码;2、新增接口用于OCR远程调用;

Description:

Log:
This commit is contained in:
mikigo 2024-05-13 18:30:12 +08:00
parent 4287642e95
commit 306f3891c0
1 changed files with 67 additions and 16 deletions

View File

@ -5,19 +5,13 @@
# pylint: disable=C0114
# pylint: disable=E0401,C0413,R0903,W0707,W0611
import random
import time
from pdocr_rpc import OCR as _OCR
from pdocr_rpc.conf import setting as ocr_setting
from setting import conf
ocr_setting.PORT = conf.OCR_PORT
ocr_setting.SERVER_IP = conf.OCR_SERVER_HOST
ocr_setting.NETWORK_RETRY = int(conf.OCR_NETWORK_RETRY)
ocr_setting.PAUSE = float(conf.OCR_PAUSE)
ocr_setting.TIMEOUT = float(conf.OCR_TIMEOUT)
ocr_setting.MAX_MATCH_NUMBER = int(conf.OCR_MAX_MATCH_NUMBER)
class OCRUtils:
ocr_setting.NETWORK_RETRY = int(conf.OCR_NETWORK_RETRY)
@ -46,8 +40,65 @@ class OCRUtils:
result = _OCR.ocr(*args, **kwargs)
return result
@classmethod
def ocr_remote(
cls,
target_strings: tuple = None,
picture_abspath: str = None,
similarity: [int, float] = 0.6,
return_default: bool = False,
return_first: bool = False,
lang: str = "ch",
network_retry: int = None,
pause: [int, float] = None,
timeout: [int, float] = None,
max_match_number: int = None,
):
servers = cls.ocr_servers
while servers:
ocr_setting.SERVER_IP = random.choice(servers)
if _OCR.check_connected() is False:
servers.remove(ocr_setting.SERVER_IP)
ocr_setting.SERVER_IP = None
else:
break
if ocr_setting.SERVER_IP is None:
raise EnvironmentError(f"所有OCR服务器不可用: {cls.ocr_servers}")
network_retry = network_retry if network_retry else ocr_setting.NETWORK_RETRY
pause = pause if pause else ocr_setting.PAUSE
timeout = timeout if timeout else ocr_setting.TIMEOUT
max_match_number = max_match_number if max_match_number else ocr_setting.MAX_MATCH_NUMBER
ignore_time = 0
start = time.time()
for _ in range(max_match_number):
end = time.time()
during = end - start - ignore_time
if during > timeout:
return False
_start = time.time()
res = _OCR._ocr(
*target_strings,
picture_abspath=picture_abspath,
similarity=similarity,
return_default=return_default,
return_first=return_first,
lang=lang,
network_retry=network_retry,
)
_end = time.time()
ignore_time += (_end - _start)
if res is False:
time.sleep(pause)
continue
return res
return False
@classmethod
def ocrx(cls, *args, **kwargs):
"""
支持链式调用
ocrx().click()
"""
cls.result = cls.ocr(*args, **kwargs)
if isinstance(cls.result, tuple):
cls.x, cls.y = cls.result
@ -55,39 +106,39 @@ class OCRUtils:
return cls.result
@classmethod
def click(cls):
from src.mouse_key import MouseKey
def check_xy(cls):
if cls.x is None and cls.y is None:
raise ValueError("ocr_pro 没有识别到")
@classmethod
def click(cls):
from src.mouse_key import MouseKey
cls.check_xy()
MouseKey.click(cls.x, cls.y)
return cls
@classmethod
def right_click(cls):
from src.mouse_key import MouseKey
if cls.x is None and cls.y is None:
raise ValueError("ocr_pro 没有识别到")
cls.check_xy()
MouseKey.right_click(cls.x, cls.y)
return cls
@classmethod
def double_click(cls):
from src.mouse_key import MouseKey
if cls.x is None and cls.y is None:
raise ValueError("ocr_pro 没有识别到")
cls.check_xy()
MouseKey.double_click(cls.x, cls.y)
return cls
@classmethod
def center(cls):
if cls.x is None and cls.y is None:
raise ValueError("ocr_pro 没有识别到")
cls.check_xy()
return cls.x, cls.y
@classmethod
def all_result(cls):
return cls.result
if __name__ == '__main__':
OCRUtils.ocrx().click()