From 9e7b2104a76efad6c9ea73f15ed5981e21427148 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 27 Jun 2023 18:34:50 +0800 Subject: [PATCH] hkticketing support use local dictionary to input credit card info --- chrome_tixcraft.py | 205 +++++++++++++++++++++++++++++++-------------- 1 file changed, 141 insertions(+), 64 deletions(-) diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py index f35f7fd..843b49d 100644 --- a/chrome_tixcraft.py +++ b/chrome_tixcraft.py @@ -53,7 +53,7 @@ import webbrowser import argparse import itertools -CONST_APP_VERSION = "MaxBot (2023.6.24)" +CONST_APP_VERSION = "MaxBot (2023.6.25)" CONST_MAXBOT_CONFIG_FILE = "settings.json" CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt" @@ -8114,10 +8114,19 @@ def hkticketing_date_buy_button_press(driver): ''' return is_date_submiting -def hkticketing_date_auto_select(driver, auto_select_mode, date_keyword, auto_reload_coming_soon_page_enable): +def hkticketing_date_assign(driver, config_dict): show_debug_message = True # debug. show_debug_message = False # online + if config_dict["advanced"]["verbose"]: + show_debug_message = True + + auto_select_mode = config_dict["tixcraft"]["date_auto_select"]["mode"] + date_keyword = config_dict["tixcraft"]["date_auto_select"]["date_keyword"].strip() + + if show_debug_message: + print("date_keyword:", date_keyword) + matched_blocks = None # clean stop word. @@ -8314,47 +8323,113 @@ def hkticketing_date_auto_select(driver, auto_select_mode, date_keyword, auto_re except Exception as exc: print("click target_area link fail") print(exc) - # use plan B - ''' - try: - print("force to click by js.") - driver.execute_script("arguments[0].click();", target_area) - is_date_assigned = True - except Exception as exc: - pass - ''' - # alway, auto submit - is_date_submiting = False - el_btn = None + return is_date_assigned, is_page_ready, formated_area_list + +def hkticketing_date_password_input(driver, config_dict, fail_list): + show_debug_message = True # debug. + show_debug_message = False # online + + if config_dict["advanced"]["verbose"]: + show_debug_message = True + + is_password_appear = False + + el_password_input = None try: - my_css_selector = "#buyButton > input" - el_btn = driver.find_element(By.CSS_SELECTOR, my_css_selector) + my_css_selector = "#entitlementPassword > div > div > div > div > input[type='password']" + el_password_input = driver.find_element(By.CSS_SELECTOR, my_css_selector) except Exception as exc: pass - - if el_btn is not None: + + inputed_value = "" + if el_password_input is not None: try: - if el_btn.is_enabled() and el_btn.is_displayed(): - el_btn.click() - print("buy button pressed.") - is_date_submiting = True + inputed_value = el_password_input.get_attribute('value') except Exception as exc: + print("get_attribute value fail") pass - # use plan B - ''' - try: - print("force to click by js.") - driver.execute_script("arguments[0].click();", el_btn) - ret = True - except Exception as exc: - pass - ''' - else: - if auto_reload_coming_soon_page_enable: - # auto refresh for date list page. - is_need_refresh = True + if not inputed_value is None: + is_password_appear = True + if inputed_value == "": + # only this case to auto-fill local dictional value. + local_array = [] + user_guess_string = config_dict["advanced"]["user_guess_string"] + if len(user_guess_string) > 0: + user_guess_string = format_config_keyword_for_json(user_guess_string) + try: + local_array = json.loads("["+ user_guess_string +"]") + except Exception as exc: + local_array = [] + answer_list = local_array + inferred_answer_string = "" + for answer_item in answer_list: + if not answer_item in fail_list: + inferred_answer_string = answer_item + break + + if len(inferred_answer_string) > 0: + try: + el_password_input.click() + el_password_input.send_keys(inferred_answer_string) + el_password_input.send_keys(Keys.ENTER) + + print("input dictionary answer:", inferred_answer_string) + fail_list.append(inferred_answer_string) + except Exception as exc: + print("set_attribute value fail") + pass + + return is_password_appear, fail_list + +def hkticketing_date_auto_select(driver, config_dict, fail_list): + show_debug_message = True # debug. + show_debug_message = False # online + + if config_dict["advanced"]["verbose"]: + show_debug_message = True + + #PS: some blocks are generate by ajax, not appear at first time. + formated_area_list = None + is_page_ready = True + is_date_assigned, is_page_ready, formated_area_list = hkticketing_date_assign(driver, config_dict) + + # NOT alway, auto submit + is_date_submiting = False + + is_auto_submit = True + is_password_sent = False + is_password_appear, fail_list = hkticketing_date_password_input(driver, config_dict, fail_list) + if is_password_appear: + is_auto_submit = False + + if show_debug_message: + print("is_auto_submit:", is_auto_submit) + + el_btn = None + if is_auto_submit: + is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '#buyButton > input') + if show_debug_message: + print("is_button_clicked:", is_button_clicked) + + auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"] + if show_debug_message: + print("is_password_appear:", is_password_appear) + print("is_date_assigned:", is_date_assigned) + print("is_page_ready:", is_page_ready) + print("formated_area_list:", formated_area_list) + print("auto_reload_coming_soon_page_enable:", auto_reload_coming_soon_page_enable) + + if auto_reload_coming_soon_page_enable: + # auto refresh for date list page. + is_need_refresh = True + + if is_need_refresh: + if is_password_appear: + is_need_refresh = False + + if is_need_refresh: if is_date_assigned: # if select box assign. is_need_refresh = False @@ -8364,35 +8439,34 @@ def hkticketing_date_auto_select(driver, auto_select_mode, date_keyword, auto_re # option waiting to assign at next loop. is_need_refresh = False - # due to select option not generated by server side. - if is_need_refresh: - if not is_page_ready: - is_need_refresh = False + # due to select option not generated by server side. + if is_need_refresh: + if not is_page_ready: + is_need_refresh = False - if is_need_refresh: - try: - print("is_need_refresh...") - driver.refresh() - time.sleep(0.3) - except Exception as exc: - pass + # check next button exist. + if is_need_refresh: + el_btn = None + try: + my_css_selector = "#buyButton > input" + el_btn = driver.find_element(By.CSS_SELECTOR, my_css_selector) + except Exception as exc: + pass + if el_btn is not None: + if show_debug_message: + print("next button appear.") + is_need_refresh = False - return is_date_submiting + # finally... + if is_need_refresh: + try: + print("is_need_refresh...") + driver.refresh() + time.sleep(0.2) + except Exception as exc: + pass -def hkticketing_show(driver, config_dict): - show_debug_message = True # debug. - show_debug_message = False # online - - date_auto_select_mode = config_dict["tixcraft"]["date_auto_select"]["mode"] - date_keyword = config_dict["tixcraft"]["date_auto_select"]["date_keyword"].strip() - auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"] - - if show_debug_message: - print("date_keyword:", date_keyword) - print("auto_reload_coming_soon_page_enable:", auto_reload_coming_soon_page_enable) - is_date_submiting = hkticketing_date_auto_select(driver, date_auto_select_mode, date_keyword, auto_reload_coming_soon_page_enable) - - return is_date_submiting + return is_date_submiting, fail_list def hkticketing_area_auto_select(driver, config_dict, area_keyword_item): show_debug_message = True # debug. @@ -8898,7 +8972,7 @@ def hkticketing_travel_iframe(driver, config_dict): iframe_url = "" try: iframe_url = str(iframe.get_attribute('src')) - print("url:", iframe_url) + #print("url:", iframe_url) except Exception as exc: print("get iframe url fail.") #print(exc) @@ -8906,7 +8980,7 @@ def hkticketing_travel_iframe(driver, config_dict): idx_iframe += 1 try: - print("switch to #", idx_iframe, ":", iframe_url) + #print("switch to #", idx_iframe, ":", iframe_url) driver.switch_to.frame(iframe) is_redirected = hkticketing_content_refresh(driver, iframe_url, config_dict) except Exception as exc: @@ -8966,13 +9040,14 @@ def hkticketing_main(driver, url, config_dict, hkticketing_dict): if is_event_page: if config_dict["tixcraft"]["date_auto_select"]["enable"]: if not hkticketing_dict["is_date_submiting"]: - hkticketing_dict["is_date_submiting"] = hkticketing_show(driver, config_dict) + hkticketing_dict["is_date_submiting"], hkticketing_dict["fail_list"] = hkticketing_date_auto_select(driver, config_dict, hkticketing_dict["fail_list"]) pass else: #print('double check buy button status.') hkticketing_date_buy_button_press(driver) else: hkticketing_dict["is_date_submiting"] = False + hkticketing_dict["fail_list"] = [] # https://premier.hkticketing.com/events/XXX/venues/KSH/performances/XXX/tickets if '/events/' in url and '/performances/' in url: @@ -10695,6 +10770,8 @@ def main(args): hkticketing_dict = {} hkticketing_dict["is_date_submiting"] = False + hkticketing_dict["fail_list"]=[] + ocr = None Captcha_Browser = None