2022-12-26, add user-guess-string for question.

master
CHUN YU YAO 2022-12-27 23:38:13 +08:00
parent 0568d2b6f6
commit 060d3e5d5f
3 changed files with 222 additions and 77 deletions

View File

@ -39,7 +39,7 @@ warnings.simplefilter('ignore',InsecureRequestWarning)
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 (2022.12.22)" CONST_APP_VERSION = u"MaxBot (2022.12.26)"
CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com" CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com"
@ -1351,13 +1351,15 @@ def tixcraft_ticket_number_auto_fill(driver, select_obj, ticket_number):
return is_assign_ticket_number return is_assign_ticket_number
def tixcraft_verify(driver): def tixcraft_verify(driver, presale_code):
show_debug_message = True # debug. show_debug_message = True # debug.
#show_debug_message = False # online #show_debug_message = False # online
ret = False ret = False
captcha_password_string = None captcha_password_string = None
if len(presale_code) > 0:
captcha_password_string = presale_code
form_select = None form_select = None
try: try:
@ -1400,6 +1402,7 @@ def tixcraft_verify(driver):
is_options_in_question = False is_options_in_question = False
# 請輸入"YES",代表您已詳閱且瞭解並同意。 # 請輸入"YES",代表您已詳閱且瞭解並同意。
if captcha_password_string is None:
if u'請輸入"YES"' in html_text: if u'請輸入"YES"' in html_text:
if u'已詳閱' in html_text: if u'已詳閱' in html_text:
if u'並同意' in html_text: if u'並同意' in html_text:
@ -1433,7 +1436,6 @@ def tixcraft_verify(driver):
try: try:
# PS: sometime may send key twice... # PS: sometime may send key twice...
form_input.clear() form_input.clear()
form_input.send_keys(captcha_password_string) form_input.send_keys(captcha_password_string)
is_password_sent = True is_password_sent = True
if show_debug_message: if show_debug_message:
@ -1474,7 +1476,6 @@ def tixcraft_verify(driver):
if len(default_value)==0: if len(default_value)==0:
try: try:
form_input.click() form_input.click()
time.sleep(0.5)
except Exception as exc: except Exception as exc:
pass pass
@ -2087,7 +2088,7 @@ def kktix_check_register_status(url):
#print("registerStatus:", registerStatus) #print("registerStatus:", registerStatus)
return registerStatus return registerStatus
def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess_options): def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div):
show_debug_message = True # debug. show_debug_message = True # debug.
show_debug_message = False # online show_debug_message = False # online
@ -2449,7 +2450,6 @@ def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess
# still no answer. # still no answer.
if captcha_password_string is None: if captcha_password_string is None:
if auto_guess_options:
if not is_combine_two_question: if not is_combine_two_question:
answer_list, my_answer_delimitor = get_answer_list_by_question(captcha_text_div_text) answer_list, my_answer_delimitor = get_answer_list_by_question(captcha_text_div_text)
@ -2561,7 +2561,14 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di
print("found captcha_inner_div layor.") print("found captcha_inner_div layor.")
auto_guess_options = config_dict["kktix"]["auto_guess_options"] auto_guess_options = config_dict["kktix"]["auto_guess_options"]
captcha_password_string, answer_list, my_answer_delimitor = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess_options) user_guess_string = config_dict["kktix"]["user_guess_string"]
if len(user_guess_string) > 0:
captcha_password_string = user_guess_string
else:
if auto_guess_options:
captcha_password_string, answer_list, my_answer_delimitor = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div)
if captcha_password_string is not None: if captcha_password_string is not None:
# password is not None, try to send. # password is not None, try to send.
@ -2587,7 +2594,7 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di
inputed_captcha_text = "" inputed_captcha_text = ""
if len(inputed_captcha_text) == 0: if len(inputed_captcha_text) == 0:
try: try:
print("focus() captcha to input.") #print("focus() captcha to input.")
check_and_play_sound_for_captcha(config_dict) check_and_play_sound_for_captcha(config_dict)
captcha_password_input_tag.click() captcha_password_input_tag.click()
time.sleep(1) time.sleep(1)
@ -2659,7 +2666,7 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di
# exceed index, do nothing. # exceed index, do nothing.
pass pass
else: else:
# captcha appear but we do no have answer list. # captcha appeared, but we don't have answer list.
pass pass
@ -3522,11 +3529,61 @@ def cityline_performance(driver, config_dict):
if click_ret: if click_ret:
break break
def facebook_login(driver, facebook_account): def facebook_login(driver, account):
ret = False ret = False
el_email = None el_email = None
try: try:
el_email = driver.find_element(By.CSS_SELECTOR, '#email') el_email = driver.find_element(By.CSS_SELECTOR, '#email')
except Exception as exc:
pass
is_visible = False
if el_email is not None:
try:
if el_email.is_enabled():
is_visible = True
except Exception as exc:
pass
is_email_sent = False
if is_visible:
try:
inputed_text = el_email.get_attribute('value')
if inputed_text is not None:
if len(inputed_text) == 0:
el_email.send_keys(account)
is_email_sent = True
except Exception as exc:
pass
el_pass = None
if is_email_sent:
try:
el_pass = driver.find_element(By.CSS_SELECTOR, '#pass')
except Exception as exc:
pass
is_visible = False
if el_pass is not None:
try:
if el_pass.is_enabled():
is_visible = True
except Exception as exc:
pass
if is_visible:
try:
el_pass.click()
except Exception as exc:
pass
return ret
def kktix_login(driver, account):
ret = False
el_email = None
try:
el_email = driver.find_element(By.CSS_SELECTOR, '#user_login')
except Exception as exc: except Exception as exc:
#print("find #email fail") #print("find #email fail")
#print(exc) #print(exc)
@ -3536,11 +3593,8 @@ def facebook_login(driver, facebook_account):
if el_email is not None: if el_email is not None:
try: try:
if el_email.is_enabled(): if el_email.is_enabled():
if el_email.is_displayed():
is_visible = True is_visible = True
except Exception as exc: except Exception as exc:
#print("find #email fail")
#print(exc)
pass pass
is_email_sent = False is_email_sent = False
@ -3549,39 +3603,30 @@ def facebook_login(driver, facebook_account):
inputed_text = el_email.get_attribute('value') inputed_text = el_email.get_attribute('value')
if inputed_text is not None: if inputed_text is not None:
if len(inputed_text) == 0: if len(inputed_text) == 0:
el_email.send_keys(facebook_account) el_email.send_keys(account)
is_email_sent = True is_email_sent = True
except Exception as exc: except Exception as exc:
#print("find #email fail")
#print(exc)
pass pass
el_pass = None el_pass = None
if is_email_sent: if is_email_sent:
try: try:
el_pass = driver.find_element(By.CSS_SELECTOR, '#pass') el_pass = driver.find_element(By.CSS_SELECTOR, '#user_password')
except Exception as exc: except Exception as exc:
#print("find #email fail")
#print(exc)
pass pass
is_visible = False is_visible = False
if el_pass is not None: if el_pass is not None:
try: try:
if el_pass.is_enabled(): if el_pass.is_enabled():
if el_pass.is_displayed():
is_visible = True is_visible = True
except Exception as exc: except Exception as exc:
#print("find #email fail")
#print(exc)
pass pass
if is_visible: if is_visible:
try: try:
el_pass.click() el_pass.click()
except Exception as exc: except Exception as exc:
#print("find #email fail")
#print(exc)
pass pass
return ret return ret
@ -3858,7 +3903,8 @@ def main():
tixcraft_area_auto_select(driver, url, config_dict) tixcraft_area_auto_select(driver, url, config_dict)
if '/ticket/verify/' in url: if '/ticket/verify/' in url:
tixcraft_verify(driver) presale_code = config_dict["tixcraft"]["presale_code"]
tixcraft_verify(driver, presale_code)
# main app, to select ticket number. # main app, to select ticket number.
if '/ticket/ticket/' in url: if '/ticket/ticket/' in url:
@ -3870,9 +3916,12 @@ def main():
# for kktix.cc and kktix.com # for kktix.cc and kktix.com
if 'kktix.c' in url: if 'kktix.c' in url:
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"]
# fix https://kktix.com/users/sign_in?back_to=https://kktix.com/events/xxxx and registerStatus: SOLD_OUT cause page refresh. # fix https://kktix.com/users/sign_in?back_to=https://kktix.com/events/xxxx and registerStatus: SOLD_OUT cause page refresh.
if '/users/sign_in' in url: if '/users/sign_in?' in url:
if len(kktix_account) > 4:
kktix_login(driver, kktix_account)
continue continue
if '/registrations/new' in url: if '/registrations/new' in url:

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, "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": "", "auto_guess_options": false}, "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": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": false, "auto_reload_coming_soon_page": true}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "adblock_plus_enable": 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, "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": "", "auto_guess_options": false, "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": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": false, "auto_reload_coming_soon_page": true, "presale_code": ""}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "kktix_account": "", "adblock_plus_enable": false}, "debug": false}

