diff --git a/NonBrowser.py b/NonBrowser.py index fb069db..6149e8f 100644 --- a/NonBrowser.py +++ b/NonBrowser.py @@ -19,6 +19,9 @@ class NonBrowser(): ret = True return ret + def Get_cookies(self): + return self.Session.cookies.get_dict() + def set_headers(self, header:str): self.Session.headers = header diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py index 7b60a24..5c0c40e 100644 --- a/chrome_tixcraft.py +++ b/chrome_tixcraft.py @@ -41,7 +41,7 @@ try: except Exception as exc: pass -CONST_APP_VERSION = "MaxBot (2024.01.11)" +CONST_APP_VERSION = "MaxBot (2024.01.12)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -807,8 +807,8 @@ def close_browser_tabs(driver): pass def get_driver_by_config(config_dict): - global driver - + driver = None + # read config. homepage = config_dict["homepage"] @@ -7432,7 +7432,10 @@ def set_non_browser_cookies(driver, url, Captcha_Browser): domain_name = url.split('/')[2] #PS: need set cookies once, if user change domain. if not Captcha_Browser is None: - Captcha_Browser.Set_cookies(driver.get_cookies()) + try: + Captcha_Browser.Set_cookies(driver.get_cookies()) + except Exception as e: + pass Captcha_Browser.Set_Domain(domain_name) def ticketmaster_parse_zone_info(driver, config_dict): @@ -12309,7 +12312,7 @@ def get_current_url(driver): for each_error_string in exit_bot_error_strings: if isinstance(str_exc, str): if each_error_string in str_exc: - print('quit bot by error:', each_error_string) + print('quit bot by error:', each_error_string, driver) is_quit_bot = True driver.quit() sys.exit() @@ -12320,6 +12323,21 @@ def get_current_url(driver): return url, is_quit_bot +def reset_webdriver(driver, config_dict, url): + new_driver = None + try: + cookies = driver.get_cookies() + driver.close() + config_dict["homepage"]=url + new_driver = get_driver_by_config(config_dict) + for cookie in cookies: + new_driver.add_cookie(cookie); + new_driver.get(url) + driver = new_driver + except Exception as e: + pass + return new_driver + def main(args): config_dict = get_config_dict(args) @@ -12377,13 +12395,13 @@ def main(args): if config_dict["ocr_captcha"]["enable"]: ocr = ddddocr.DdddOcr(show_ad=False, beta=config_dict["ocr_captcha"]["beta"]) Captcha_Browser = NonBrowser() - if len(config_dict["advanced"]["tixcraft_sid"]) > 1: set_non_browser_cookies(driver, config_dict["homepage"], Captcha_Browser) except Exception as exc: print(exc) pass + maxbot_last_reset_time = time.time() while True: time.sleep(0.05) @@ -12417,10 +12435,16 @@ def main(args): if is_maxbot_paused: if 'kktix.c' in url: kktix_dict = kktix_paused_main(driver, url, config_dict, kktix_dict) - + # sleep more when paused. time.sleep(0.1) continue + if config_dict["advanced"]["reset_browser_interval"] > 0: + maxbot_running_time = time.time() - maxbot_last_reset_time + if maxbot_running_time > config_dict["advanced"]["reset_browser_interval"]: + driver = reset_webdriver(driver, config_dict, url) + maxbot_last_reset_time = time.time() + tixcraft_family = False if 'tixcraft.com' in url: tixcraft_family = True diff --git a/config_launcher.py b/config_launcher.py index d284779..b8170d4 100644 --- a/config_launcher.py +++ b/config_launcher.py @@ -22,7 +22,7 @@ import sys import threading import webbrowser -CONST_APP_VERSION = "MaxBot (2024.01.11)" +CONST_APP_VERSION = "MaxBot (2024.01.12)" CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json" CONST_MAXBOT_CONFIG_FILE = "settings.json" diff --git a/settings.json b/settings.json index e985cac..5a81c74 100644 --- a/settings.json +++ b/settings.json @@ -65,6 +65,7 @@ "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, + "reset_browser_interval": 0.0, "proxy_server_port": "" } } \ No newline at end of file diff --git a/settings.py b/settings.py index 103e098..d033883 100644 --- a/settings.py +++ b/settings.py @@ -39,7 +39,7 @@ try: except Exception as exc: pass -CONST_APP_VERSION = "MaxBot (2024.01.11)" +CONST_APP_VERSION = "MaxBot (2024.01.12)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -133,6 +133,7 @@ def load_translate(): en_us["pass_date_is_sold_out"] = 'Pass date is sold out' en_us["auto_reload_coming_soon_page"] = 'Reload coming soon page' en_us["auto_reload_page_interval"] = 'Reload page interval(sec.)' + en_us["reset_browser_interval"] = 'Reset browser interval(sec.)' en_us["proxy_server_port"] = 'Proxy IP:PORT' en_us["area_select_order"] = 'Area select order' @@ -240,6 +241,7 @@ def load_translate(): zh_tw["pass_date_is_sold_out"] = '避開「搶購一空」的日期' zh_tw["auto_reload_coming_soon_page"] = '自動刷新倒數中的日期頁面' zh_tw["auto_reload_page_interval"] = '自動刷新頁面間隔(秒)' + zh_tw["reset_browser_interval"] = '重新啟動瀏覽器間隔(秒)' zh_tw["proxy_server_port"] = 'Proxy IP:PORT' zh_tw["area_select_order"] = '區域排序方式' @@ -347,6 +349,7 @@ def load_translate(): zh_cn["pass_date_is_sold_out"] = '避开“抢购一空”的日期' zh_cn["auto_reload_coming_soon_page"] = '自动刷新倒数中的日期页面' zh_cn["auto_reload_page_interval"] = '重新加载间隔(秒)' + zh_cn["reset_browser_interval"] = '重新启动浏览器间隔(秒)' zh_cn["proxy_server_port"] = 'Proxy IP:PORT' zh_cn["area_select_order"] = '区域排序方式' @@ -455,6 +458,7 @@ def load_translate(): ja_jp["pass_date_is_sold_out"] = '「売り切れ」公演を避ける' ja_jp["auto_reload_coming_soon_page"] = '公開予定のページをリロード' ja_jp["auto_reload_page_interval"] = 'リロード間隔(秒)' + ja_jp["reset_browser_interval"] = 'ブラウザの再起動間隔(秒)' ja_jp["proxy_server_port"] = 'Proxy IP:PORT' ja_jp["area_select_order"] = 'エリアソート方法' @@ -687,6 +691,7 @@ def get_default_config(): config_dict["advanced"]["remote_url"] = "http://127.0.0.1:%d/" % (CONST_SERVER_PORT) config_dict["advanced"]["auto_reload_page_interval"] = 0.1 + config_dict["advanced"]["reset_browser_interval"] = 0 config_dict["advanced"]["proxy_server_port"] = "" return config_dict @@ -776,6 +781,7 @@ def btn_save_act(language_code, slience_mode=False): global chk_state_pass_date_is_sold_out global chk_state_auto_reload_coming_soon_page global txt_auto_reload_page_interval + global txt_reset_browser_intervalv global txt_proxy_server_port global txt_tixcraft_sid @@ -986,8 +992,14 @@ def btn_save_act(language_code, slience_mode=False): config_dict["advanced"]["auto_guess_options"] = bool(chk_state_auto_guess_options.get()) config_dict["advanced"]["auto_reload_page_interval"] = float(txt_auto_reload_page_interval.get().strip()) + config_dict["advanced"]["reset_browser_interval"] = float(txt_reset_browser_interval.get().strip()) config_dict["advanced"]["proxy_server_port"] = txt_proxy_server_port.get().strip() + if config_dict["advanced"]["reset_browser_interval"] > 0: + if config_dict["advanced"]["reset_browser_interval"] < 20: + # min value is 20 seconds. + config_dict["advanced"]["reset_browser_interval"] = 20 + # save config. if is_all_data_correct: @@ -1286,6 +1298,7 @@ def applyNewLanguage(): global lbl_block_facebook_network_recommand global lbl_auto_reload_page_interval + global lbl_reset_browser_interval global lbl_proxy_server_port lbl_homepage.config(text=translate[language_code]["homepage"]) @@ -1322,6 +1335,7 @@ def applyNewLanguage(): lbl_block_facebook_network_recommand.config(text=translate[language_code]["recommand_enable"]) lbl_auto_reload_page_interval.config(text=translate[language_code]["auto_reload_page_interval"]) + lbl_reset_browser_interval.config(text=translate[language_code]["reset_browser_interval"]) lbl_proxy_server_port.config(text=translate[language_code]["proxy_server_port"]) lbl_headless.config(text=translate[language_code]["headless"]) @@ -1944,6 +1958,17 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X): group_row_count +=1 + global lbl_reset_browser_interval + lbl_reset_browser_interval = Label(frame_group_header, text=translate[language_code]['reset_browser_interval']) + lbl_reset_browser_interval.grid(column=0, row=group_row_count, sticky = E) + + global txt_reset_browser_interval + txt_reset_browser_interval_value = StringVar(frame_group_header, value=config_dict["advanced"]["reset_browser_interval"]) + txt_reset_browser_interval = Entry(frame_group_header, width=30, textvariable = txt_reset_browser_interval_value) + txt_reset_browser_interval.grid(column=1, row=group_row_count, sticky = W) + + group_row_count +=1 + global lbl_proxy_server_port lbl_proxy_server_port = Label(frame_group_header, text=translate[language_code]['proxy_server_port']) lbl_proxy_server_port.grid(column=0, row=group_row_count, sticky = E) diff --git a/webdriver/Maxbotplus_1.0.0/data/settings.json b/webdriver/Maxbotplus_1.0.0/data/settings.json index 6aaaf8d..1980c00 100644 --- a/webdriver/Maxbotplus_1.0.0/data/settings.json +++ b/webdriver/Maxbotplus_1.0.0/data/settings.json @@ -1 +1 @@ -{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, "proxy_server_port": ""}} \ No newline at end of file +{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "ocr_captcha": {"enable": true, "beta": true, "force_submit": true, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "date_auto_select": {"enable": true, "date_keyword": "", "mode": "random"}, "area_auto_select": {"enable": true, "mode": "random", "area_keyword": ""}, "keyword_exclude": "\"\u8f2a\u6905\",\"\u8eab\u969c\",\"\u8eab\u5fc3 \u969c\u7919\",\"Restricted View\",\"\u71c8\u67f1\u906e\u853d\",\"\u8996\u7dda\u4e0d\u5b8c\u6574\"", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true}, "tixcraft": {"pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "ibonqware": "", "facebook_account": "", "kktix_account": "", "fami_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "ticket_account": "", "udn_account": "", "ticketplus_account": "", "facebook_password": "", "kktix_password": "", "fami_password": "", "urbtix_password": "", "cityline_password": "", "hkticketing_password": "", "kham_password": "", "ticket_password": "", "udn_password": "", "ticketplus_password": "", "disable_adjacent_seat": false, "hide_some_image": true, "block_facebook_network": false, "headless": false, "verbose": false, "auto_guess_options": true, "user_guess_string": "", "remote_url": "\"http://127.0.0.1:16888/\"", "auto_reload_page_interval": 0.1, "reset_browser_interval": 0.0, "proxy_server_port": ""}} \ No newline at end of file