2023-01-17, support cityline/urbtix account auto keyin.

master
CHUN YU YAO 2023-01-18 16:40:41 +08:00
parent afebb1dee0
commit 7c2651fe97
3 changed files with 220 additions and 14 deletions

View File

@ -51,7 +51,7 @@ except Exception as exc:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
CONST_APP_VERSION = u"MaxBot (2023.01.14) ver.7"
CONST_APP_VERSION = u"MaxBot (2023.01.17)"
CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com"
@ -3782,12 +3782,15 @@ def urbtix_ticket_number_auto_select(driver, ticket_number):
print("varify site icon pressed.")
except Exception as exc:
# use plan B
'''
try:
print("force to click by js.")
driver.execute_script("arguments[0].click();", el_btn)
ret = True
except Exception as exc:
pass
'''
pass
else:
if show_debug_message:
print("varify site icon is None.")
@ -4035,7 +4038,7 @@ def cityline_date_auto_select(driver, auto_select_mode, date_keyword, auto_reloa
if len(formated_area_list) == 0:
try:
driver.refresh()
time.sleep(0.5)
time.sleep(0.4)
except Exception as exc:
pass
@ -4585,7 +4588,7 @@ def ibon_date_auto_select(driver, auto_select_mode, date_keyword, auto_reload_co
if len(formated_area_list) == 0:
try:
driver.refresh()
time.sleep(0.5)
time.sleep(0.4)
except Exception as exc:
pass
return ret
@ -4951,6 +4954,110 @@ def kktix_login(driver, account):
return ret
def cityline_login(driver, account):
ret = False
el_email = None
try:
el_email = driver.find_element(By.CSS_SELECTOR, 'input.ant-input')
except Exception as exc:
#print("find #email fail")
#print(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, 'input[type="password"]')
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 urbtix_login(driver, account):
ret = False
el_email = None
try:
el_email = driver.find_element(By.CSS_SELECTOR, 'input[name="loginId"]')
except Exception as exc:
#print("find #email fail")
#print(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, 'input[name="password"]')
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 check_and_play_sound_for_captcha(config_dict):
play_captcha_sound = config_dict["advanced"]["play_captcha_sound"]["enable"]
captcha_sound_filename = config_dict["advanced"]["play_captcha_sound"]["filename"].strip()
@ -5117,6 +5224,48 @@ def famiticket_main(driver, url, config_dict):
if '/Sales/Home/Index/' in url:
fami_home(driver, url, config_dict)
def urbtix_performance_confirm_dialog_popup(driver):
ret = False
el_div = None
try:
el_div = driver.find_element(By.CSS_SELECTOR, 'div.notification-confirm-btn > div.button-text')
except Exception as exc:
#print("find modal-dialog fail")
#print(exc)
pass
if el_div is not None:
print("bingo, found notification-confirm-btn")
is_visible = False
try:
if el_div.is_enabled():
if el_div.is_displayed():
is_visible = True
except Exception as exc:
pass
if is_visible:
try:
el_div.click()
ret = True
except Exception as exc:
# use plan B
'''
try:
print("force to click by js.")
driver.execute_script("arguments[0].click();", el_div)
ret = True
except Exception as exc:
pass
'''
pass
if ret:
time.sleep(0.4)
return ret
def urbtix_main(driver, url, config_dict):
# http://msg.urbtix.hk
waiting_for_access_url = ['/session/landing-timer/','msg.urbtix.hk','busy.urbtix.hk']
@ -5137,6 +5286,11 @@ def urbtix_main(driver, url, config_dict):
pass
pass
if '.hk/member-login' in url:
urbtix_account = config_dict["advanced"]["urbtix_account"]
if len(urbtix_account) > 2:
urbtix_login(driver, urbtix_account)
# https://www.urbtix.hk/event-detail/00000/
if '/event-detail/' in url:
date_auto_select_enable = config_dict["tixcraft"]["date_auto_select"]["enable"]
@ -5157,6 +5311,11 @@ def urbtix_main(driver, url, config_dict):
if is_performace_page:
area_auto_select_enable = config_dict["tixcraft"]["area_auto_select"]["enable"]
if area_auto_select_enable:
is_confirm_dialog_popup = urbtix_performance_confirm_dialog_popup(driver)
if is_confirm_dialog_popup:
print("is_confirm_dialog_popup! auto press confirm...")
else:
urbtix_performance(driver, config_dict)
def check_modal_dialog_popup(driver):
@ -5185,6 +5344,9 @@ def cityline_main(driver, url, config_dict):
# https://www.cityline.com/Login.html?targetUrl=https%3A%2F%2F
# ignore url redirect
if '/Login.html' in url:
cityline_account = config_dict["advanced"]["cityline_account"]
if len(cityline_account) > 2:
cityline_login(driver, cityline_account)
return
# https://msg.cityline.com/

View File

@ -1 +1 @@
{"homepage": "https://kktix.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"}, "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": 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": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": true, "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}
{"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"}, "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": 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": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": true, "auto_reload_coming_soon_page": true, "presale_code": ""}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "kktix_account": "", "cityline_account": "", "urbtix_account": "", "adblock_plus_enable": false}, "debug": false}

