2023-02-22 support headless mode.

master
CHUN YU YAO 2023-02-23 00:05:44 +08:00
parent c8669d08ae
commit b150bd3177
3 changed files with 138 additions and 44 deletions

View File

@ -47,10 +47,12 @@ try:
except Exception as exc: except Exception as exc:
pass pass
import webbrowser
import ssl import ssl
ssl._create_default_https_context = ssl._create_unverified_context ssl._create_default_https_context = ssl._create_unverified_context
CONST_APP_VERSION = u"MaxBot (2023.02.21)" CONST_APP_VERSION = u"MaxBot (2023.02.22)"
CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com" CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com"
URL_GOOGLE_OAUTH = 'https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&prompt=consent&response_type=code&client_id=407408718192.apps.googleusercontent.com&scope=email&access_type=offline&flowName=GeneralOAuthFlow' URL_GOOGLE_OAUTH = 'https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&prompt=consent&response_type=code&client_id=407408718192.apps.googleusercontent.com&scope=email&access_type=offline&flowName=GeneralOAuthFlow'
@ -107,6 +109,19 @@ def get_config_dict():
if os.path.isfile(config_filepath): if os.path.isfile(config_filepath):
with open(config_filepath) as json_data: with open(config_filepath) as json_data:
config_dict = json.load(json_data) config_dict = json.load(json_data)
# special case for headless.
is_headless_enable = False
if config_dict["advanced"]["headless"]:
# for tixcraft headless.
if len(config_dict["advanced"]["tixcraft_sid"]) > 1:
is_headless_enable = True
else:
print("If you are runnig headless mode on tixcraft, you need input your cookie SID.")
if is_headless_enable:
config_dict["ocr_captcha"]["enable"] = True
config_dict["ocr_captcha"]["force_submit"] = True
return config_dict return config_dict
def format_keyword_string(keyword): def format_keyword_string(keyword):
@ -154,7 +169,7 @@ def get_chromedriver_path(webdriver_path):
chromedriver_path = os.path.join(webdriver_path,"chromedriver.exe") chromedriver_path = os.path.join(webdriver_path,"chromedriver.exe")
return chromedriver_path return chromedriver_path
def get_chrome_options(webdriver_path, adblock_plus_enable, browser="chrome"): def get_chrome_options(webdriver_path, adblock_plus_enable, browser="chrome", headless = False):
chrome_options = webdriver.ChromeOptions() chrome_options = webdriver.ChromeOptions()
if browser=="edge": if browser=="edge":
chrome_options = webdriver.EdgeOptions() chrome_options = webdriver.EdgeOptions()
@ -170,7 +185,8 @@ def get_chrome_options(webdriver_path, adblock_plus_enable, browser="chrome"):
chrome_options.add_extension(no_google_analytics_path) chrome_options.add_extension(no_google_analytics_path)
if os.path.exists(no_ad_path): if os.path.exists(no_ad_path):
chrome_options.add_extension(no_ad_path) chrome_options.add_extension(no_ad_path)
if headless:
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-features=TranslateUI') chrome_options.add_argument('--disable-features=TranslateUI')
chrome_options.add_argument('--disable-translate') chrome_options.add_argument('--disable-translate')
chrome_options.add_argument('--lang=zh-TW') chrome_options.add_argument('--lang=zh-TW')
@ -195,10 +211,10 @@ def get_chrome_options(webdriver_path, adblock_plus_enable, browser="chrome"):
return chrome_options, caps return chrome_options, caps
def load_chromdriver_normal(webdriver_path, driver_type, adblock_plus_enable): def load_chromdriver_normal(webdriver_path, driver_type, adblock_plus_enable, headless):
chromedriver_path = get_chromedriver_path(webdriver_path) chromedriver_path = get_chromedriver_path(webdriver_path)
chrome_service = Service(chromedriver_path) chrome_service = Service(chromedriver_path)
chrome_options, caps = get_chrome_options(webdriver_path, adblock_plus_enable) chrome_options, caps = get_chrome_options(webdriver_path, adblock_plus_enable, headless=headless)
driver = None driver = None
try: try:
# method 6: Selenium Stealth # method 6: Selenium Stealth
@ -229,7 +245,7 @@ def load_chromdriver_normal(webdriver_path, driver_type, adblock_plus_enable):
return driver return driver
def load_chromdriver_uc(webdriver_path, adblock_plus_enable): def load_chromdriver_uc(webdriver_path, adblock_plus_enable, headless):
import undetected_chromedriver as uc import undetected_chromedriver as uc
chromedriver_path = get_chromedriver_path(webdriver_path) chromedriver_path = get_chromedriver_path(webdriver_path)
@ -251,6 +267,8 @@ def load_chromdriver_uc(webdriver_path, adblock_plus_enable):
if len(load_extension_path) > 0: if len(load_extension_path) > 0:
options.add_argument('--load-extension=' + load_extension_path[1:]) options.add_argument('--load-extension=' + load_extension_path[1:])
if headless:
options.add_argument('--headless')
options.add_argument('--disable-features=TranslateUI') options.add_argument('--disable-features=TranslateUI')
options.add_argument('--disable-translate') options.add_argument('--disable-translate')
options.add_argument('--lang=zh-TW') options.add_argument('--lang=zh-TW')
@ -438,11 +456,12 @@ def get_driver_by_config(config_dict):
adblock_plus_enable = config_dict["advanced"]["adblock_plus_enable"] adblock_plus_enable = config_dict["advanced"]["adblock_plus_enable"]
print("adblock_plus_enable:", adblock_plus_enable) print("adblock_plus_enable:", adblock_plus_enable)
headless = config_dict["advanced"]["headless"]
if browser == "chrome": if browser == "chrome":
# method 6: Selenium Stealth # method 6: Selenium Stealth
if driver_type != CONST_WEBDRIVER_TYPE_UC: if driver_type != CONST_WEBDRIVER_TYPE_UC:
driver = load_chromdriver_normal(webdriver_path, driver_type, adblock_plus_enable) driver = load_chromdriver_normal(webdriver_path, driver_type, adblock_plus_enable, headless)
else: else:
# method 5: uc # method 5: uc
# multiprocessing not work bug. # multiprocessing not work bug.
@ -450,7 +469,7 @@ def get_driver_by_config(config_dict):
if hasattr(sys, 'frozen'): if hasattr(sys, 'frozen'):
from multiprocessing import freeze_support from multiprocessing import freeze_support
freeze_support() freeze_support()
driver = load_chromdriver_uc(webdriver_path, adblock_plus_enable) driver = load_chromdriver_uc(webdriver_path, adblock_plus_enable, headless)
if browser == "firefox": if browser == "firefox":
# default os is linux/mac # default os is linux/mac
@ -482,7 +501,7 @@ def get_driver_by_config(config_dict):
chromedriver_path = os.path.join(webdriver_path,"msedgedriver.exe") chromedriver_path = os.path.join(webdriver_path,"msedgedriver.exe")
webdriver_service = Service(chromedriver_path) webdriver_service = Service(chromedriver_path)
chrome_options, caps = get_chrome_options(webdriver_path, adblock_plus_enable, browser="edge") chrome_options, caps = get_chrome_options(webdriver_path, adblock_plus_enable, browser="edge", headless=headless)
driver = None driver = None
try: try:
@ -556,6 +575,22 @@ def get_driver_by_config(config_dict):
pass pass
driver.get(homepage) driver.get(homepage)
tixcraft_family = False
if 'tixcraft.com' in homepage:
tixcraft_family = True
if 'indievox.com' in homepage:
tixcraft_family = True
if tixcraft_family:
if len(config_dict["advanced"]["tixcraft_sid"]) > 1:
for i in range(5):
time.sleep(1.0)
tixcraft_home_close_window(driver)
tixcraft_sid = decryptMe(config_dict["advanced"]["tixcraft_sid"])
driver.delete_cookie("SID")
driver.add_cookie({"name":"SID", "value": tixcraft_sid, "path" : "/", "secure":True})
except WebDriverException as exce2: except WebDriverException as exce2:
print('oh no not again, WebDriverException') print('oh no not again, WebDriverException')
print('WebDriverException:', exce2) print('WebDriverException:', exce2)
@ -1096,7 +1131,7 @@ def tixcraft_home_close_window(driver):
if accept_all_cookies_btn is not None: if accept_all_cookies_btn is not None:
is_visible = False is_visible = False
try: try:
if accept_all_cookies_btn.is_enabled() and accept_all_cookies_btn.is_displayed(): if accept_all_cookies_btn.is_enabled():
is_visible = True is_visible = True
except Exception as exc: except Exception as exc:
pass pass
@ -5620,12 +5655,11 @@ def list_all_cookies(driver):
cookies_dict[cookie['name']] = cookie['value'] cookies_dict[cookie['name']] = cookie['value']
print(cookies_dict) print(cookies_dict)
def tixcraft_main(driver, url, config_dict, answer_index, is_verifyCode_editing, ocr, Captcha_Browser): def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser):
home_url_list = ['https://tixcraft.com/','https://www.tixcraft.com/','https://indievox.com/','https://www.indievox.com/','https://teamear.tixcraft.com/activity'] home_url_list = ['https://tixcraft.com/','https://www.tixcraft.com/','https://indievox.com/','https://www.indievox.com/','https://teamear.tixcraft.com/activity']
for each_url in home_url_list: for each_url in home_url_list:
if each_url == url: if each_url == url:
tixcraft_home_close_window(driver) tixcraft_home_close_window(driver)
if config_dict["ocr_captcha"]["enable"]: if config_dict["ocr_captcha"]["enable"]:
domain_name = url.split('/')[2] domain_name = url.split('/')[2]
#PS: need set cookies once, if user change domain. #PS: need set cookies once, if user change domain.
@ -5653,21 +5687,31 @@ def tixcraft_main(driver, url, config_dict, answer_index, is_verifyCode_editing,
if '/ticket/verify/' in url: if '/ticket/verify/' in url:
presale_code = config_dict["tixcraft"]["presale_code"] presale_code = config_dict["tixcraft"]["presale_code"]
presale_code_delimiter = config_dict["tixcraft"]["presale_code_delimiter"] presale_code_delimiter = config_dict["tixcraft"]["presale_code_delimiter"]
answer_index = tixcraft_verify(driver, presale_code, presale_code_delimiter, answer_index) tixcraft_dict["answer_index"] = tixcraft_verify(driver, presale_code, presale_code_delimiter, tixcraft_dict["answer_index"])
else: else:
answer_index = -1 tixcraft_dict["answer_index"] = -1
# main app, to select ticket number. # main app, to select ticket number.
if '/ticket/ticket/' in url: if '/ticket/ticket/' in url:
if not is_verifyCode_editing: if not tixcraft_dict["is_verifyCode_editing"]:
domain_name = url.split('/')[2] domain_name = url.split('/')[2]
is_verifyCode_editing = tixcraft_ticket_main(driver, config_dict, ocr, Captcha_Browser, domain_name) tixcraft_dict["is_verifyCode_editing"] = tixcraft_ticket_main(driver, config_dict, ocr, Captcha_Browser, domain_name)
else: else:
is_verifyCode_editing = False tixcraft_dict["is_verifyCode_editing"] = False
return answer_index, is_verifyCode_editing if '/ticket/checkout' in url:
if not tixcraft_dict["is_popup_checkout"]:
domain_name = url.split('/')[2]
checkout_url = "https://%s/ticket/checkout" % (domain_name)
print("搶票成功, 請前往該帳號訂單查看: %s" % (checkout_url))
webbrowser.open_new(checkout_url)
tixcraft_dict["is_popup_checkout"] = True
else:
tixcraft_dict["is_popup_checkout"] = False
def kktix_main(driver, url, config_dict, answer_index, kktix_register_status_last): return tixcraft_dict
def kktix_main(driver, url, config_dict, kktix_dict):
auto_press_next_step_button = config_dict["kktix"]["auto_press_next_step_button"] auto_press_next_step_button = config_dict["kktix"]["auto_press_next_step_button"]
kktix_account = config_dict["advanced"]["kktix_account"] kktix_account = config_dict["advanced"]["kktix_account"]
@ -5680,7 +5724,7 @@ def kktix_main(driver, url, config_dict, answer_index, kktix_register_status_las
if not is_url_contain_sign_in: if not is_url_contain_sign_in:
if '/registrations/new' in url: if '/registrations/new' in url:
answer_index, kktix_register_status_last = kktix_reg_new(driver, url, answer_index, kktix_register_status_last, config_dict) kktix_dict["answer_index"], kktix_dict["kktix_register_status_last"] = kktix_reg_new(driver, url, kktix_dict["answer_index"], kktix_dict["kktix_register_status_last"], config_dict)
else: else:
is_event_page = False is_event_page = False
if '/events/' in url: if '/events/' in url:
@ -5694,9 +5738,9 @@ def kktix_main(driver, url, config_dict, answer_index, kktix_register_status_las
#print("should press next here.") #print("should press next here.")
kktix_events_press_next_button(driver) kktix_events_press_next_button(driver)
answer_index = -1 kktix_dict["answer_index"] = -1
kktix_register_status_last = None kktix_dict["kktix_register_status_last"] = None
return answer_index, kktix_register_status_last return kktix_dict
def famiticket_main(driver, url, config_dict): def famiticket_main(driver, url, config_dict):
try: try:
@ -5997,10 +6041,10 @@ def ibon_main(driver, url, config_dict, answer_index):
#auto_guess_options = config_dict["kktix"]["auto_guess_options"] #auto_guess_options = config_dict["kktix"]["auto_guess_options"]
auto_guess_options = True auto_guess_options = True
if auto_guess_options: if auto_guess_options:
#answer_index = ibon_verification_question(driver, answer_index, config_dict) #ibon_dict["answer_index"] = ibon_verification_question(driver, ibon_dict["answer_index"], config_dict)
pass pass
else: else:
answer_index = -1 ibon_dict["answer_index"] = -1
# https://orders.ibon.com.tw/application/UTK02/UTK0201_000.aspx?PERFORMANCE_ID=0000 # https://orders.ibon.com.tw/application/UTK02/UTK0201_000.aspx?PERFORMANCE_ID=0000
if '/application/UTK02/' in url and '.aspx?PERFORMANCE_ID=' in url: if '/application/UTK02/' in url and '.aspx?PERFORMANCE_ID=' in url:
@ -6021,7 +6065,7 @@ def ibon_main(driver, url, config_dict, answer_index):
# step 1: select area. # step 1: select area.
ibon_performance(driver, config_dict) ibon_performance(driver, config_dict)
return answer_index return ibon_dict
def hkticketing_home(driver): def hkticketing_home(driver):
show_debug_message = True # debug. show_debug_message = True # debug.
@ -7758,11 +7802,18 @@ def main():
last_url = "" last_url = ""
# for tixcraft # for tixcraft
is_verifyCode_editing = False tixcraft_dict = {}
tixcraft_dict["answer_index"]=-1
tixcraft_dict["is_verifyCode_editing"] = False
tixcraft_dict["is_popup_checkout"] = False
# for kktix # for kktix
answer_index = -1 kktix_dict = {}
kktix_register_status_last = None kktix_dict["answer_index"]=-1
kktix_dict["kktix_register_status_last"] = None
ibon_dict = {}
ibon_dict["answer_index"]=-1
DISCONNECTED_MSG = ': target window already closed' DISCONNECTED_MSG = ': target window already closed'
@ -7907,10 +7958,6 @@ def main():
print(url) print(url)
last_url = url last_url = url
# for Max's manuall test.
if '/Downloads/varify.html' in url:
answer_index = tixcraft_verify(driver, "", "", answer_index)
tixcraft_family = False tixcraft_family = False
if 'tixcraft.com' in url: if 'tixcraft.com' in url:
tixcraft_family = True tixcraft_family = True
@ -7919,17 +7966,17 @@ def main():
tixcraft_family = True tixcraft_family = True
if tixcraft_family: if tixcraft_family:
answer_index, is_verifyCode_editing = tixcraft_main(driver, url, config_dict, answer_index, is_verifyCode_editing, ocr, Captcha_Browser) tixcraft_dict = tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
# for kktix.cc and kktix.com # for kktix.cc and kktix.com
if 'kktix.c' in url: if 'kktix.c' in url:
answer_index, kktix_register_status_last = kktix_main(driver, url, config_dict, answer_index, kktix_register_status_last) kktix_dict = kktix_main(driver, url, config_dict, kktix_dict)
if 'famiticket.com' in url: if 'famiticket.com' in url:
famiticket_main(driver, url, config_dict) famiticket_main(driver, url, config_dict)
if 'ibon.com' in url: if 'ibon.com' in url:
answer_index = ibon_main(driver, url, config_dict, answer_index) ibon_dict = ibon_main(driver, url, config_dict, ibon_dict)
if 'kham.com' in url: if 'kham.com' in url:
kham_main(driver, url, config_dict, ocr, Captcha_Browser) kham_main(driver, url, config_dict, ocr, Captcha_Browser)

View File

@ -1 +1 @@
{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "pass_1_seat_remaining": true, "auto_check_agree": true, "ocr_captcha": {"enable": true, "force_submit": false, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true, "area_mode": "from top to bottom", "area_keyword_1": "", "area_keyword_1_and": "", "area_keyword_2": "", "area_keyword_2_and": "", "area_keyword_2_enable": true, "auto_guess_options": true, "user_guess_string": ""}, "tixcraft": {"date_auto_select": {"enable": true, "date_keyword": "", "mode": "from top to bottom"}, "area_auto_select": {"enable": true, "area_keyword_1": "", "area_keyword_2": "", "area_keyword_3": "", "area_keyword_4": "", "area_keyword_2_enable": true, "area_keyword_3_enable": true, "area_keyword_4_enable": true, "mode": "from top to bottom"}, "pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true, "presale_code": "", "presale_code_delimiter": ""}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "kktix_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "facebook_password": "", "kktix_password": "", "cityline_password": "", "urbtix_password": "", "hkticketing_password": "", "kham_password": "", "adblock_plus_enable": false, "open_google_oauth_url": false}, "debug": false} {"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "pass_1_seat_remaining": true, "auto_check_agree": true, "ocr_captcha": {"enable": true, "force_submit": false, "image_source": "canvas"}, "webdriver_type": "undetected_chromedriver", "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true, "area_mode": "from top to bottom", "area_keyword_1": "", "area_keyword_1_and": "", "area_keyword_2": "", "area_keyword_2_and": "", "area_keyword_2_enable": true, "auto_guess_options": true, "user_guess_string": ""}, "tixcraft": {"date_auto_select": {"enable": true, "date_keyword": "", "mode": "from top to bottom"}, "area_auto_select": {"enable": true, "area_keyword_1": "", "area_keyword_2": "", "area_keyword_3": "", "area_keyword_4": "", "area_keyword_2_enable": true, "area_keyword_3_enable": true, "area_keyword_4_enable": true, "mode": "from top to bottom"}, "pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true, "presale_code": "", "presale_code_delimiter": ""}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "tixcraft_sid": "", "facebook_account": "", "kktix_account": "", "cityline_account": "", "urbtix_account": "", "hkticketing_account": "", "kham_account": "", "facebook_password": "", "kktix_password": "", "cityline_password": "", "urbtix_password": "", "hkticketing_password": "", "kham_password": "", "adblock_plus_enable": false, "open_google_oauth_url": false, "headless": false}, "debug": false}

View File

@ -20,7 +20,7 @@ import webbrowser
import pyperclip import pyperclip
import base64 import base64
CONST_APP_VERSION = u"MaxBot (2023.02.21)" CONST_APP_VERSION = u"MaxBot (2023.02.22)"
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom" CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top" CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
@ -29,12 +29,12 @@ CONST_SELECT_ORDER_DEFAULT = CONST_FROM_TOP_TO_BOTTOM
CONST_SELECT_OPTIONS_DEFAULT = (CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM) CONST_SELECT_OPTIONS_DEFAULT = (CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM)
CONST_SELECT_OPTIONS_ARRAY = [CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM] CONST_SELECT_OPTIONS_ARRAY = [CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM]
CONST_ADBLOCK_PLUS_ADVANCED_FILTER_DEFAULT = '''tixcraft.com###topAlert CONST_ADBLOCK_PLUS_ADVANCED_FILTER_DEFAULT = '''tixcraft.com###topAlert
tixcraft.com##.col-md-7.col-xs-12.mg-top tixcraft.com##.col-md-7.col-xs-12.mgt-16.text-center
tixcraft.com##.col-md-7.col-xs-12.mgt-16.mx-auto
tixcraft.com##.topBar.alert-box.emergency tixcraft.com##.topBar.alert-box.emergency
tixcraft.com##.footer.clearfix tixcraft.com##.footer.clearfix
tixcraft.com##.row.process-wizard.process-wizard-info tixcraft.com##.page-info.row.line-btm.mg-0
tixcraft.com##.nav-line tixcraft.com##.row.justify-content-start.navbar-location'''
tixcraft.com##.page-info.row.line-btm.mg-0'''
CONST_CAPTCHA_SOUND_FILENAME_DEFAULT = "ding-dong.wav" CONST_CAPTCHA_SOUND_FILENAME_DEFAULT = "ding-dong.wav"
CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com" CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com"
@ -92,6 +92,7 @@ def load_translate():
en_us["ocr_captcha_force_submit"] = 'Away from keyboard' en_us["ocr_captcha_force_submit"] = 'Away from keyboard'
en_us["ocr_captcha_image_source"] = 'OCR image source' en_us["ocr_captcha_image_source"] = 'OCR image source'
en_us["webdriver_type"] = 'WebDriver type' en_us["webdriver_type"] = 'WebDriver type'
en_us["headless"] = 'Headless mode'
en_us["preference"] = 'Preference' en_us["preference"] = 'Preference'
en_us["advanced"] = 'Advanced' en_us["advanced"] = 'Advanced'
@ -105,6 +106,7 @@ def load_translate():
en_us["restore_defaults"] = 'Restore Defaults' en_us["restore_defaults"] = 'Restore Defaults'
en_us["done"] = 'Done' en_us["done"] = 'Done'
en_us["tixcraft_sid"] = 'Tixcraft cookie SID'
en_us["facebook_account"] = 'Facebook account' en_us["facebook_account"] = 'Facebook account'
en_us["kktix_account"] = 'KKTIX account' en_us["kktix_account"] = 'KKTIX account'
en_us["cityline_account"] = 'cityline account' en_us["cityline_account"] = 'cityline account'
@ -167,6 +169,7 @@ def load_translate():
zh_tw["ocr_captcha_force_submit"] = '掛機模式' zh_tw["ocr_captcha_force_submit"] = '掛機模式'
zh_tw["ocr_captcha_image_source"] = 'OCR圖片取得方式' zh_tw["ocr_captcha_image_source"] = 'OCR圖片取得方式'
zh_tw["webdriver_type"] = 'WebDriver類別' zh_tw["webdriver_type"] = 'WebDriver類別'
zh_tw["headless"] = '無圖形界面模式'
zh_tw["preference"] = '偏好設定' zh_tw["preference"] = '偏好設定'
zh_tw["advanced"] = '進階設定' zh_tw["advanced"] = '進階設定'
@ -180,6 +183,7 @@ def load_translate():
zh_tw["restore_defaults"] = '恢復預設值' zh_tw["restore_defaults"] = '恢復預設值'
zh_tw["done"] = '完成' zh_tw["done"] = '完成'
zh_tw["tixcraft_sid"] = 'Tixcraft cookie SID'
zh_tw["facebook_account"] = 'Facebook 帳號' zh_tw["facebook_account"] = 'Facebook 帳號'
zh_tw["kktix_account"] = 'KKTIX 帳號' zh_tw["kktix_account"] = 'KKTIX 帳號'
zh_tw["cityline_account"] = 'cityline 帳號' zh_tw["cityline_account"] = 'cityline 帳號'
@ -242,6 +246,7 @@ def load_translate():
zh_cn["ocr_captcha_force_submit"] = '挂机模式' zh_cn["ocr_captcha_force_submit"] = '挂机模式'
zh_cn["ocr_captcha_image_source"] = 'OCR图像源' zh_cn["ocr_captcha_image_source"] = 'OCR图像源'
zh_cn["webdriver_type"] = 'WebDriver类别' zh_cn["webdriver_type"] = 'WebDriver类别'
zh_cn["headless"] = '无图形界面模式'
zh_cn["preference"] = '偏好设定' zh_cn["preference"] = '偏好设定'
zh_cn["advanced"] = '進階設定' zh_cn["advanced"] = '進階設定'
@ -256,6 +261,7 @@ def load_translate():
zh_cn["restore_defaults"] = '恢复默认值' zh_cn["restore_defaults"] = '恢复默认值'
zh_cn["done"] = '完成' zh_cn["done"] = '完成'
zh_cn["tixcraft_sid"] = 'Tixcraft cookie SID'
zh_cn["facebook_account"] = 'Facebook 帐号' zh_cn["facebook_account"] = 'Facebook 帐号'
zh_cn["kktix_account"] = 'KKTIX 帐号' zh_cn["kktix_account"] = 'KKTIX 帐号'
zh_cn["cityline_account"] = 'cityline 帐号' zh_cn["cityline_account"] = 'cityline 帐号'
@ -318,6 +324,7 @@ def load_translate():
ja_jp["ocr_captcha_force_submit"] = 'キーボードから離れて' ja_jp["ocr_captcha_force_submit"] = 'キーボードから離れて'
ja_jp["ocr_captcha_image_source"] = 'OCR 画像ソース' ja_jp["ocr_captcha_image_source"] = 'OCR 画像ソース'
ja_jp["webdriver_type"] = 'WebDriverタイプ' ja_jp["webdriver_type"] = 'WebDriverタイプ'
ja_jp["headless"] = 'ヘッドレスモード'
ja_jp["preference"] = '設定' ja_jp["preference"] = '設定'
ja_jp["advanced"] = '高度な設定' ja_jp["advanced"] = '高度な設定'
@ -331,6 +338,7 @@ def load_translate():
ja_jp["restore_defaults"] = 'デフォルトに戻す' ja_jp["restore_defaults"] = 'デフォルトに戻す'
ja_jp["done"] = '終わり' ja_jp["done"] = '終わり'
ja_jp["tixcraft_sid"] = 'Tixcraft cookie SID'
ja_jp["facebook_account"] = 'Facebookのアカウント' ja_jp["facebook_account"] = 'Facebookのアカウント'
ja_jp["kktix_account"] = 'KKTIXのアカウント' ja_jp["kktix_account"] = 'KKTIXのアカウント'
ja_jp["cityline_account"] = 'citylineのアカウント' ja_jp["cityline_account"] = 'citylineのアカウント'
@ -446,6 +454,7 @@ def get_default_config():
config_dict["advanced"]["play_captcha_sound"]["enable"] = True config_dict["advanced"]["play_captcha_sound"]["enable"] = True
config_dict["advanced"]["play_captcha_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT config_dict["advanced"]["play_captcha_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
config_dict["advanced"]["tixcraft_sid"] = ""
config_dict["advanced"]["facebook_account"] = "" config_dict["advanced"]["facebook_account"] = ""
config_dict["advanced"]["kktix_account"] = "" config_dict["advanced"]["kktix_account"] = ""
config_dict["advanced"]["cityline_account"] = "" config_dict["advanced"]["cityline_account"] = ""
@ -462,6 +471,7 @@ def get_default_config():
config_dict["advanced"]["adblock_plus_enable"] = False config_dict["advanced"]["adblock_plus_enable"] = False
config_dict["advanced"]["open_google_oauth_url"] = False config_dict["advanced"]["open_google_oauth_url"] = False
config_dict["advanced"]["headless"] = False
config_dict['debug']=False config_dict['debug']=False
@ -539,6 +549,7 @@ def btn_save_act(language_code, slience_mode=False):
global txt_presale_code global txt_presale_code
global txt_presale_code_delimiter global txt_presale_code_delimiter
global txt_tixcraft_sid
global txt_facebook_account global txt_facebook_account
global txt_kktix_account global txt_kktix_account
global txt_cityline_account global txt_cityline_account
@ -559,6 +570,7 @@ def btn_save_act(language_code, slience_mode=False):
global chk_state_ocr_captcha global chk_state_ocr_captcha
global chk_state_ocr_captcha_force_submit global chk_state_ocr_captcha_force_submit
global chk_state_google_oauth global chk_state_google_oauth
global chk_state_headless
global combo_ocr_captcha_image_source global combo_ocr_captcha_image_source
global combo_webdriver_type global combo_webdriver_type
@ -638,6 +650,7 @@ def btn_save_act(language_code, slience_mode=False):
config_dict["advanced"]["play_captcha_sound"]["enable"] = bool(chk_state_play_captcha_sound.get()) config_dict["advanced"]["play_captcha_sound"]["enable"] = bool(chk_state_play_captcha_sound.get())
config_dict["advanced"]["play_captcha_sound"]["filename"] = txt_captcha_sound_filename.get().strip() config_dict["advanced"]["play_captcha_sound"]["filename"] = txt_captcha_sound_filename.get().strip()
config_dict["advanced"]["tixcraft_sid"] = txt_tixcraft_sid.get().strip()
config_dict["advanced"]["facebook_account"] = txt_facebook_account.get().strip() config_dict["advanced"]["facebook_account"] = txt_facebook_account.get().strip()
config_dict["advanced"]["kktix_account"] = txt_kktix_account.get().strip() config_dict["advanced"]["kktix_account"] = txt_kktix_account.get().strip()
config_dict["advanced"]["cityline_account"] = txt_cityline_account.get().strip() config_dict["advanced"]["cityline_account"] = txt_cityline_account.get().strip()
@ -652,6 +665,7 @@ def btn_save_act(language_code, slience_mode=False):
config_dict["advanced"]["hkticketing_password"] = txt_hkticketing_password.get().strip() config_dict["advanced"]["hkticketing_password"] = txt_hkticketing_password.get().strip()
config_dict["advanced"]["kham_password"] = txt_kham_password.get().strip() config_dict["advanced"]["kham_password"] = txt_kham_password.get().strip()
config_dict["advanced"]["tixcraft_sid"] = encryptMe(config_dict["advanced"]["tixcraft_sid"])
config_dict["advanced"]["facebook_password"] = encryptMe(config_dict["advanced"]["facebook_password"]) config_dict["advanced"]["facebook_password"] = encryptMe(config_dict["advanced"]["facebook_password"])
config_dict["advanced"]["kktix_password"] = encryptMe(config_dict["advanced"]["kktix_password"]) config_dict["advanced"]["kktix_password"] = encryptMe(config_dict["advanced"]["kktix_password"])
config_dict["advanced"]["cityline_password"] = encryptMe(config_dict["advanced"]["cityline_password"]) config_dict["advanced"]["cityline_password"] = encryptMe(config_dict["advanced"]["cityline_password"])
@ -667,6 +681,7 @@ def btn_save_act(language_code, slience_mode=False):
config_dict["ocr_captcha"]["force_submit"] = bool(chk_state_ocr_captcha_force_submit.get()) config_dict["ocr_captcha"]["force_submit"] = bool(chk_state_ocr_captcha_force_submit.get())
config_dict["ocr_captcha"]["image_source"] = combo_ocr_captcha_image_source.get().strip() config_dict["ocr_captcha"]["image_source"] = combo_ocr_captcha_image_source.get().strip()
config_dict["webdriver_type"] = combo_webdriver_type.get().strip() config_dict["webdriver_type"] = combo_webdriver_type.get().strip()
config_dict["advanced"]["headless"] = bool(chk_state_headless.get())
# save config. # save config.
if is_all_data_correct: if is_all_data_correct:
@ -831,6 +846,7 @@ def applyNewLanguage():
global lbl_ocr_captcha_force_submit global lbl_ocr_captcha_force_submit
global lbl_ocr_captcha_image_source global lbl_ocr_captcha_image_source
global lbl_webdriver_type global lbl_webdriver_type
global lbl_headless
# for checkbox # for checkbox
global chk_pass_1_seat_remaining global chk_pass_1_seat_remaining
@ -848,6 +864,7 @@ def applyNewLanguage():
global chk_ocr_captcha global chk_ocr_captcha
global chk_ocr_captcha_force_submit global chk_ocr_captcha_force_submit
global chk_google_oauth global chk_google_oauth
global chk_headless
global chk_kktix_area_keyword_2_enable global chk_kktix_area_keyword_2_enable
global chk_area_keyword_2_enable global chk_area_keyword_2_enable
@ -901,6 +918,7 @@ def applyNewLanguage():
lbl_ocr_captcha_image_source.config(text=translate[language_code]["ocr_captcha_image_source"]) lbl_ocr_captcha_image_source.config(text=translate[language_code]["ocr_captcha_image_source"])
lbl_webdriver_type.config(text=translate[language_code]["webdriver_type"]) lbl_webdriver_type.config(text=translate[language_code]["webdriver_type"])
lbl_google_oauth.config(text=translate[language_code]["open_google_oauth_url"]) lbl_google_oauth.config(text=translate[language_code]["open_google_oauth_url"])
lbl_headless.config(text=translate[language_code]["headless"])
chk_pass_1_seat_remaining.config(text=translate[language_code]["enable"]) chk_pass_1_seat_remaining.config(text=translate[language_code]["enable"])
chk_auto_check_agree.config(text=translate[language_code]["enable"]) chk_auto_check_agree.config(text=translate[language_code]["enable"])
@ -916,6 +934,7 @@ def applyNewLanguage():
chk_ocr_captcha.config(text=translate[language_code]["enable"]) chk_ocr_captcha.config(text=translate[language_code]["enable"])
chk_ocr_captcha_force_submit.config(text=translate[language_code]["enable"]) chk_ocr_captcha_force_submit.config(text=translate[language_code]["enable"])
chk_google_oauth.config(text=translate[language_code]["enable"]) chk_google_oauth.config(text=translate[language_code]["enable"])
chk_headless.config(text=translate[language_code]["enable"])
chk_kktix_area_keyword_2_enable.config(text=translate[language_code]["enable"]) chk_kktix_area_keyword_2_enable.config(text=translate[language_code]["enable"])
chk_area_keyword_2_enable.config(text=translate[language_code]["enable"]) chk_area_keyword_2_enable.config(text=translate[language_code]["enable"])
@ -927,6 +946,7 @@ def applyNewLanguage():
tabControl.tab(2, text=translate[language_code]["autofill"]) tabControl.tab(2, text=translate[language_code]["autofill"])
tabControl.tab(3, text=translate[language_code]["about"]) tabControl.tab(3, text=translate[language_code]["about"])
global lbl_tixcraft_sid
global lbl_facebook_account global lbl_facebook_account
global lbl_kktix_account global lbl_kktix_account
global lbl_cityline_account global lbl_cityline_account
@ -945,6 +965,8 @@ def applyNewLanguage():
global lbl_play_captcha_sound global lbl_play_captcha_sound
global lbl_captcha_sound_filename global lbl_captcha_sound_filename
lbl_tixcraft_sid.config(text=translate[language_code]["tixcraft_sid"])
lbl_facebook_account.config(text=translate[language_code]["facebook_account"]) lbl_facebook_account.config(text=translate[language_code]["facebook_account"])
lbl_kktix_account.config(text=translate[language_code]["kktix_account"]) lbl_kktix_account.config(text=translate[language_code]["kktix_account"])
lbl_cityline_account.config(text=translate[language_code]["cityline_account"]) lbl_cityline_account.config(text=translate[language_code]["cityline_account"])
@ -1264,7 +1286,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
lbl_homepage.grid(column=0, row=group_row_count, sticky = E) lbl_homepage.grid(column=0, row=group_row_count, sticky = E)
global combo_homepage global combo_homepage
combo_homepage = ttk.Combobox(frame_group_header, state="readonly") combo_homepage = ttk.Combobox(frame_group_header)
combo_homepage['values']= ["https://kktix.com" combo_homepage['values']= ["https://kktix.com"
,"https://tixcraft.com (拓元)" ,"https://tixcraft.com (拓元)"
,"https://teamear.tixcraft.com/ (添翼)" ,"https://teamear.tixcraft.com/ (添翼)"
@ -1915,6 +1937,20 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
chk_google_oauth = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_google_oauth) chk_google_oauth = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_google_oauth)
chk_google_oauth.grid(column=1, row=group_row_count, sticky = W) chk_google_oauth.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
global lbl_headless
lbl_headless = Label(frame_group_header, text=translate[language_code]['headless'])
lbl_headless.grid(column=0, row=group_row_count, sticky = E)
global chk_state_headless
chk_state_headless = BooleanVar()
chk_state_headless.set(config_dict['advanced']["headless"])
global chk_headless
chk_headless = Checkbutton(frame_group_header, text=translate[language_code]['enable'], variable=chk_state_headless)
chk_headless.grid(column=1, row=group_row_count, sticky = W)
frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X) frame_group_header.grid(column=0, row=row_count, padx=UI_PADDING_X)
def AutofillTab(root, config_dict, language_code, UI_PADDING_X): def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
@ -1923,6 +1959,17 @@ def AutofillTab(root, config_dict, language_code, UI_PADDING_X):
frame_group_header = Frame(root) frame_group_header = Frame(root)
group_row_count = 0 group_row_count = 0
global lbl_tixcraft_sid
lbl_tixcraft_sid = Label(frame_group_header, text=translate[language_code]['tixcraft_sid'])
lbl_tixcraft_sid.grid(column=0, row=group_row_count, sticky = E)
global txt_tixcraft_sid
txt_tixcraft_sid_value = StringVar(frame_group_header, value=decryptMe(config_dict["advanced"]["tixcraft_sid"].strip()))
txt_tixcraft_sid = Entry(frame_group_header, width=20, textvariable = txt_tixcraft_sid_value, show="*")
txt_tixcraft_sid.grid(column=1, row=group_row_count, sticky = W)
group_row_count +=1
global lbl_facebook_account global lbl_facebook_account
lbl_facebook_account = Label(frame_group_header, text=translate[language_code]['facebook_account']) lbl_facebook_account = Label(frame_group_header, text=translate[language_code]['facebook_account'])
lbl_facebook_account.grid(column=0, row=group_row_count, sticky = E) lbl_facebook_account.grid(column=0, row=group_row_count, sticky = E)