View File

@ -19,7 +19,7 @@ import json
import webbrowser import webbrowser
import pyperclip import pyperclip
CONST_APP_VERSION = u"MaxBot (2022.12.22)" CONST_APP_VERSION = u"MaxBot (2022.12.26)"
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"
@ -62,6 +62,7 @@ def load_translate():
en_us["area_keyword"] = 'Area Keyword' en_us["area_keyword"] = 'Area Keyword'
en_us["and"] = 'And with' en_us["and"] = 'And with'
en_us["auto_guess_options"] = 'Guess Options in Question' en_us["auto_guess_options"] = 'Guess Options in Question'
en_us["user_guess_string"] = 'Fill This Answer in Question'
en_us["date_auto_select"] = 'Date Auto Select' en_us["date_auto_select"] = 'Date Auto Select'
en_us["date_select_order"] = 'Date select order' en_us["date_select_order"] = 'Date select order'
@ -83,8 +84,11 @@ def load_translate():
en_us["save"] = 'Save' en_us["save"] = 'Save'
en_us["exit"] = 'Close' en_us["exit"] = 'Close'
en_us["copy"] = 'Copy' en_us["copy"] = 'Copy'
en_us["restore_defaults"] = 'Restore Defaults'
en_us["done"] = 'Done'
en_us["facebook_account"] = 'Facebook account' en_us["facebook_account"] = 'Facebook account'
en_us["kktix_account"] = 'KKTIX account'
en_us["play_captcha_sound"] = 'Play sound when captcha' en_us["play_captcha_sound"] = 'Play sound when captcha'
en_us["captcha_sound_filename"] = 'captcha sound filename' en_us["captcha_sound_filename"] = 'captcha sound filename'
en_us["adblock_plus_enable"] = 'Adblock Plus Extension' en_us["adblock_plus_enable"] = 'Adblock Plus Extension'
@ -112,6 +116,7 @@ def load_translate():
zh_tw["area_keyword"] = '區域關鍵字' zh_tw["area_keyword"] = '區域關鍵字'
zh_tw["and"] = '而且(同列)' zh_tw["and"] = '而且(同列)'
zh_tw["auto_guess_options"] = '自動猜測驗證問題' zh_tw["auto_guess_options"] = '自動猜測驗證問題'
zh_tw["user_guess_string"] = '在驗證問題中填寫此答案'
zh_tw["date_auto_select"] = '日期自動點選' zh_tw["date_auto_select"] = '日期自動點選'
zh_tw["date_select_order"] = '日期排序方式' zh_tw["date_select_order"] = '日期排序方式'
@ -133,8 +138,11 @@ def load_translate():
zh_tw["save"] = '存檔' zh_tw["save"] = '存檔'
zh_tw["exit"] = '關閉' zh_tw["exit"] = '關閉'
zh_tw["copy"] = '複製' zh_tw["copy"] = '複製'
zh_tw["restore_defaults"] = '恢復預設值'
zh_tw["done"] = '完成'
zh_tw["facebook_account"] = 'Facebook 帳號' zh_tw["facebook_account"] = 'Facebook 帳號'
zh_tw["kktix_account"] = 'KKTIX 帳號'
zh_tw["play_captcha_sound"] = '輸入驗證碼時播放音效' zh_tw["play_captcha_sound"] = '輸入驗證碼時播放音效'
zh_tw["captcha_sound_filename"] = '驗證碼用音效檔' zh_tw["captcha_sound_filename"] = '驗證碼用音效檔'
zh_tw["adblock_plus_enable"] = 'Adblock 瀏覽器擴充功能' zh_tw["adblock_plus_enable"] = 'Adblock 瀏覽器擴充功能'
@ -162,6 +170,7 @@ def load_translate():
zh_cn["area_keyword"] = '区域关键字' zh_cn["area_keyword"] = '区域关键字'
zh_cn["and"] = '而且(同列)' zh_cn["and"] = '而且(同列)'
zh_cn["auto_guess_options"] = '自动猜测验证问题' zh_cn["auto_guess_options"] = '自动猜测验证问题'
zh_cn["user_guess_string"] = '在验证问题中填写此答案'
zh_cn["date_auto_select"] = '日期自动点选' zh_cn["date_auto_select"] = '日期自动点选'
zh_cn["date_select_order"] = '日期排序方式' zh_cn["date_select_order"] = '日期排序方式'
@ -183,8 +192,12 @@ def load_translate():
zh_cn["run"] = '抢票' zh_cn["run"] = '抢票'
zh_cn["save"] = '存档' zh_cn["save"] = '存档'
zh_cn["exit"] = '关闭' zh_cn["exit"] = '关闭'
zh_cn["copy"] = '复制'
zh_cn["restore_defaults"] = '恢复默认值'
zh_cn["done"] = '完成'
zh_cn["facebook_account"] = 'Facebook 帐号' zh_cn["facebook_account"] = 'Facebook 帐号'
zh_cn["kktix_account"] = 'KKTIX 帐号'
zh_cn["play_captcha_sound"] = '输入验证码时播放音效' zh_cn["play_captcha_sound"] = '输入验证码时播放音效'
zh_cn["captcha_sound_filename"] = '验证码用音效档' zh_cn["captcha_sound_filename"] = '验证码用音效档'
zh_cn["adblock_plus_enable"] = 'Adblock 浏览器扩充功能' zh_cn["adblock_plus_enable"] = 'Adblock 浏览器扩充功能'
@ -212,6 +225,7 @@ def load_translate():
ja_jp["area_keyword"] = 'エリアキーワード' ja_jp["area_keyword"] = 'エリアキーワード'
ja_jp["and"] = 'そして(同列)' ja_jp["and"] = 'そして(同列)'
ja_jp["auto_guess_options"] = '自動推測検証問題' ja_jp["auto_guess_options"] = '自動推測検証問題'
ja_jp["user_guess_string"] = '質問に回答を記入'
ja_jp["date_auto_select"] = '日付自動選択' ja_jp["date_auto_select"] = '日付自動選択'
ja_jp["date_select_order"] = '日付のソート方法' ja_jp["date_select_order"] = '日付のソート方法'
@ -233,8 +247,11 @@ def load_translate():
ja_jp["save"] = '保存' ja_jp["save"] = '保存'
ja_jp["exit"] = '閉じる' ja_jp["exit"] = '閉じる'
ja_jp["copy"] = 'コピー' ja_jp["copy"] = 'コピー'
ja_jp["restore_defaults"] = 'デフォルトに戻す'
ja_jp["done"] = '終わり'
ja_jp["facebook_account"] = 'Facebookのアカウント' ja_jp["facebook_account"] = 'Facebookのアカウント'
ja_jp["kktix_account"] = 'KKTIXのアカウント'
ja_jp["play_captcha_sound"] = 'キャプチャ時に音を鳴らす' ja_jp["play_captcha_sound"] = 'キャプチャ時に音を鳴らす'
ja_jp["captcha_sound_filename"] = 'サウンドファイル名' ja_jp["captcha_sound_filename"] = 'サウンドファイル名'
@ -281,6 +298,7 @@ def get_default_config():
config_dict["kktix"]["area_keyword_2"] = "" config_dict["kktix"]["area_keyword_2"] = ""
config_dict["kktix"]["area_keyword_2_and"] = "" config_dict["kktix"]["area_keyword_2_and"] = ""
config_dict["kktix"]["auto_guess_options"] = False config_dict["kktix"]["auto_guess_options"] = False
config_dict["kktix"]["user_guess_string"] = ""
config_dict['tixcraft']={} config_dict['tixcraft']={}
config_dict["tixcraft"]["date_auto_select"] = {} config_dict["tixcraft"]["date_auto_select"] = {}
@ -298,6 +316,7 @@ def get_default_config():
config_dict["tixcraft"]["pass_date_is_sold_out"] = False config_dict["tixcraft"]["pass_date_is_sold_out"] = False
config_dict["tixcraft"]["auto_reload_coming_soon_page"] = True config_dict["tixcraft"]["auto_reload_coming_soon_page"] = True
config_dict["tixcraft"]["presale_code"] = ""
config_dict['advanced']={} config_dict['advanced']={}
@ -306,6 +325,7 @@ def get_default_config():
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"]["facebook_account"] = "" config_dict["advanced"]["facebook_account"] = ""
config_dict["advanced"]["kktix_account"] = ""
config_dict["advanced"]["adblock_plus_enable"] = False config_dict["advanced"]["adblock_plus_enable"] = False
config_dict['debug']=False config_dict['debug']=False
@ -326,10 +346,23 @@ def load_json():
config_dict = get_default_config() config_dict = get_default_config()
return config_filepath, config_dict return config_filepath, config_dict
def btn_save_clicked(): def btn_restore_defaults_clicked(language_code):
btn_save_act() app_root = get_app_root()
config_filepath = os.path.join(app_root, 'settings.json')
def btn_save_act(slience_mode=False): config_dict = get_default_config()
import json
with open(config_filepath, 'w') as outfile:
json.dump(config_dict, outfile)
messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"])
global root
load_GUI(root, config_dict)
def btn_save_clicked(language_code):
btn_save_act(language_code)
def btn_save_act(language_code, slience_mode=False):
app_root = get_app_root() app_root = get_app_root()
config_filepath = os.path.join(app_root, 'settings.json') config_filepath = os.path.join(app_root, 'settings.json')
@ -351,6 +384,7 @@ def btn_save_act(slience_mode=False):
global txt_kktix_area_keyword_2_and global txt_kktix_area_keyword_2_and
# disable password brute force attack # disable password brute force attack
global txt_kktix_answer_dictionary global txt_kktix_answer_dictionary
global txt_kktix_user_guess_string
global chk_state_auto_guess_options global chk_state_auto_guess_options
@ -367,8 +401,10 @@ def btn_save_act(slience_mode=False):
global chk_state_pass_date_is_sold_out global chk_state_pass_date_is_sold_out
global chk_state_auto_reload_coming_soon_page global chk_state_auto_reload_coming_soon_page
global txt_presale_code
global txt_facebook_account global txt_facebook_account
global txt_kktix_account
global chk_state_play_captcha_sound global chk_state_play_captcha_sound
global txt_captcha_sound_filename global txt_captcha_sound_filename
global chk_state_adblock_plus global chk_state_adblock_plus
@ -395,6 +431,8 @@ def btn_save_act(slience_mode=False):
messagebox.showerror("Error", "Please select a language") messagebox.showerror("Error", "Please select a language")
else: else:
config_dict["language"] = combo_language.get().strip() config_dict["language"] = combo_language.get().strip()
# display as new language.
language_code = get_language_code_by_name(config_dict["language"])
if is_all_data_correct: if is_all_data_correct:
if combo_ticket_number.get().strip()=="": if combo_ticket_number.get().strip()=="":
@ -417,6 +455,7 @@ def btn_save_act(slience_mode=False):
# disable password brute force attack # disable password brute force attack
#config_dict["kktix"]["answer_dictionary"] = txt_kktix_answer_dictionary.get().strip() #config_dict["kktix"]["answer_dictionary"] = txt_kktix_answer_dictionary.get().strip()
config_dict["kktix"]["auto_guess_options"] = bool(chk_state_auto_guess_options.get()) config_dict["kktix"]["auto_guess_options"] = bool(chk_state_auto_guess_options.get())
config_dict["kktix"]["user_guess_string"] = txt_kktix_user_guess_string.get().strip()
config_dict["tixcraft"]["date_auto_select"]["enable"] = bool(chk_state_date_auto_select.get()) config_dict["tixcraft"]["date_auto_select"]["enable"] = bool(chk_state_date_auto_select.get())
config_dict["tixcraft"]["date_auto_select"]["date_keyword"] = txt_date_keyword.get().strip() config_dict["tixcraft"]["date_auto_select"]["date_keyword"] = txt_date_keyword.get().strip()
@ -432,11 +471,13 @@ def btn_save_act(slience_mode=False):
config_dict["tixcraft"]["pass_date_is_sold_out"] = bool(chk_state_pass_date_is_sold_out.get()) config_dict["tixcraft"]["pass_date_is_sold_out"] = bool(chk_state_pass_date_is_sold_out.get())
config_dict["tixcraft"]["auto_reload_coming_soon_page"] = bool(chk_state_auto_reload_coming_soon_page.get()) config_dict["tixcraft"]["auto_reload_coming_soon_page"] = bool(chk_state_auto_reload_coming_soon_page.get())
config_dict["tixcraft"]["presale_code"] = txt_presale_code.get().strip()
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"]["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"]["adblock_plus_enable"] = bool(chk_state_adblock_plus.get()) config_dict["advanced"]["adblock_plus_enable"] = bool(chk_state_adblock_plus.get())
@ -446,17 +487,17 @@ def btn_save_act(slience_mode=False):
with open(config_filepath, 'w') as outfile: with open(config_filepath, 'w') as outfile:
json.dump(config_dict, outfile) json.dump(config_dict, outfile)
if slience_mode==False: if not slience_mode:
messagebox.showinfo("File Save", "Done ^_^") messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"])
return is_all_data_correct return is_all_data_correct
def btn_run_clicked(): def btn_run_clicked(language_code):
import subprocess import subprocess
print('run button pressed.') print('run button pressed.')
Root_Dir = "" Root_Dir = ""
save_ret = btn_save_act(slience_mode=True) save_ret = btn_save_act(language_code, slience_mode=True)
print("save config result:", save_ret) print("save config result:", save_ret)
if save_ret: if save_ret:
if hasattr(sys, 'frozen'): if hasattr(sys, 'frozen'):
@ -583,6 +624,7 @@ def applyNewLanguage():
global lbl_kktix_area_keyword_2 global lbl_kktix_area_keyword_2
global lbl_kktix_area_keyword_2_and_text global lbl_kktix_area_keyword_2_and_text
global lbl_auto_guess_options global lbl_auto_guess_options
global lbl_user_guess_string
# for tixcraft # for tixcraft
global lbl_date_auto_select global lbl_date_auto_select
@ -596,6 +638,7 @@ def applyNewLanguage():
global lbl_area_keyword_4 global lbl_area_keyword_4
global lbl_pass_date_is_sold_out global lbl_pass_date_is_sold_out
global lbl_auto_reload_coming_soon_page global lbl_auto_reload_coming_soon_page
global lbl_presale_code
# for checkbox # for checkbox
global chk_pass_1_seat_remaining global chk_pass_1_seat_remaining
@ -637,6 +680,8 @@ def applyNewLanguage():
lbl_kktix_area_keyword_2.config(text=translate[language_code]["area_keyword_2"]) lbl_kktix_area_keyword_2.config(text=translate[language_code]["area_keyword_2"])
lbl_kktix_area_keyword_2_and_text.config(text=translate[language_code]["and"]) lbl_kktix_area_keyword_2_and_text.config(text=translate[language_code]["and"])
lbl_auto_guess_options.config(text=translate[language_code]["auto_guess_options"]) lbl_auto_guess_options.config(text=translate[language_code]["auto_guess_options"])
lbl_user_guess_string.config(text=translate[language_code]["user_guess_string"])
lbl_date_auto_select.config(text=translate[language_code]["date_auto_select"]) lbl_date_auto_select.config(text=translate[language_code]["date_auto_select"])
lbl_date_auto_select_mode.config(text=translate[language_code]["date_select_order"]) lbl_date_auto_select_mode.config(text=translate[language_code]["date_select_order"])
lbl_date_keyword.config(text=translate[language_code]["date_keyword"]) lbl_date_keyword.config(text=translate[language_code]["date_keyword"])
@ -648,6 +693,7 @@ def applyNewLanguage():
lbl_area_keyword_4.config(text=translate[language_code]["area_keyword_4"]) lbl_area_keyword_4.config(text=translate[language_code]["area_keyword_4"])
lbl_pass_date_is_sold_out.config(text=translate[language_code]["pass_date_is_sold_out"]) lbl_pass_date_is_sold_out.config(text=translate[language_code]["pass_date_is_sold_out"])
lbl_auto_reload_coming_soon_page.config(text=translate[language_code]["auto_reload_coming_soon_page"]) lbl_auto_reload_coming_soon_page.config(text=translate[language_code]["auto_reload_coming_soon_page"])
lbl_presale_code.config(text=translate[language_code]["user_guess_string"])
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"])
@ -666,9 +712,11 @@ def applyNewLanguage():
tabControl.tab(2, text=translate[language_code]["about"]) tabControl.tab(2, text=translate[language_code]["about"])
global lbl_facebook_account global lbl_facebook_account
global lbl_kktix_account
global lbl_play_captcha_sound global lbl_play_captcha_sound
global lbl_captcha_sound_filename global lbl_captcha_sound_filename
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_play_captcha_sound.config(text=translate[language_code]["play_captcha_sound"]) lbl_play_captcha_sound.config(text=translate[language_code]["play_captcha_sound"])
lbl_captcha_sound_filename.config(text=translate[language_code]["captcha_sound_filename"]) lbl_captcha_sound_filename.config(text=translate[language_code]["captcha_sound_filename"])
@ -684,9 +732,13 @@ def applyNewLanguage():
global btn_run global btn_run
global btn_save global btn_save
global btn_exit global btn_exit
global btn_restore_defaults
btn_run.config(text=translate[language_code]["run"]) btn_run.config(text=translate[language_code]["run"])
btn_save.config(text=translate[language_code]["save"]) btn_save.config(text=translate[language_code]["save"])
if btn_exit:
btn_exit.config(text=translate[language_code]["exit"]) btn_exit.config(text=translate[language_code]["exit"])
btn_restore_defaults.config(text=translate[language_code]["restore_defaults"])
def callbackHomepageOnChange(event): def callbackHomepageOnChange(event):
showHideBlocks() showHideBlocks()
@ -889,6 +941,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
# PS: because of the question is always variable. # PS: because of the question is always variable.
#kktix_answer_dictionary = "" #kktix_answer_dictionary = ""
auto_guess_options = False auto_guess_options = False
user_guess_string = ""
date_auto_select_enable = None date_auto_select_enable = None
date_auto_select_mode = "" date_auto_select_mode = ""
@ -903,6 +956,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
pass_date_is_sold_out_enable = False pass_date_is_sold_out_enable = False
auto_reload_coming_soon_page_enable = True auto_reload_coming_soon_page_enable = True
presale_code = ""
debugMode = False debugMode = False
@ -929,6 +983,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
kktix_area_keyword_2 = config_dict["kktix"]["area_keyword_2"].strip() kktix_area_keyword_2 = config_dict["kktix"]["area_keyword_2"].strip()
kktix_area_keyword_2_and = config_dict["kktix"]["area_keyword_2_and"].strip() kktix_area_keyword_2_and = config_dict["kktix"]["area_keyword_2_and"].strip()
auto_guess_options = config_dict["kktix"]["auto_guess_options"] auto_guess_options = config_dict["kktix"]["auto_guess_options"]
user_guess_string = config_dict["kktix"]["user_guess_string"].strip()
# disable password brute force attack # disable password brute force attack
# PS: feature disabled. # PS: feature disabled.
@ -954,6 +1009,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
area_keyword_4 = config_dict["tixcraft"]["area_auto_select"]["area_keyword_4"].strip() area_keyword_4 = config_dict["tixcraft"]["area_auto_select"]["area_keyword_4"].strip()
pass_date_is_sold_out_enable = config_dict["tixcraft"]["pass_date_is_sold_out"] pass_date_is_sold_out_enable = config_dict["tixcraft"]["pass_date_is_sold_out"]
auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"] auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"]
presale_code = config_dict["tixcraft"]["presale_code"].strip()
# output config: # output config:
print("setting app version", CONST_APP_VERSION) print("setting app version", CONST_APP_VERSION)
@ -975,6 +1031,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
# disable password brute force attack # disable password brute force attack
#print("kktix_answer_dictionary", kktix_answer_dictionary) #print("kktix_answer_dictionary", kktix_answer_dictionary)
print("auto_guess_options", auto_guess_options) print("auto_guess_options", auto_guess_options)
print("user_guess_string", user_guess_string)
# for tixcraft # for tixcraft
print("==[tixcraft]==") print("==[tixcraft]==")
@ -992,6 +1049,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
print("pass_date_is_sold_out", pass_date_is_sold_out_enable) print("pass_date_is_sold_out", pass_date_is_sold_out_enable)
print("auto_reload_coming_soon_page", auto_reload_coming_soon_page_enable) print("auto_reload_coming_soon_page", auto_reload_coming_soon_page_enable)
print("presale_code", presale_code)
print("debug Mode", debugMode) print("debug Mode", debugMode)
@ -1246,8 +1304,15 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
group_row_count+=1 group_row_count+=1
lbl_hr = Label(frame_group_kktix, text="") global lbl_user_guess_string
lbl_hr.grid(column=0, row=group_row_count) lbl_user_guess_string = Label(frame_group_kktix, text=translate[language_code]['user_guess_string'])
lbl_user_guess_string.grid(column=0, row=group_row_count, sticky = E)
global txt_kktix_user_guess_string
txt_kktix_user_guess_string_value = StringVar(frame_group_kktix, value=user_guess_string)
txt_kktix_user_guess_string = Entry(frame_group_kktix, width=20, textvariable = txt_kktix_user_guess_string_value)
txt_kktix_user_guess_string.grid(column=1, row=group_row_count, sticky = W)
global frame_group_kktix_index global frame_group_kktix_index
frame_group_kktix_index = row_count frame_group_kktix_index = row_count
@ -1419,6 +1484,15 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
group_row_count+=1 group_row_count+=1
global lbl_presale_code
lbl_presale_code = Label(frame_group_tixcraft, text=translate[language_code]['user_guess_string'])
lbl_presale_code.grid(column=0, row=group_row_count, sticky = E)
global txt_presale_code
txt_presale_code_value = StringVar(frame_group_tixcraft, value=presale_code)
txt_presale_code = Entry(frame_group_tixcraft, width=20, textvariable = txt_presale_code_value)
txt_presale_code.grid(column=1, row=group_row_count, sticky = W)
global frame_group_tixcraft_index global frame_group_tixcraft_index
frame_group_tixcraft_index = row_count frame_group_tixcraft_index = row_count
frame_group_tixcraft.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X) frame_group_tixcraft.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
@ -1433,13 +1507,14 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
group_row_count = 0 group_row_count = 0
facebook_account = "" facebook_account = ""
kktix_account = ""
play_captcha_sound = False play_captcha_sound = False
captcha_sound_filename = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT captcha_sound_filename = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
adblock_plus_enable = False adblock_plus_enable = False
if 'advanced' in config_dict: if 'advanced' in config_dict:
if 'facebook_account' in config_dict["advanced"]:
facebook_account = config_dict["advanced"]["facebook_account"].strip() facebook_account = config_dict["advanced"]["facebook_account"].strip()
kktix_account = config_dict["advanced"]["kktix_account"].strip()
if 'play_captcha_sound' in config_dict["advanced"]: if 'play_captcha_sound' in config_dict["advanced"]:
if 'enable' in config_dict["advanced"]["play_captcha_sound"]: if 'enable' in config_dict["advanced"]["play_captcha_sound"]:
play_captcha_sound = config_dict["advanced"]["play_captcha_sound"]["enable"] play_captcha_sound = config_dict["advanced"]["play_captcha_sound"]["enable"]
@ -1451,6 +1526,7 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
# for kktix # for kktix
print("==[advanced]==") print("==[advanced]==")
print("facebook_account", facebook_account) print("facebook_account", facebook_account)
print("kktix_account", kktix_account)
print("play_captcha_sound", play_captcha_sound) print("play_captcha_sound", play_captcha_sound)
print("captcha_sound_filename", captcha_sound_filename) print("captcha_sound_filename", captcha_sound_filename)
print("adblock_plus_enable", adblock_plus_enable) print("adblock_plus_enable", adblock_plus_enable)
@ -1473,6 +1549,17 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
group_row_count +=1 group_row_count +=1
global lbl_kktix_account
lbl_kktix_account = Label(frame_group_header, text=translate[language_code]['kktix_account'])
lbl_kktix_account.grid(column=0, row=group_row_count, sticky = E)
global txt_kktix_account
txt_kktix_account_value = StringVar(frame_group_header, value=kktix_account)
txt_kktix_account = Entry(frame_group_header, width=20, textvariable = txt_kktix_account_value)
txt_kktix_account.grid(column=1, row=group_row_count, sticky = W)
group_row_count +=1
global lbl_play_captcha_sound global lbl_play_captcha_sound
lbl_play_captcha_sound = Label(frame_group_header, text=translate[language_code]['play_captcha_sound']) lbl_play_captcha_sound = Label(frame_group_header, text=translate[language_code]['play_captcha_sound'])
lbl_play_captcha_sound.grid(column=0, row=group_row_count, sticky = E) lbl_play_captcha_sound.grid(column=0, row=group_row_count, sticky = E)
@ -1610,44 +1697,35 @@ def AboutTab(root, language_code):
frame_group_header.grid(column=0, row=row_count) frame_group_header.grid(column=0, row=row_count)
def get_action_bar(root,language_code): def get_action_bar(root, language_code):
frame_action = Frame(root) frame_action = Frame(root)
global btn_run global btn_run
global btn_save global btn_save
global btn_exit global btn_exit
global btn_restore_defaults
btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command=btn_run_clicked) btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command= lambda: btn_run_clicked(language_code))
btn_run.grid(column=0, row=0) btn_run.grid(column=0, row=0)
btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command=btn_save_clicked) btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked(language_code) )
btn_save.grid(column=1, row=0) btn_save.grid(column=1, row=0)
btn_exit = ttk.Button(frame_action, text=translate[language_code]['exit'], command=btn_exit_clicked) btn_exit = ttk.Button(frame_action, text=translate[language_code]['exit'], command=btn_exit_clicked)
btn_exit.grid(column=3, row=0) #btn_exit.grid(column=2, row=0)
btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code))
btn_restore_defaults.grid(column=2, row=0)
return frame_action return frame_action
def main(): def clearFrame(frame):
global translate # destroy all widgets from frame
translate = load_translate() for widget in frame.winfo_children():
widget.destroy()
global config_filepath def load_GUI(root, config_dict):
global config_dict clearFrame(root)
config_filepath, config_dict = load_json()
global root
root = Tk()
root.title(CONST_APP_VERSION)
#style = ttk.Style(root)
#style.theme_use('aqua')
#root.configure(background='lightgray')
# style configuration
#style = Style(root)
#style.configure('TLabel', background='lightgray', foreground='black')
#style.configure('TFrame', background='lightgray')
language_code="en_us" language_code="en_us"
if not config_dict is None: if not config_dict is None:
@ -1669,18 +1747,36 @@ def main():
row_count+=1 row_count+=1
frame_action = get_action_bar(root,language_code) frame_action = get_action_bar(root, language_code)
frame_action.grid(column=0, row=row_count) frame_action.grid(column=0, row=row_count)
global UI_PADDING_X
PreferenctTab(tab1, config_dict, language_code, UI_PADDING_X)
AdvancedTab(tab2, config_dict, language_code, UI_PADDING_X)
AboutTab(tab3, language_code)
def main():
global translate
# only need to load translate once.
translate = load_translate()
global config_filepath
global config_dict
# only need to load json file once.
config_filepath, config_dict = load_json()
global root
root = Tk()
root.title(CONST_APP_VERSION)
global UI_PADDING_X global UI_PADDING_X
UI_PADDING_X = 15 UI_PADDING_X = 15
GUI_SIZE_WIDTH = 460 load_GUI(root, config_dict)
GUI_SIZE_HEIGHT = 550
PreferenctTab(tab1, config_dict, language_code, UI_PADDING_X) GUI_SIZE_WIDTH = 460
AdvancedTab(tab2, config_dict, language_code, UI_PADDING_X) GUI_SIZE_HEIGHT = 575
AboutTab(tab3, language_code)
GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT) GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT)
GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-90) GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-90)