diff --git a/easytrader/config/client.py b/easytrader/config/client.py index a028ecef..39cf8eba 100644 --- a/easytrader/config/client.py +++ b/easytrader/config/client.py @@ -181,7 +181,8 @@ class HTZQ(CommonConfig): class UNIVERSAL(CommonConfig): - DEFAULT_EXE_PATH = r"c:\\ths\\xiadan.exe" + # DEFAULT_EXE_PATH = r"c:\\ths\\xiadan.exe" + DEFAULT_EXE_PATH = r"C:\同花顺软件\同花顺\xiadan.exe" BALANCE_CONTROL_ID_GROUP = { "资金余额": 1012, diff --git a/easytrader/grid_strategies.py b/easytrader/grid_strategies.py index b294b967..717d92ea 100644 --- a/easytrader/grid_strategies.py +++ b/easytrader/grid_strategies.py @@ -6,12 +6,12 @@ from typing import TYPE_CHECKING, Dict, List, Optional import pandas as pd -import pywinauto.keyboard import pywinauto import pywinauto.clipboard +import pywinauto.keyboard from easytrader.log import logger -from easytrader.utils.captcha import captcha_recognize +from easytrader.utils.captcha import captcha_recognize, get_yzm_from_image from easytrader.utils.win_gui import SetForegroundWindow, ShowWindow, win32defines if TYPE_CHECKING: @@ -184,7 +184,17 @@ def get(self, control_id: int) -> List[Dict]: count = 10 while count > 0: if self._trader.is_exist_pop_dialog(): - break + # 这里有可能是要求输入验证码的弹窗 liudongming + image = self._trader.app.top_window().capture_as_image() + yzm = get_yzm_from_image(image) + if len(yzm) == 4: + # self._trader.app.top_window().print_control_identifiers() + self._trader.app.top_window().Edit.type_keys(yzm) + self._trader.app.top_window().type_keys("{ENTER}", set_foreground=False) + + grid.type_keys("^s", set_foreground=False) + else: + break self._trader.wait(0.2) count -= 1 diff --git a/easytrader/server.py b/easytrader/server.py index 02ce98d6..8a2b835e 100644 --- a/easytrader/server.py +++ b/easytrader/server.py @@ -32,6 +32,9 @@ def post_prepare(): user = api.use(json_data.pop("broker")) user.prepare(**json_data) + # AttributeError: 'RemoteClient' object has no attribute 'enable_type_keys_for_editor' + user.enable_type_keys_for_editor() + global_store["user"] = user return jsonify({"msg": "login success"}), 201 diff --git a/easytrader/universal_clienttrader.py b/easytrader/universal_clienttrader.py index afec1eae..3e19c0c6 100644 --- a/easytrader/universal_clienttrader.py +++ b/easytrader/universal_clienttrader.py @@ -30,7 +30,8 @@ def login(self, user, password, exe_path, comm_password=None, **kwargs): path=self._run_exe_path(exe_path), timeout=1 ) # pylint: disable=broad-except - except Exception: + except Exception as e: + print(e) self._app = pywinauto.Application().start(exe_path) # wait login window ready @@ -41,15 +42,18 @@ def login(self, user, password, exe_path, comm_password=None, **kwargs): except: self.wait(1) - self.wait(1) - self._app.window(handle=login_window).Edit1.set_focus() - self._app.window(handle=login_window).Edit1.type_keys(user) + try: # ldm + self.wait(1) + self._app.window(handle=login_window).Edit1.set_focus() + self._app.window(handle=login_window).Edit1.type_keys(user) - self._app.window(handle=login_window).button7.click() + self._app.window(handle=login_window).button7.click() - # detect login is success or not - # self._app.top_window().wait_not("exists", 100) - self.wait(5) + # detect login is success or not + # self._app.top_window().wait_not("exists", 100) + self.wait(5) + except Exception as e: + print(e) self._app = pywinauto.Application().connect( path=self._run_exe_path(exe_path), timeout=10 diff --git a/easytrader/utils/captcha.py b/easytrader/utils/captcha.py index cfbfc009..411e4c4a 100644 --- a/easytrader/utils/captcha.py +++ b/easytrader/utils/captcha.py @@ -101,3 +101,24 @@ def invoke_tesseract_to_recognize(img): ) valid_chars = re.findall("[0-9a-z]", res, re.IGNORECASE) return "".join(valid_chars) + + +def get_yzm_from_image(image: Image): + """ + liudongming + image是整个验证码弹窗的截图 + :param image: + :return: + """ + left = 188 + top = 89 + code = '' + rangle = (left, top, left + 71, top + 23) + try: + yzm = image.crop(rangle) + yzm.save(r'C:\yzm.jpg') + code = invoke_tesseract_to_recognize(r'C:\yzm.jpg') + print(f'验证码:{code}') + except Exception as e: + print(f'get_yzm_from_image 异常:{e}') + return code