View File

@ -19,7 +19,7 @@ import json
import webbrowser
import pyperclip
CONST_APP_VERSION = u"MaxBot (2023.01.14) ver.7"
CONST_APP_VERSION = u"MaxBot (2023.01.17)"
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
@ -93,6 +93,9 @@ def load_translate():
en_us["facebook_account"] = 'Facebook account'
en_us["kktix_account"] = 'KKTIX account'
en_us["cityline_account"] = 'cityline account'
en_us["urbtix_account"] = 'URBTIX account'
en_us["play_captcha_sound"] = 'Play sound when captcha'
en_us["captcha_sound_filename"] = 'captcha sound filename'
en_us["adblock_plus_enable"] = 'Adblock Plus Extension'
@ -151,6 +154,9 @@ def load_translate():
zh_tw["facebook_account"] = 'Facebook 帳號'
zh_tw["kktix_account"] = 'KKTIX 帳號'
zh_tw["cityline_account"] = 'cityline 帳號'
zh_tw["urbtix_account"] = 'URBTIX 帳號'
zh_tw["play_captcha_sound"] = '輸入驗證碼時播放音效'
zh_tw["captcha_sound_filename"] = '驗證碼用音效檔'
zh_tw["adblock_plus_enable"] = 'Adblock 瀏覽器擴充功能'
@ -210,6 +216,9 @@ def load_translate():
zh_cn["facebook_account"] = 'Facebook 帐号'
zh_cn["kktix_account"] = 'KKTIX 帐号'
zh_cn["cityline_account"] = 'cityline 帳號'
zh_cn["urbtix_account"] = 'URBTIX 帳號'
zh_cn["play_captcha_sound"] = '输入验证码时播放音效'
zh_cn["captcha_sound_filename"] = '验证码用音效档'
zh_cn["adblock_plus_enable"] = 'Adblock 浏览器扩充功能'
@ -268,6 +277,9 @@ def load_translate():
ja_jp["facebook_account"] = 'Facebookのアカウント'
ja_jp["kktix_account"] = 'KKTIXのアカウント'
ja_jp["cityline_account"] = 'citylineのアカウント'
ja_jp["urbtix_account"] = 'URBTIXのアカウント'
ja_jp["play_captcha_sound"] = 'キャプチャ時に音を鳴らす'
ja_jp["captcha_sound_filename"] = 'サウンドファイル名'
@ -346,6 +358,8 @@ def get_default_config():
config_dict["advanced"]["facebook_account"] = ""
config_dict["advanced"]["kktix_account"] = ""
config_dict["advanced"]["cityline_account"] = ""
config_dict["advanced"]["urbtix_account"] = ""
config_dict["advanced"]["adblock_plus_enable"] = False
config_dict['debug']=False
@ -425,6 +439,9 @@ def btn_save_act(language_code, slience_mode=False):
global txt_facebook_account
global txt_kktix_account
global txt_cityline_account
global txt_urbtix_account
global chk_state_play_captcha_sound
global txt_captcha_sound_filename
global chk_state_adblock_plus
@ -501,6 +518,8 @@ def btn_save_act(language_code, slience_mode=False):
config_dict["advanced"]["facebook_account"] = txt_facebook_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"]["urbtix_account"] = txt_urbtix_account.get().strip()
config_dict["advanced"]["adblock_plus_enable"] = bool(chk_state_adblock_plus.get())
config_dict["ocr_captcha"] = {}
@ -750,10 +769,15 @@ def applyNewLanguage():
global lbl_facebook_account
global lbl_kktix_account
global lbl_cityline_account
global lbl_urbtix_account
global lbl_play_captcha_sound
global lbl_captcha_sound_filename
lbl_facebook_account.config(text=translate[language_code]["facebook_account"])
lbl_kktix_account.config(text=translate[language_code]["kktix_account"])
lbl_cityline_account.config(text=translate[language_code]["cityline_account"])
lbl_urbtix_account.config(text=translate[language_code]["urbtix_account"])
lbl_play_captcha_sound.config(text=translate[language_code]["play_captcha_sound"])
lbl_captcha_sound_filename.config(text=translate[language_code]["captcha_sound_filename"])
@ -1522,15 +1546,11 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
frame_group_header = Frame(root)
group_row_count = 0
facebook_account = ""
kktix_account = ""
play_captcha_sound = False
captcha_sound_filename = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT
adblock_plus_enable = False
if 'advanced' in config_dict:
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 'enable' in config_dict["advanced"]["play_captcha_sound"]:
play_captcha_sound = config_dict["advanced"]["play_captcha_sound"]["enable"]
@ -1543,8 +1563,10 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
print("==[advanced]==")
print("browser", config_dict['browser'])
print("language", config_dict['language'])
print("facebook_account", facebook_account)
print("kktix_account", kktix_account)
print("facebook_account", config_dict["advanced"]["facebook_account"].strip())
print("kktix_account", config_dict["advanced"]["kktix_account"].strip())
print("cityline_account", config_dict["advanced"]["cityline_account"].strip())
print("urbtix_account", config_dict["advanced"]["urbtix_account"].strip())
print("play_captcha_sound", play_captcha_sound)
print("captcha_sound_filename", captcha_sound_filename)
print("adblock_plus_enable", adblock_plus_enable)
@ -1586,7 +1608,7 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
lbl_facebook_account.grid(column=0, row=group_row_count, sticky = E)
global txt_facebook_account
txt_facebook_account_value = StringVar(frame_group_header, value=facebook_account)
txt_facebook_account_value = StringVar(frame_group_header, value=config_dict["advanced"]["facebook_account"].strip())
txt_facebook_account = Entry(frame_group_header, width=20, textvariable = txt_facebook_account_value)
txt_facebook_account.grid(column=1, row=group_row_count, sticky = W)
@ -1597,12 +1619,34 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X):
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_value = StringVar(frame_group_header, value=config_dict["advanced"]["kktix_account"].strip())
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_cityline_account
lbl_cityline_account = Label(frame_group_header, text=translate[language_code]['cityline_account'])
lbl_cityline_account.grid(column=0, row=group_row_count, sticky = E)
global txt_cityline_account
txt_cityline_account_value = StringVar(frame_group_header, value=config_dict["advanced"]["cityline_account"].strip())
txt_cityline_account = Entry(frame_group_header, width=20, textvariable = txt_cityline_account_value)
txt_cityline_account.grid(column=1, row=group_row_count, sticky = W)
group_row_count +=1
global lbl_urbtix_account
lbl_urbtix_account = Label(frame_group_header, text=translate[language_code]['urbtix_account'])
lbl_urbtix_account.grid(column=0, row=group_row_count, sticky = E)
global txt_urbtix_account
txt_urbtix_account_value = StringVar(frame_group_header, value=config_dict["advanced"]["urbtix_account"].strip())
txt_urbtix_account = Entry(frame_group_header, width=20, textvariable = txt_urbtix_account_value)
txt_urbtix_account.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER = "NonBrowser"
CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_CANVAS = "canvas"