2023-06-26,遠大驗證碼自動重試
							parent
							
								
									69487b3fd5
								
							
						
					
					
						commit
						ab81a088ac
					
				| 
						 | 
					@ -53,7 +53,7 @@ import webbrowser
 | 
				
			||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
import itertools
 | 
					import itertools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONST_APP_VERSION = "MaxBot (2023.6.25)"
 | 
					CONST_APP_VERSION = "MaxBot (2023.6.26)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONST_MAXBOT_CONFIG_FILE = "settings.json"
 | 
					CONST_MAXBOT_CONFIG_FILE = "settings.json"
 | 
				
			||||||
CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
 | 
					CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
 | 
				
			||||||
| 
						 | 
					@ -10208,7 +10208,6 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    area_auto_select_mode = config_dict["area_auto_select"]["mode"]
 | 
					    area_auto_select_mode = config_dict["area_auto_select"]["mode"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_price_assign_by_bot = False
 | 
					 | 
				
			||||||
    is_need_refresh = False
 | 
					    is_need_refresh = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    matched_blocks = None
 | 
					    matched_blocks = None
 | 
				
			||||||
| 
						 | 
					@ -10216,7 +10215,7 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
    area_list = None
 | 
					    area_list = None
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        #print("try to find cityline area block")
 | 
					        #print("try to find cityline area block")
 | 
				
			||||||
        my_css_selector = "div.v-expansion-panels > div.v-expansion-panel"
 | 
					        my_css_selector = "div.rwd-margin > div.text-title"
 | 
				
			||||||
        area_list = driver.find_elements(By.CSS_SELECTOR, my_css_selector)
 | 
					        area_list = driver.find_elements(By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
    except Exception as exc:
 | 
					    except Exception as exc:
 | 
				
			||||||
        print("find .v-expansion-panel date list fail")
 | 
					        print("find .v-expansion-panel date list fail")
 | 
				
			||||||
| 
						 | 
					@ -10247,7 +10246,10 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
                    if row_text is None:
 | 
					                    if row_text is None:
 | 
				
			||||||
                        row_text = ""
 | 
					                        row_text = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if '剩餘:0' in row_text:
 | 
					                    if '剩餘 0' in row_text:
 | 
				
			||||||
 | 
					                        row_text = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if '已售完' in row_text:
 | 
				
			||||||
                        row_text = ""
 | 
					                        row_text = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if len(row_text) > 0:
 | 
					                    if len(row_text) > 0:
 | 
				
			||||||
| 
						 | 
					@ -10267,9 +10269,6 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
            print("area_list_count is None.")
 | 
					            print("area_list_count is None.")
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if is_price_assign_by_bot:
 | 
					 | 
				
			||||||
        formated_area_list = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if formated_area_list is not None:
 | 
					    if formated_area_list is not None:
 | 
				
			||||||
        area_list_count = len(formated_area_list)
 | 
					        area_list_count = len(formated_area_list)
 | 
				
			||||||
        if show_debug_message:
 | 
					        if show_debug_message:
 | 
				
			||||||
| 
						 | 
					@ -10346,23 +10345,8 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
            if show_debug_message:
 | 
					            if show_debug_message:
 | 
				
			||||||
                print("matched_blocks is empty, is_need_refresh")
 | 
					                print("matched_blocks is empty, is_need_refresh")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    is_price_assign_by_bot = False
 | 
				
			||||||
    if target_area is not None:
 | 
					    if target_area is not None:
 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            if target_area.is_enabled():
 | 
					 | 
				
			||||||
                target_area.click()
 | 
					 | 
				
			||||||
                is_price_assign_by_bot = True
 | 
					 | 
				
			||||||
        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_price_assign_by_bot = True
 | 
					 | 
				
			||||||
            except Exception as exc:
 | 
					 | 
				
			||||||
                pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if is_price_assign_by_bot:
 | 
					 | 
				
			||||||
        ticket_number_div = None
 | 
					        ticket_number_div = None
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            ticket_number_div = target_area.find_element(By.CSS_SELECTOR, 'div.count-button > div')
 | 
					            ticket_number_div = target_area.find_element(By.CSS_SELECTOR, 'div.count-button > div')
 | 
				
			||||||
| 
						 | 
					@ -10405,6 +10389,7 @@ def ticketplus_order_expansion_auto_select(driver, config_dict, area_keyword_ite
 | 
				
			||||||
                            try:
 | 
					                            try:
 | 
				
			||||||
                                if ticket_number_plus.is_enabled():
 | 
					                                if ticket_number_plus.is_enabled():
 | 
				
			||||||
                                    ticket_number_plus.click()
 | 
					                                    ticket_number_plus.click()
 | 
				
			||||||
 | 
					                                    is_price_assign_by_bot = True
 | 
				
			||||||
                                    time.sleep(0.1)
 | 
					                                    time.sleep(0.1)
 | 
				
			||||||
                            except Exception as exc:
 | 
					                            except Exception as exc:
 | 
				
			||||||
                                pass
 | 
					                                pass
 | 
				
			||||||
| 
						 | 
					@ -10459,7 +10444,7 @@ def ticketplus_order(driver, config_dict, ocr, Captcha_Browser):
 | 
				
			||||||
    next_step_button = None
 | 
					    next_step_button = None
 | 
				
			||||||
    is_button_disabled = False
 | 
					    is_button_disabled = False
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        my_css_selector = "div.order-footer > div.container > div.row > div > div.row > div > button.nextBtn"
 | 
					        my_css_selector = "div.order-footer > div.container > div.row > div > button.nextBtn"
 | 
				
			||||||
        next_step_button = driver.find_element(By.CSS_SELECTOR, my_css_selector)
 | 
					        next_step_button = driver.find_element(By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
        if not next_step_button is None:
 | 
					        if not next_step_button is None:
 | 
				
			||||||
            if not next_step_button.is_enabled():
 | 
					            if not next_step_button.is_enabled():
 | 
				
			||||||
| 
						 | 
					@ -10487,7 +10472,21 @@ def ticketplus_order_ocr(driver, config_dict, ocr, Captcha_Browser):
 | 
				
			||||||
        is_need_redo_ocr, previous_answer, is_form_sumbited = ticketplus_auto_ocr(driver, config_dict, ocr, previous_answer, Captcha_Browser)
 | 
					        is_need_redo_ocr, previous_answer, is_form_sumbited = ticketplus_auto_ocr(driver, config_dict, ocr, previous_answer, Captcha_Browser)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO: must ensure the answer is corrent...
 | 
					        # TODO: must ensure the answer is corrent...
 | 
				
			||||||
 | 
					        if is_form_sumbited:
 | 
				
			||||||
 | 
					            # re-new captcha, if message popup.
 | 
				
			||||||
 | 
					            is_messages_popup = False
 | 
				
			||||||
 | 
					            for double_check_message in range(5):
 | 
				
			||||||
 | 
					                is_messages_popup = ticketplus_check_and_renew_captcha(driver)
 | 
				
			||||||
 | 
					                if is_messages_popup:
 | 
				
			||||||
 | 
					                    break
 | 
				
			||||||
 | 
					                time.sleep(0.2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if not is_messages_popup:
 | 
				
			||||||
 | 
					                # still no error
 | 
				
			||||||
                is_cpatcha_sent = True
 | 
					                is_cpatcha_sent = True
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                is_form_sumbited = False
 | 
				
			||||||
 | 
					                is_need_redo_ocr = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if is_form_sumbited:
 | 
					        if is_form_sumbited:
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
| 
						 | 
					@ -10609,16 +10608,9 @@ svgToPng(svg, (imgData) => {
 | 
				
			||||||
                if previous_answer != ocr_answer:
 | 
					                if previous_answer != ocr_answer:
 | 
				
			||||||
                    previous_answer = ocr_answer
 | 
					                    previous_answer = ocr_answer
 | 
				
			||||||
                    print("refresh captcha...")
 | 
					                    print("refresh captcha...")
 | 
				
			||||||
                    refresh_btn = None
 | 
					                    my_css_selector = "div.recaptcha-area > div > div > span > i"
 | 
				
			||||||
                    try:
 | 
					                    is_refresh_button_pressed = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
                        my_css_selector = 'i.v-icon.mdi.mdi-refresh'
 | 
					                    time.sleep(0.4)
 | 
				
			||||||
                        refresh_btn = driver.find_element(By.CSS_SELECTOR, my_css_selector)
 | 
					 | 
				
			||||||
                        if not refresh_btn is None:
 | 
					 | 
				
			||||||
                            refresh_btn.click()
 | 
					 | 
				
			||||||
                            time.sleep(0.3)
 | 
					 | 
				
			||||||
                    except Exception as exc:
 | 
					 | 
				
			||||||
                        print("find refresh_btn fail")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        print("ocr_answer is None")
 | 
					        print("ocr_answer is None")
 | 
				
			||||||
        print("previous_answer:", previous_answer)
 | 
					        print("previous_answer:", previous_answer)
 | 
				
			||||||
| 
						 | 
					@ -10631,6 +10623,28 @@ svgToPng(svg, (imgData) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return is_need_redo_ocr, previous_answer, is_form_sumbited
 | 
					    return is_need_redo_ocr, previous_answer, is_form_sumbited
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def ticketplus_check_and_renew_captcha(driver):
 | 
				
			||||||
 | 
					    is_messages_popup = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    v_messages_div = None
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        my_css_selector = 'div.v-messages > div.v-messages__wrapper > div.v-messages__message'
 | 
				
			||||||
 | 
					        v_messages_div = driver.find_element(By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
 | 
					    except Exception as exc:
 | 
				
			||||||
 | 
					        print("find messages__message div fail")
 | 
				
			||||||
 | 
					    if v_messages_div is not None:
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            v_messages_string = v_messages_div.text
 | 
				
			||||||
 | 
					            if not v_messages_string is None:
 | 
				
			||||||
 | 
					                if len(v_messages_string) > 0:
 | 
				
			||||||
 | 
					                    is_messages_popup = True
 | 
				
			||||||
 | 
					                    print("error message popup, refresh captcha images.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    my_css_selector = "div.recaptcha-area > div > div > span > i"
 | 
				
			||||||
 | 
					                    is_refresh_button_pressed = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
 | 
					        except Exception as exc:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					    return is_messages_popup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
 | 
					def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
 | 
				
			||||||
    is_verifyCode_editing = False
 | 
					    is_verifyCode_editing = False
 | 
				
			||||||
| 
						 | 
					@ -10667,6 +10681,14 @@ def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
 | 
				
			||||||
                form_verifyCode = None
 | 
					                form_verifyCode = None
 | 
				
			||||||
                is_verifyCode_editing = True
 | 
					                is_verifyCode_editing = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # check wrong answer.
 | 
				
			||||||
 | 
					    if is_verifyCode_editing:
 | 
				
			||||||
 | 
					        # re-new captcha, if message popup.
 | 
				
			||||||
 | 
					        is_messages_popup = ticketplus_check_and_renew_captcha(driver)
 | 
				
			||||||
 | 
					        if is_messages_popup:
 | 
				
			||||||
 | 
					            is_verifyCode_editing = False
 | 
				
			||||||
 | 
					            is_form_sumbited = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if form_verifyCode is not None:
 | 
					    if form_verifyCode is not None:
 | 
				
			||||||
        if len(answer) > 0:
 | 
					        if len(answer) > 0:
 | 
				
			||||||
            answer=answer.upper()
 | 
					            answer=answer.upper()
 | 
				
			||||||
| 
						 | 
					@ -10690,9 +10712,12 @@ def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
 | 
				
			||||||
                    form_verifyCode.send_keys(answer)
 | 
					                    form_verifyCode.send_keys(answer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if auto_submit:
 | 
					                    if auto_submit:
 | 
				
			||||||
                        form_verifyCode.send_keys(Keys.ENTER)
 | 
					                        # ticketplus not able to send enter key.
 | 
				
			||||||
 | 
					                        #form_verifyCode.send_keys(Keys.ENTER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        my_css_selector = "div.order-footer > div.container > div.row > div > button.nextBtn"
 | 
				
			||||||
 | 
					                        is_form_sumbited = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
 | 
				
			||||||
                        is_verifyCode_editing = False
 | 
					                        is_verifyCode_editing = False
 | 
				
			||||||
                        is_form_sumbited = True
 | 
					 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        print("select all captcha text")
 | 
					                        print("select all captcha text")
 | 
				
			||||||
                        driver.execute_script("arguments[0].select();", form_verifyCode)
 | 
					                        driver.execute_script("arguments[0].select();", form_verifyCode)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue