From 7631133b8f8fc87ae8a0844ada5e5b231ff1d05a Mon Sep 17 00:00:00 2001 From: CHUN YU YAO Date: Sun, 21 Jan 2024 19:41:11 +0800 Subject: [PATCH] 2024-01-15, idle/pause keyword --- chrome_tixcraft.py | 99 ++++--- config_launcher.py | 2 +- pip-req.txt | 20 +- settings.py | 270 +++++++++++++++++- .../Maxblockplus_1.0.0/data/settings.json | 1 + webdriver/Maxblockplus_1.0.0/manifest.json | 2 +- webdriver/Maxbotplus_1.0.0/data/settings.json | 2 +- 7 files changed, 338 insertions(+), 58 deletions(-) create mode 100644 webdriver/Maxblockplus_1.0.0/data/settings.json diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py index 6f8cb57..34f5b6e 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.14)" +CONST_APP_VERSION = "MaxBot (2024.01.15)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -450,7 +450,9 @@ def get_chrome_options(webdriver_path, config_dict): chrome_options.set_capability("goog:loggingPrefs",{"performance": "ALL"}) # PS: this is crx version. - extension_list = get_favoriate_extension_path(webdriver_path, config_dict) + extension_list = [] + if config_dict["advanced"]["chrome_extension"]: + extension_list = get_favoriate_extension_path(webdriver_path, config_dict) for ext in extension_list: if os.path.exists(ext): chrome_options.add_extension(ext) @@ -606,10 +608,12 @@ def dump_settings_to_maxbot_plus_extension(ext, config_dict): target_path = os.path.join(target_path, "data") target_path = os.path.join(target_path, CONST_MAXBOT_CONFIG_FILE) #print("save as to:", target_path) - try: - os.unlink(target_path) - except Exception as exc: - pass + if os.path.isfile(target_path): + try: + #print("remove file:", target_path) + os.unlink(target_path) + except Exception as exc: + pass with open(target_path, 'w') as outfile: json.dump(config_dict, outfile) @@ -650,12 +654,17 @@ def dump_settings_to_maxblock_plus_extension(ext, config_dict): # sync config. target_path = ext target_path = os.path.join(target_path, "data") + # special case, due to data folder is empty, sometime will be removed. + if not os.path.exists(target_path): + os.mkdir(target_path) target_path = os.path.join(target_path, CONST_MAXBOT_CONFIG_FILE) #print("save as to:", target_path) - try: - os.unlink(target_path) - except Exception as exc: - pass + if os.path.isfile(target_path): + try: + #print("remove file:", target_path) + os.unlink(target_path) + except Exception as exc: + pass with open(target_path, 'w') as outfile: config_dict["domain_filter"]=CONST_MAXBLOCK_EXTENSION_FILTER json.dump(config_dict, outfile) @@ -678,7 +687,9 @@ def get_uc_options(uc, config_dict, webdriver_path): options.set_capability("goog:loggingPrefs",{"performance": "ALL"}) load_extension_path = "" - extension_list = get_favoriate_extension_path(webdriver_path, config_dict) + extension_list = [] + if config_dict["advanced"]["chrome_extension"]: + extension_list = get_favoriate_extension_path(webdriver_path, config_dict) for ext in extension_list: ext = ext.replace('.crx','') if os.path.exists(ext): @@ -688,6 +699,7 @@ def get_uc_options(uc, config_dict, webdriver_path): if CONST_MAXBLOCK_EXTENSION_NAME in ext: dump_settings_to_maxblock_plus_extension(ext, config_dict) load_extension_path += ("," + os.path.abspath(ext)) + #print("load_extension_path:", load_extension_path) if len(load_extension_path) > 0: #print('load-extension:', load_extension_path[1:]) @@ -849,7 +861,7 @@ def get_driver_by_config(config_dict): print("platform:", platform.platform()) print("homepage:", homepage) print("browser:", config_dict["browser"]) - print("ticket_number:", str(config_dict["ticket_number"])) + #print("ticket_number:", str(config_dict["ticket_number"])) #print(config_dict["tixcraft"]) #print("==[advanced config]==") @@ -2367,32 +2379,34 @@ def is_row_match_keyword(keyword_string, row_text): # clean stop word. row_text = format_keyword_string(row_text) - is_match_keyword = False - if len(keyword_string) > 0: - area_keyword_exclude_array = [] + is_match_keyword = True + if len(keyword_string) > 0 and len(row_text) > 0: + is_match_keyword = False + keyword_array = [] try: - area_keyword_exclude_array = json.loads("["+ keyword_string +"]") + keyword_array = json.loads("["+ keyword_string +"]") except Exception as exc: - area_keyword_exclude_array = [] - for exclude_item_list in area_keyword_exclude_array: - if len(row_text) > 0: - if ' ' in exclude_item_list: - area_keyword_array = exclude_item_list.split(' ') + keyword_array = [] + for item_list in keyword_array: + if len(item_list) > 0: + if ' ' in item_list: + keyword_item_array = item_list.split(' ') is_match_all_exclude = True - for exclude_item in area_keyword_array: - exclude_item = format_keyword_string(exclude_item) - if not exclude_item in row_text: + for each_item in keyword_item_array: + each_item = format_keyword_string(each_item) + if not each_item in row_text: is_match_all_exclude = False if is_match_all_exclude: - row_text = "" is_match_keyword = True - break else: - exclude_item = format_keyword_string(exclude_item_list) - if exclude_item in row_text: - row_text = "" + item_list = format_keyword_string(item_list) + if item_list in row_text: is_match_keyword = True - break + else: + # match all. + is_match_keyword = True + if is_match_keyword: + break return is_match_keyword def reset_row_text_if_match_keyword_exclude(config_dict, row_text): @@ -3484,9 +3498,15 @@ def tixcraft_assign_ticket_number(driver, config_dict): def tixcraft_ticket_main(driver, config_dict, ocr, Captcha_Browser, domain_name): - # use extension instead of selenium. - # checkbox javascrit code at chrome extension. + is_agree_at_webdriver = False if not config_dict["browser"] in CONST_CHROME_FAMILY: + is_agree_at_webdriver = True + else: + if not config_dict["advanced"]["chrome_extension"]: + is_agree_at_webdriver = True + if is_agree_at_webdriver: + # use extension instead of selenium. + # checkbox javascrit code at chrome extension. tixcraft_ticket_main_agree(driver, config_dict) is_ticket_number_assigned = False @@ -4804,7 +4824,13 @@ if (typeof $.kkUser.checked_status_register_code === 'undefined') { def kktix_reg_auto_reload(driver, url, config_dict): # auto reload javascrit code at chrome extension. + is_reload_at_webdriver = False if not config_dict["browser"] in CONST_CHROME_FAMILY: + is_reload_at_webdriver = True + else: + if not config_dict["advanced"]["chrome_extension"]: + is_reload_at_webdriver = True + if is_reload_at_webdriver: kktix_check_register_status(driver, url) is_finish_checkbox_click = False @@ -12231,8 +12257,15 @@ def ticketplus_main(driver, url, config_dict, ocr, Captcha_Browser, ticketplus_d is_button_pressed = ticketplus_accept_order_fail(driver) is_reloading = False - # move below code to chrome extension. + + is_reload_at_webdriver = False if not config_dict["browser"] in CONST_CHROME_FAMILY: + is_reload_at_webdriver = True + else: + if not config_dict["advanced"]["chrome_extension"]: + is_reload_at_webdriver = True + if is_reload_at_webdriver: + # move below code to chrome extension. is_reloading = ticketplus_order_auto_reload_coming_soon(driver) if not is_reloading: diff --git a/config_launcher.py b/config_launcher.py index b60113c..f7117f9 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.14)" +CONST_APP_VERSION = "MaxBot (2024.01.15)" CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json" CONST_MAXBOT_CONFIG_FILE = "settings.json" diff --git a/pip-req.txt b/pip-req.txt index 20447cd..c66d573 100644 --- a/pip-req.txt +++ b/pip-req.txt @@ -1,21 +1,15 @@ certifi chardet +chromedriver-autoinstaller-max cryptography +ddddocr idna +looseversion +numpy Pillow -selenium -undetected-chromedriver playsound==1.2.2 pyperclip -ddddocr -urllib3 -numpy +selenium tornado -#jieba - -# PS: chromedriver_autoinstaller, please use max fork version. -# chromedriver_autoinstaller -chromedriver-autoinstaller-max - -# Migrate looseversion to fix distutils issues on python 3.12+ for undetected-chromedriver -looseversion +undetected-chromedriver +urllib3 diff --git a/settings.py b/settings.py index 5f2e755..2b60574 100644 --- a/settings.py +++ b/settings.py @@ -26,20 +26,21 @@ import threading import time import warnings import webbrowser +from datetime import datetime +from typing import Optional import pyperclip import requests import tornado from tornado.web import Application from urllib3.exceptions import InsecureRequestWarning -from typing import Optional try: import ddddocr except Exception as exc: pass -CONST_APP_VERSION = "MaxBot (2024.01.14)" +CONST_APP_VERSION = "MaxBot (2024.01.15)" CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt" CONST_MAXBOT_CONFIG_FILE = "settings.json" @@ -71,7 +72,7 @@ CONST_WEBDRIVER_TYPE_DP = "DrissionPage" CONST_SUPPORTED_SITES = ["https://kktix.com" ,"https://tixcraft.com (拓元)" ,"https://ticketmaster.sg" - ,"https://ticketmaster.com" + #,"https://ticketmaster.com" ,"https://teamear.tixcraft.com/ (添翼)" ,"https://www.indievox.com/ (獨立音樂)" ,"https://www.famiticket.com.tw (全網)" @@ -153,6 +154,12 @@ def load_translate(): en_us["verbose"] = 'Verbose mode' en_us["running_status"] = 'Running Status' en_us["running_url"] = 'Running URL' + en_us["system_clock"] = 'System Clock' + en_us["idle_keyword"] = 'Idle Keyword' + en_us["resume_keyword"] = 'Resume Keyword' + en_us["idle_keyword_second"] = 'Idle Keyword (second)' + en_us["resume_keyword_second"] = 'Resume Keyword (second)' + en_us["status_idle"] = 'Idle' en_us["status_paused"] = 'Paused' en_us["status_enabled"] = 'Enabled' @@ -163,7 +170,7 @@ def load_translate(): en_us["preference"] = 'Preference' en_us["advanced"] = 'Advanced' - en_us["verification_word"] = "Verification code" + en_us["verification_word"] = "Verification" en_us["maxbot_server"] = 'Server' en_us["autofill"] = 'Autofill' en_us["runtime"] = 'Runtime' @@ -205,6 +212,8 @@ def load_translate(): en_us["play_captcha_sound"] = 'Play sound while ordering' en_us["captcha_sound_filename"] = 'sound filename' + + en_us["chrome_extension"] = "Chrome Browser Extension" en_us["disable_adjacent_seat"] = "Disable Adjacent Seat" en_us["hide_some_image"] = "Hide Some Images" en_us["block_facebook_network"] = "Block Facebook Network" @@ -260,6 +269,12 @@ def load_translate(): zh_tw["verbose"] = '輸出詳細除錯訊息' zh_tw["running_status"] = '執行狀態' zh_tw["running_url"] = '執行網址' + zh_tw["system_clock"] = '系統時鐘' + zh_tw["idle_keyword"] = '暫停關鍵字' + zh_tw["resume_keyword"] = '接續關鍵字' + zh_tw["idle_keyword_second"] = '暫停關鍵字(秒)' + zh_tw["resume_keyword_second"] = '接續關鍵字(秒)' + zh_tw["status_idle"] = '閒置中' zh_tw["status_paused"] = '已暫停' zh_tw["status_enabled"] = '已啟用' @@ -312,6 +327,8 @@ def load_translate(): zh_tw["play_captcha_sound"] = '訂購時播放音效' zh_tw["captcha_sound_filename"] = '音效檔' + + zh_tw["chrome_extension"] = "Chrome 瀏覽器擴充功能" zh_tw["disable_adjacent_seat"] = "允許不連續座位" zh_tw["hide_some_image"] = "隱藏部份圖片" zh_tw["block_facebook_network"] = "擋掉 Facebook 連線" @@ -368,6 +385,12 @@ def load_translate(): zh_cn["verbose"] = '输出详细除错讯息' zh_cn["running_status"] = '执行状态' zh_cn["running_url"] = '执行网址' + zh_cn["system_clock"] = '系统时钟' + zh_cn["idle_keyword"] = '暂停关键字' + zh_cn["resume_keyword"] = '接续关键字' + zh_cn["idle_keyword_second"] = '暂停关键字(秒)' + zh_cn["resume_keyword_second"] = '接续关键字(秒)' + zh_cn["status_idle"] = '闲置中' zh_cn["status_paused"] = '已暂停' zh_cn["status_enabled"] = '已启用' @@ -421,6 +444,8 @@ def load_translate(): zh_cn["play_captcha_sound"] = '订购时播放音效' zh_cn["captcha_sound_filename"] = '音效档' + + zh_cn["chrome_extension"] = "Chrome 浏览器扩展程序" zh_cn["disable_adjacent_seat"] = "允许不连续座位" zh_cn["hide_some_image"] = "隐藏一些图像" zh_cn["block_facebook_network"] = "擋掉 Facebook 連線" @@ -477,13 +502,19 @@ def load_translate(): ja_jp["verbose"] = '詳細モード' ja_jp["running_status"] = 'スターテス' ja_jp["running_url"] = '現在の URL' - ja_jp["status_idle"] = '閒置中' + ja_jp["system_clock"] = 'システムクロック' + ja_jp["idle_keyword"] = 'アイドルキーワード' + ja_jp["resume_keyword"] = '再起動キーワード' + ja_jp["idle_keyword_second"] = 'アイドルキーワード(秒)' + ja_jp["resume_keyword_second"] = '再起動キーワード(秒)' + + ja_jp["status_idle"] = 'アイドル状態' ja_jp["status_paused"] = '一時停止' ja_jp["status_enabled"] = '有効' ja_jp["status_running"] = 'ランニング' ja_jp["idle"] = 'アイドル' - ja_jp["resume"] = '再開する' + ja_jp["resume"] = '再起動' ja_jp["preference"] = '設定' ja_jp["advanced"] = '高度な設定' @@ -529,6 +560,8 @@ def load_translate(): ja_jp["play_captcha_sound"] = '注文時に音を鳴らす' ja_jp["captcha_sound_filename"] = 'サウンドファイル' + + ja_jp["chrome_extension"] = "Chrome ブラウザ拡張機能" ja_jp["disable_adjacent_seat"] = "連続しない座席も可" ja_jp["hide_some_image"] = "一部の画像を非表示にする" ja_jp["block_facebook_network"] = "Facebookをブロックする" @@ -680,6 +713,7 @@ def get_default_config(): config_dict["advanced"]["udn_password"] = "" config_dict["advanced"]["ticketplus_password"] = "" + config_dict["advanced"]["chrome_extension"] = True config_dict["advanced"]["disable_adjacent_seat"] = False config_dict["advanced"]["hide_some_image"] = False config_dict["advanced"]["block_facebook_network"] = False @@ -694,6 +728,11 @@ def get_default_config(): config_dict["advanced"]["reset_browser_interval"] = 0 config_dict["advanced"]["proxy_server_port"] = "" + config_dict["advanced"]["idle_keyword"] = "" + config_dict["advanced"]["resume_keyword"] = "" + config_dict["advanced"]["idle_keyword_second"] = "" + config_dict["advanced"]["resume_keyword_second"] = "" + return config_dict def read_last_url_from_file(): @@ -729,18 +768,24 @@ def btn_restore_defaults_clicked(language_code): global root load_GUI(root, config_dict) -def btn_idle_clicked(language_code): +def do_maxbot_idle(): app_root = get_app_root() idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE) with open(CONST_MAXBOT_INT28_FILE, "w") as text_file: text_file.write("") + +def btn_idle_clicked(language_code): + do_maxbot_idle() update_maxbot_runtime_status() -def btn_resume_clicked(language_code): +def do_maxbot_resume(): app_root = get_app_root() idle_filepath = os.path.join(app_root, CONST_MAXBOT_INT28_FILE) - for i in range(10): + for i in range(3): force_remove_file(idle_filepath) + +def btn_resume_clicked(language_code): + do_maxbot_resume() update_maxbot_runtime_status() def btn_launcher_clicked(language_code): @@ -813,6 +858,7 @@ def btn_save_act(language_code, slience_mode=False): global chk_state_ocr_captcha global chk_state_ocr_captcha_ddddocr_beta global chk_state_ocr_captcha_force_submit + global chk_state_chrome_extension global chk_state_adjacent_seat global chk_state_hide_some_image global chk_state_block_facebook_network @@ -823,6 +869,11 @@ def btn_save_act(language_code, slience_mode=False): global combo_ocr_captcha_image_source global combo_webdriver_type + global txt_idle_keyword + global txt_resume_keyword + global txt_idle_keyword_second + global txt_resume_keyword_second + is_all_data_correct = True if is_all_data_correct: @@ -884,6 +935,18 @@ def btn_save_act(language_code, slience_mode=False): remote_url = txt_remote_url.get("1.0",END).strip() remote_url = format_config_keyword_for_json(remote_url) + idle_keyword = txt_idle_keyword.get("1.0",END).strip() + idle_keyword = format_config_keyword_for_json(idle_keyword) + + resume_keyword = txt_resume_keyword.get("1.0",END).strip() + resume_keyword = format_config_keyword_for_json(resume_keyword) + + idle_keyword_second = txt_idle_keyword_second.get("1.0",END).strip() + idle_keyword_second = format_config_keyword_for_json(idle_keyword_second) + + resume_keyword_second = txt_resume_keyword_second.get("1.0",END).strip() + resume_keyword_second = format_config_keyword_for_json(resume_keyword_second) + # test keyword format. if is_all_data_correct: if len(area_keyword) > 0: @@ -921,11 +984,51 @@ def btn_save_act(language_code, slience_mode=False): messagebox.showinfo(translate[language_code]["save"], "Error:" + translate[language_code]["remote_url"]) is_all_data_correct = False + if is_all_data_correct: + if len(idle_keyword) > 0: + try: + test_array = json.loads("["+ idle_keyword +"]") + except Exception as exc: + print(exc) + messagebox.showinfo(translate[language_code]["save"], "Error:" + translate[language_code]["idle_keyword"]) + is_all_data_correct = False + + if is_all_data_correct: + if len(resume_keyword) > 0: + try: + test_array = json.loads("["+ resume_keyword +"]") + except Exception as exc: + print(exc) + messagebox.showinfo(translate[language_code]["save"], "Error:" + translate[language_code]["resume_keyword"]) + is_all_data_correct = False + + if is_all_data_correct: + if len(idle_keyword_second) > 0: + try: + test_array = json.loads("["+ idle_keyword_second +"]") + except Exception as exc: + print(exc) + messagebox.showinfo(translate[language_code]["save"], "Error:" + translate[language_code]["idle_keyword_second"]) + is_all_data_correct = False + + if is_all_data_correct: + if len(resume_keyword_second) > 0: + try: + test_array = json.loads("["+ resume_keyword_second +"]") + except Exception as exc: + print(exc) + messagebox.showinfo(translate[language_code]["save"], "Error:" + translate[language_code]["resume_keyword_second"]) + is_all_data_correct = False + if is_all_data_correct: config_dict["area_auto_select"]["area_keyword"] = area_keyword config_dict["keyword_exclude"] = keyword_exclude config_dict["advanced"]["user_guess_string"] = user_guess_string config_dict["advanced"]["remote_url"] = remote_url + config_dict["advanced"]["idle_keyword"] = idle_keyword + config_dict["advanced"]["resume_keyword"] = resume_keyword + config_dict["advanced"]["idle_keyword_second"] = idle_keyword_second + config_dict["advanced"]["resume_keyword_second"] = resume_keyword_second if is_all_data_correct: config_dict["area_auto_select"]["enable"] = bool(chk_state_area_auto_select.get()) @@ -971,6 +1074,7 @@ def btn_save_act(language_code, slience_mode=False): config_dict["advanced"]["udn_password"] = encryptMe(config_dict["advanced"]["udn_password"]) config_dict["advanced"]["ticketplus_password"] = encryptMe(config_dict["advanced"]["ticketplus_password"]) + config_dict["advanced"]["chrome_extension"] = bool(chk_state_chrome_extension.get()) config_dict["advanced"]["disable_adjacent_seat"] = bool(chk_state_adjacent_seat.get()) config_dict["advanced"]["hide_some_image"] = bool(chk_state_hide_some_image.get()) config_dict["advanced"]["block_facebook_network"] = bool(chk_state_block_facebook_network.get()) @@ -1258,6 +1362,11 @@ def applyNewLanguage(): global lbl_maxbot_status global lbl_maxbot_last_url + global lbl_system_clock + global lbl_idle_keyword + global lbl_resume_keyword + global lbl_idle_keyword_second + global lbl_resume_keyword_second # for checkbox global chk_auto_press_next_step_button @@ -1270,6 +1379,7 @@ def applyNewLanguage(): global chk_ocr_captcha global chk_ocr_captcha_ddddocr_beta global chk_ocr_captcha_force_submit + global chk_chrome_extension global chk_adjacent_seat global chk_hide_some_image global chk_block_facebook_network @@ -1290,6 +1400,7 @@ def applyNewLanguage(): global lbl_donate global lbl_release + global lbl_chrome_extension global lbl_adjacent_seat global lbl_hide_some_image global lbl_block_facebook_network @@ -1327,6 +1438,7 @@ def applyNewLanguage(): lbl_ocr_captcha_image_source.config(text=translate[language_code]["ocr_captcha_image_source"]) lbl_ocr_captcha_not_support_arm.config(text=translate[language_code]["ocr_captcha_not_support_arm"]) lbl_webdriver_type.config(text=translate[language_code]["webdriver_type"]) + lbl_chrome_extension.config(text=translate[language_code]["chrome_extension"]) lbl_adjacent_seat.config(text=translate[language_code]["disable_adjacent_seat"]) lbl_hide_some_image.config(text=translate[language_code]["hide_some_image"]) lbl_block_facebook_network.config(text=translate[language_code]["block_facebook_network"]) @@ -1350,6 +1462,11 @@ def applyNewLanguage(): lbl_maxbot_status.config(text=translate[language_code]["running_status"]) lbl_maxbot_last_url.config(text=translate[language_code]["running_url"]) + lbl_system_clock.config(text=translate[language_code]["system_clock"]) + lbl_idle_keyword.config(text=translate[language_code]["idle_keyword"]) + lbl_resume_keyword.config(text=translate[language_code]["resume_keyword"]) + lbl_idle_keyword_second.config(text=translate[language_code]["idle_keyword_second"]) + lbl_resume_keyword_second.config(text=translate[language_code]["resume_keyword_second"]) chk_auto_press_next_step_button.config(text=translate[language_code]["enable"]) chk_auto_fill_ticket_number.config(text=translate[language_code]["enable"]) @@ -1361,6 +1478,7 @@ def applyNewLanguage(): chk_ocr_captcha.config(text=translate[language_code]["enable"]) chk_ocr_captcha_ddddocr_beta.config(text=translate[language_code]["enable"]) chk_ocr_captcha_force_submit.config(text=translate[language_code]["enable"]) + chk_chrome_extension.config(text=translate[language_code]["enable"]) chk_adjacent_seat.config(text=translate[language_code]["enable"]) chk_hide_some_image.config(text=translate[language_code]["enable"]) chk_block_facebook_network.config(text=translate[language_code]["enable"]) @@ -1980,6 +2098,20 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X): group_row_count +=1 + global lbl_chrome_extension + lbl_chrome_extension = Label(frame_group_header, text=translate[language_code]['chrome_extension']) + lbl_chrome_extension.grid(column=0, row=group_row_count, sticky = E) + + global chk_state_chrome_extension + chk_state_chrome_extension = BooleanVar() + chk_state_chrome_extension.set(config_dict["advanced"]["chrome_extension"]) + + global chk_chrome_extension + chk_chrome_extension = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_chrome_extension) + chk_chrome_extension.grid(column=1, row=group_row_count, sticky = W) + + group_row_count +=1 + global lbl_adjacent_seat lbl_adjacent_seat = Label(frame_group_header, text=translate[language_code]['disable_adjacent_seat']) lbl_adjacent_seat.grid(column=0, row=group_row_count, sticky = E) @@ -2446,11 +2578,69 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X): frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X) +def is_text_match_keyword(keyword_string, text): + is_match_keyword = True + if len(keyword_string) > 0 and len(text) > 0: + is_match_keyword = False + keyword_array = [] + try: + keyword_array = json.loads("["+ keyword_string +"]") + except Exception as exc: + keyword_array = [] + for item_list in keyword_array: + if len(item_list) > 0: + if ' ' in item_list: + keyword_item_array = item_list.split(' ') + is_match_all = True + for each_item in keyword_item_array: + if not each_item in text: + is_match_all = False + if is_match_all: + is_match_keyword = True + else: + if item_list in text: + is_match_keyword = True + else: + is_match_keyword = True + if is_match_keyword: + break + return is_match_keyword + +def change_maxbot_status_by_keyword(): + config_filepath, config_dict = load_json() + + system_clock_data = datetime.now() + current_time = system_clock_data.strftime('%H:%M:%S') + #print('Current Time is:', current_time) + if len(config_dict["advanced"]["idle_keyword"]) > 0: + is_matched = is_text_match_keyword(config_dict["advanced"]["idle_keyword"], current_time) + if is_matched: + #print("match to idle:", current_time) + do_maxbot_idle() + if len(config_dict["advanced"]["resume_keyword"]) > 0: + is_matched = is_text_match_keyword(config_dict["advanced"]["resume_keyword"], current_time) + if is_matched: + #print("match to resume:", current_time) + do_maxbot_resume() + + current_time = system_clock_data.strftime('%S') + if len(config_dict["advanced"]["idle_keyword_second"]) > 0: + is_matched = is_text_match_keyword(config_dict["advanced"]["idle_keyword_second"], current_time) + if is_matched: + #print("match to idle:", current_time) + do_maxbot_idle() + if len(config_dict["advanced"]["resume_keyword_second"]) > 0: + is_matched = is_text_match_keyword(config_dict["advanced"]["resume_keyword_second"], current_time) + if is_matched: + #print("match to resume:", current_time) + do_maxbot_resume() + def resetful_api_timer(): while True: btn_preview_text_clicked() preview_question_text_file() update_maxbot_runtime_status() + change_maxbot_status_by_keyword() time.sleep(0.3) if GLOBAL_SERVER_SHUTDOWN: break @@ -2515,7 +2705,14 @@ def update_maxbot_runtime_status(): if len(last_url) > 60: last_url=last_url[:60]+"..." lbl_maxbot_last_url_data.config(text=last_url) + + global lbl_system_clock_data + system_clock_data = datetime.now() + current_time = system_clock_data.strftime('%H:%M:%S') + #print('Current Time is:', current_time) + lbl_system_clock_data.config(text=current_time) except Exception as exc: + #print(exc) pass @@ -2559,6 +2756,61 @@ def RuntimeTab(root, config_dict, language_code, UI_PADDING_X): lbl_maxbot_last_url_data = Label(frame_group_header, text=last_url) lbl_maxbot_last_url_data.grid(column=1, row=group_row_count, sticky = W) + group_row_count +=1 + + global lbl_system_clock + lbl_system_clock = Label(frame_group_header, text=translate[language_code]['system_clock']) + lbl_system_clock.grid(column=0, row=group_row_count, sticky = E) + + system_clock = "" + global lbl_system_clock_data + lbl_system_clock_data = Label(frame_group_header, text=system_clock) + lbl_system_clock_data.grid(column=1, row=group_row_count, sticky = W) + + group_row_count +=1 + + global lbl_idle_keyword + lbl_idle_keyword = Label(frame_group_header, text=translate[language_code]['idle_keyword']) + lbl_idle_keyword.grid(column=0, row=group_row_count, sticky = E+N) + + global txt_idle_keyword + txt_idle_keyword = Text(frame_group_header, width=30, height=4) + txt_idle_keyword.grid(column=1, row=group_row_count, sticky = W) + txt_idle_keyword.insert("1.0", config_dict["advanced"]["idle_keyword"].strip()) + + group_row_count +=1 + + global lbl_resume_keyword + lbl_resume_keyword = Label(frame_group_header, text=translate[language_code]['resume_keyword']) + lbl_resume_keyword.grid(column=0, row=group_row_count, sticky = E+N) + + global txt_resume_keyword + txt_resume_keyword = Text(frame_group_header, width=30, height=4) + txt_resume_keyword.grid(column=1, row=group_row_count, sticky = W) + txt_resume_keyword.insert("1.0", config_dict["advanced"]["resume_keyword"].strip()) + + group_row_count +=1 + + global lbl_idle_keyword_second + lbl_idle_keyword_second = Label(frame_group_header, text=translate[language_code]['idle_keyword_second']) + lbl_idle_keyword_second.grid(column=0, row=group_row_count, sticky = E+N) + + global txt_idle_keyword_second + txt_idle_keyword_second = Text(frame_group_header, width=30, height=4) + txt_idle_keyword_second.grid(column=1, row=group_row_count, sticky = W) + txt_idle_keyword_second.insert("1.0", config_dict["advanced"]["idle_keyword_second"].strip()) + + group_row_count +=1 + + global lbl_resume_keyword_second + lbl_resume_keyword_second = Label(frame_group_header, text=translate[language_code]['resume_keyword_second']) + lbl_resume_keyword_second.grid(column=0, row=group_row_count, sticky = E+N) + + global txt_resume_keyword_second + txt_resume_keyword_second = Text(frame_group_header, width=30, height=4) + txt_resume_keyword_second.grid(column=1, row=group_row_count, sticky = W) + txt_resume_keyword_second.insert("1.0", config_dict["advanced"]["resume_keyword_second"].strip()) + frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X) update_maxbot_runtime_status() diff --git a/webdriver/Maxblockplus_1.0.0/data/settings.json b/webdriver/Maxblockplus_1.0.0/data/settings.json new file mode 100644 index 0000000..30687fe --- /dev/null +++ b/webdriver/Maxblockplus_1.0.0/data/settings.json @@ -0,0 +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": "", "chrome_extension": true, "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": "", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}, "domain_filter": ["*google-analytics.com/*", "*googletagmanager.com/*", "*googletagservices.com/*", "*lndata.com/*", "*a.amnet.tw/*", "*adx.c.appier.net/*", "*clarity.ms/*", "*cloudfront.com/*", "*cms.analytics.yahoo.com/*", "*doubleclick.net/*", "*e2elog.fetnet.net/*", "*fundingchoicesmessages.google.com/*", "*ghtinc.com/*", "*match.adsrvr.org/*", "*onead.onevision.com.tw/*", "*popin.cc/*", "*rollbar.com/*", "*sb.scorecardresearch.com/*", "*tagtoo.co/*", "*.ssp.hinet.net/*", "*ticketmaster.sg/js/adblock*", "*.googlesyndication.com/*", "*treasuredata.com/*", "*play.google.com/log?*", "*www.youtube.com/youtubei/v1/player/heartbeat*", "*tixcraft.com/js/analytics.js*", "*ticketmaster.sg/js/adblock.js*", "*img.uniicreative.com/*", "*cdn.cookielaw.org/*", "*tixcraft.com/js/custom.js*", "*tixcraft.com/js/common.js*", "*cdnjs.cloudflare.com/ajax/libs/clipboard.js/*"]} \ No newline at end of file diff --git a/webdriver/Maxblockplus_1.0.0/manifest.json b/webdriver/Maxblockplus_1.0.0/manifest.json index 8520950..98432f6 100644 --- a/webdriver/Maxblockplus_1.0.0/manifest.json +++ b/webdriver/Maxblockplus_1.0.0/manifest.json @@ -1,7 +1,7 @@ { "author": "Max Yao", "name": "MaxBlock Plus", - "description": "Helps you hide ads, avoid tracking, load pages faster.", + "description": "Help you block net request to load pages faster.", "icons": { "16": "icons/maxblock-16.png", "32": "icons/maxblock-32.png", diff --git a/webdriver/Maxbotplus_1.0.0/data/settings.json b/webdriver/Maxbotplus_1.0.0/data/settings.json index 1980c00..151b45a 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, "reset_browser_interval": 0.0, "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": "", "chrome_extension": true, "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": "", "idle_keyword": "", "resume_keyword": "", "idle_keyword_second": "", "resume_keyword_second": ""}} \ No newline at end of file