diff --git a/apps/meters_to_ha/meters_to_ha.py b/apps/meters_to_ha/meters_to_ha.py index 9ed188d..a327fc2 100755 --- a/apps/meters_to_ha/meters_to_ha.py +++ b/apps/meters_to_ha/meters_to_ha.py @@ -58,10 +58,12 @@ LOGGER = logging.getLogger() HA_API_SENSOR_FORMAT = "/api/states/%s" +PARAM_NO_CAPTCHA = "nocaptcha" PARAM_2CAPTCHA_TOKEN = "2captcha_token" PARAM_CAPMONSTER_TOKEN = "capmonster_token" PARAM_CAPTCHAAI_TOKEN = "captchaai_token" CAPTCHA_TOKENS = ( + PARAM_NO_CAPTCHA, PARAM_CAPMONSTER_TOKEN, PARAM_2CAPTCHA_TOKEN, PARAM_CAPTCHAAI_TOKEN, @@ -476,6 +478,7 @@ def __init__( PARAM_TIMEOUT: "30", PARAM_DOWNLOAD_FOLDER: self.install_dir, PARAM_LOGS_FOLDER: self.install_dir, + PARAM_NO_CAPTCHA: PARAM_OPTIONAL_VALUE, PARAM_2CAPTCHA_TOKEN: PARAM_OPTIONAL_VALUE, PARAM_CAPMONSTER_TOKEN: PARAM_OPTIONAL_VALUE, PARAM_CAPTCHAAI_TOKEN: PARAM_OPTIONAL_VALUE, @@ -1089,6 +1092,13 @@ def resolve_captcha2(self) -> str | None: method = m break + if method == PARAM_NO_CAPTCHA and key: + self.mylog( + "Captcha resolution is disabled by config.", + st="WW", + ) + return method + if method is None: self.mylog( "Can not resolve using captcha service - " @@ -1749,24 +1759,14 @@ def get_gazpar_file(self): self.__browser.get(self.__class__.site_grdf_url) self.mylog(st="OK") - # Wait for Password ##### - self.mylog("Waiting for Password", end="") - - ep = EC.presence_of_element_located((By.ID, "pass")) - el_password = self.__wait.until( - ep, - message="failed, page timeout (timeout=" - + str(self.configuration[PARAM_TIMEOUT]) - + ")", - ) - self.mylog(st="OK") - # Wait for Email ##### self.mylog("Waiting for Email", end="") - ep = EC.presence_of_element_located((By.ID, "mail")) + ep = EC.presence_of_element_located( + (By.XPATH, r"//input[@name='identifier']") + ) el_email = self.__wait.until( ep, - message="failed, page timeout (timeout=" + message="failed to locate email field, page timeout (timeout=" + str(self.configuration[PARAM_TIMEOUT]) + ")", ) @@ -1778,6 +1778,33 @@ def get_gazpar_file(self): el_email.send_keys(self.configuration[PARAM_GRDF_LOGIN]) self.mylog(st="OK") + # Try to click Next button to enter password + try: + self.click_in_view( + By.XPATH, + r"//input[@value='Suivant']", + # wait_message="", + click_message="Click on connexion", + delay=random.uniform(1, 2), + ) + # Even if click succeeded, not always connected + except Exception: + pass + + # Wait for Password ##### + self.mylog("Waiting for Password", end="") + + ep = EC.presence_of_element_located( + (By.XPATH, r"//input[@name='credentials.passcode']") + ) + el_password = self.__wait.until( + ep, + message="failed, page timeout (timeout=" + + str(self.configuration[PARAM_TIMEOUT]) + + ")", + ) + self.mylog(st="OK") + # Type Password ##### self.mylog("Type Password", end="") el_password.send_keys(self.configuration[PARAM_GRDF_PASSWORD]) @@ -1790,12 +1817,12 @@ def get_gazpar_file(self): # Give the user some time to resolve the captcha # FEAT: Wait until it disappears, use 2captcha if configured - CONNEXION_XPATH = r"//input[@value='Connexion']" + CONNEXION_XPATH = r"//input[@value='Se Connecter']" self.mylog("Proceed with captcha resolution. ", end="~~") if self.resolve_captcha2() is not None: # Some time for captcha to remove. - self.mylog("Automatic resolution succeeded. ", end="~~") + self.mylog("Captcha resolution done. ", end="~~") time.sleep(2) else: # Manual