diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py
index 561ca80..5d88d79 100644
--- a/chrome_tixcraft.py
+++ b/chrome_tixcraft.py
@@ -44,7 +44,7 @@ except Exception as exc:
print(exc)
pass
-CONST_APP_VERSION = "MaxBot (2024.03.26)"
+CONST_APP_VERSION = "MaxBot (2024.03.27)"
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
@@ -859,7 +859,7 @@ def force_press_button_iframe(driver, f, select_by, select_query, force_submit=T
except Exception as exc:
pass
- is_clicked = force_press_button(driver, select_by, select_query, force_submit)
+ is_clicked = press_button(driver, select_by, select_query, force_submit)
if f:
# switch back to main content, otherwise we will get StaleElementReferenceException
@@ -902,7 +902,7 @@ selectSoldoutItems.forEach((eachItem) =>
#print(exc)
pass
-def force_press_button(driver, select_by, select_query, force_submit=True):
+def press_button(driver, select_by, select_query, force_submit=True):
ret = False
next_step_button = None
try:
@@ -1148,7 +1148,7 @@ def tixcraft_date_auto_select(driver, url, config_dict, domain_name):
if show_debug_message:
print("target_area got, start to press button.")
- is_date_clicked = force_press_button(target_area, By.CSS_SELECTOR,'button')
+ is_date_clicked = press_button(target_area, By.CSS_SELECTOR,'button')
if not is_date_clicked:
if show_debug_message:
print("press button fail, try to click hyperlink.")
@@ -1172,7 +1172,7 @@ def tixcraft_date_auto_select(driver, url, config_dict, domain_name):
# for: ticketmaster.sg
- is_date_clicked = force_press_button(target_area, By.CSS_SELECTOR,'a')
+ is_date_clicked = press_button(target_area, By.CSS_SELECTOR,'a')
# [PS]: current reload condition only when
if auto_reload_coming_soon_page_enable:
@@ -1297,7 +1297,7 @@ def ticketmaster_date_auto_select(driver, url, config_dict, domain_name):
is_date_clicked = False
if not target_area is None:
- is_date_clicked = force_press_button(target_area, By.CSS_SELECTOR,'a')
+ is_date_clicked = press_button(target_area, By.CSS_SELECTOR,'a')
if is_date_clicked:
try:
window_handles_count = len(driver.window_handles)
@@ -1809,7 +1809,7 @@ def fill_common_verify_form(driver, config_dict, inferred_answer_string, fail_li
form_input_1.send_keys(Keys.ENTER)
is_button_clicked = True
if len(next_step_button_css) > 0:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, next_step_button_css)
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, next_step_button_css)
except Exception as exc:
if show_debug_message:
print(exc)
@@ -1854,7 +1854,7 @@ def fill_common_verify_form(driver, config_dict, inferred_answer_string, fail_li
is_button_clicked = False
form_input_2.send_keys(Keys.ENTER)
if len(next_step_button_css) > 0:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, next_step_button_css)
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, next_step_button_css)
if is_button_clicked:
is_answer_sent = True
@@ -2142,10 +2142,12 @@ def tixcraft_auto_ocr(driver, ocr, away_from_keyboard_enable, previous_answer, C
return is_need_redo_ocr, previous_answer, is_form_sumbited
def tixcraft_ticket_main_agree(driver, config_dict):
+ is_finish_checkbox_click = False
for i in range(3):
is_finish_checkbox_click = check_checkbox(driver, By.CSS_SELECTOR, '#TicketForm_agree')
if is_finish_checkbox_click:
break
+ return is_finish_checkbox_click
def get_tixcraft_ticket_select_by_keyword(driver, config_dict, area_keyword_item):
show_debug_message = True # debug.
@@ -2401,7 +2403,7 @@ def kktix_confirm_order_button(driver):
# : 2: /events/xxx/registrations/new
# : This is ONLY for case-1, because case-2 lenght >5
def kktix_events_press_next_button(driver):
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'.tickets > a.btn-point')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'.tickets > a.btn-point')
return is_button_clicked
# : This is for case-2 next button.
@@ -4703,7 +4705,7 @@ def cityline_purchase_button_press(driver, config_dict):
is_button_clicked = False
if is_date_assign_by_bot:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'button.purchase-btn')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'button.purchase-btn')
return is_button_clicked
@@ -5207,7 +5209,7 @@ def ibon_performance(driver, config_dict):
return is_price_assign_by_bot
def ibon_purchase_button_press(driver):
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '#ticket-wrap > a.btn')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, '#ticket-wrap > a.btn')
return is_button_clicked
def assign_text(driver, by, query, val, overwrite = False, submit=False, overwrite_when = ""):
@@ -5355,7 +5357,7 @@ def cityline_login(driver, account, password):
# press "click here" use password to login.
if is_email_sent:
- is_click_here_pressed = force_press_button(driver, By.CSS_SELECTOR,'.otp-box > ul > li:nth-child(3) > a')
+ is_click_here_pressed = press_button(driver, By.CSS_SELECTOR,'.otp-box > ul > li:nth-child(3) > a')
is_password_sent = False
if is_email_sent:
@@ -5482,7 +5484,7 @@ def kham_login(driver, account, password):
pass
if is_password_sent:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'div.memberContent > p > a > button.red')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'div.memberContent > p > a > button.red')
ret = is_password_sent
@@ -5543,7 +5545,7 @@ def ticket_login(driver, account, password):
pass
if is_password_sent:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'input[value="登入"]')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'input[value="登入"]')
ret = is_password_sent
@@ -5899,7 +5901,7 @@ def ticketmaster_assign_ticket_number(driver, config_dict):
# must wait ticket number assign to focus captcha.
if is_ticket_number_assigned:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'#autoMode')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'#autoMode')
def ticketmaster_captcha(driver, config_dict, ocr, Captcha_Browser, domain_name):
show_debug_message = True # debug.
@@ -6432,7 +6434,7 @@ def urbtix_auto_survey(driver, config_dict):
if question_direction in ['left','right']:
for answer_item in util.synonym_dict(question_answer_char):
if answer_item in option_content_div_text:
- is_radio_clicked = force_press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
+ is_radio_clicked = press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
if is_radio_clicked:
if show_debug_message:
print("fill answer:", answer_item)
@@ -6442,7 +6444,7 @@ def urbtix_auto_survey(driver, config_dict):
if question_direction == "count":
for answer_item in util.synonym_dict(question_answer_char):
if answer_item in option_content_div_text:
- is_radio_clicked = force_press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
+ is_radio_clicked = press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
if is_radio_clicked:
if show_debug_message:
print("fill answer:", answer_item)
@@ -6456,7 +6458,7 @@ def urbtix_auto_survey(driver, config_dict):
if 'LESS THEN ONE' in option_content_div_text.upper():
is_match_none = True
if is_match_none:
- is_radio_clicked = force_press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
+ is_radio_clicked = press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
if is_radio_clicked:
if show_debug_message:
print("fill answer:", '沒有')
@@ -6479,7 +6481,7 @@ def urbtix_auto_survey(driver, config_dict):
if 'MORE THEN' in option_content_div_text.upper() and answer_item + '個' in option_content_div_text:
is_match_more_then = True
if is_match_more_then:
- is_radio_clicked = force_press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
+ is_radio_clicked = press_button(each_option_div, By.CSS_SELECTOR, 'div.radio-wrapper')
if is_radio_clicked:
if show_debug_message:
print("fill answer:", answer_item + '個或以上')
@@ -6520,7 +6522,7 @@ def urbtix_auto_survey(driver, config_dict):
if questions_remain_text == "0" or questions_remain_text == "":
is_button_clicked = False
- #is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'div.button-wrapper > div.button-text-multi-lines > div')
+ #is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'div.button-wrapper > div.button-text-multi-lines > div')
# Message: Element
is not clickable at point (351,566) because another element
obscures it
btn_submit = None
@@ -6660,7 +6662,7 @@ def cityline_shows_goto_cta(driver):
def cityline_cookie_accept(driver):
- is_btn_click = force_press_button(driver, By.CSS_SELECTOR,'.cookieWrapper_closeBtn')
+ is_btn_click = press_button(driver, By.CSS_SELECTOR,'.cookieWrapper_closeBtn')
def cityline_auto_retry_access(driver, config_dict):
btn_retry = None
@@ -6880,25 +6882,11 @@ def ibon_verification_question(driver, fail_list, config_dict):
def ibon_ticket_agree(driver):
- # check agree
- form_checkbox = None
- try:
- form_checkbox = driver.find_element(By.CSS_SELECTOR, '#agreen')
- except Exception as exc:
- #print("find #agreen fail")
- pass
-
is_finish_checkbox_click = False
- if not form_checkbox is None:
- try:
- if form_checkbox.is_enabled():
- if not form_checkbox.is_selected():
- form_checkbox.click()
- is_finish_checkbox_click = True
- except Exception as exc:
- print("click #agreen fail, try plan_b click label.")
- is_finish_checkbox_click = force_press_button(driver, By.CSS_SELECTOR,'label[for="agreen"]')
-
+ for i in range(3):
+ is_finish_checkbox_click = check_checkbox(driver, By.CSS_SELECTOR, '#agreen')
+ if is_finish_checkbox_click:
+ break
return is_finish_checkbox_click
def ibon_check_sold_out(driver):
@@ -6921,10 +6909,6 @@ def ibon_check_sold_out(driver):
return is_sold_out
-def ibon_auto_signup(driver):
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '.btn.btn-signup')
- return is_button_clicked
-
def ibon_keyin_captcha_code(driver, answer = "", auto_submit = False):
is_verifyCode_editing = False
@@ -7144,9 +7128,9 @@ def ibon_main(driver, url, config_dict, ibon_dict, ocr, Captcha_Browser):
is_event_page = False
if len(url.split('/'))==5:
is_event_page = True
-
if is_event_page:
- ibon_auto_signup(driver)
+ # ibon auto press signup
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, '.btn.btn-signup')
is_match_target_feature = False
@@ -7263,7 +7247,7 @@ def ibon_main(driver, url, config_dict, ibon_dict, ocr, Captcha_Browser):
if is_sold_out:
print("is_sold_out, go back , and refresh.")
# plan-A
- #is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'a.btn.btn-primary')
+ #is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'a.btn.btn-primary')
# plan-B, easy and better than plan-A
try:
driver.back()
@@ -7285,27 +7269,22 @@ def ibon_main(driver, url, config_dict, ibon_dict, ocr, Captcha_Browser):
is_event_page = False
if is_event_page:
- is_finish_checkbox_click = False
if is_event_page:
- for i in range(3):
- is_finish_checkbox_click = ibon_ticket_agree(driver)
- if is_finish_checkbox_click:
- break
+ is_match_target_feature = True
+ is_finish_checkbox_click = ibon_ticket_agree(driver)
+ if is_finish_checkbox_click:
+ is_name_based = False
+ try:
+ my_css_selector = "body"
+ html_body = driver.find_element(By.CSS_SELECTOR, my_css_selector)
+ if not html_body is None:
+ if '實名制' in html_body.text:
+ is_name_based = True
+ except Exception as exc:
+ pass
- if is_finish_checkbox_click:
- is_name_based = False
- try:
- my_css_selector = "body"
- html_body = driver.find_element(By.CSS_SELECTOR, my_css_selector)
- if not html_body is None:
- if '實名制' in html_body.text:
- is_name_based = True
- is_match_target_feature = True
- except Exception as exc:
- pass
-
- if not is_name_based:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'a.btn.btn-pink.continue')
+ if not is_name_based:
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'a.btn.btn-pink.continue')
return ibon_dict
@@ -7613,7 +7592,7 @@ def hkticketing_date_auto_select(driver, config_dict, fail_list):
el_btn = None
if is_auto_submit:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '#buyButton > input')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, '#buyButton > input')
if show_debug_message:
print("is_button_clicked:", is_button_clicked)
@@ -8309,15 +8288,15 @@ def softix_powerweb_main(driver, url, config_dict, hkticketing_dict):
def khan_go_buy_redirect(driver, domain_name):
is_button_clicked = False
if 'kham.com' in domain_name:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'p > a > button.red')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'p > a > button.red')
if 'ticket.com' in domain_name:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'div.row > div > a.btn.btn-order.btn-block')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, 'div.row > div > a.btn.btn-order.btn-block')
if 'udnfunlife.com' in domain_name:
# udn 快速訂購
my_css_selector = 'button[name="fastBuy"]'
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, my_css_selector)
if not is_button_clicked:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '#buttonBuy')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, '#buttonBuy')
return is_button_clicked
def hkam_date_auto_select(driver, domain_name, config_dict):
@@ -8512,7 +8491,7 @@ def kham_product(driver, domain_name, config_dict):
if not is_date_assign_by_bot:
# click not on sale now.
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
pass
return is_date_assign_by_bot
@@ -9115,7 +9094,7 @@ def kham_check_captcha_text_error(driver, config_dict):
if el_message_text is None:
el_message_text = ""
if "【驗證碼】輸入錯誤" in el_message_text:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
is_reset_password_text = True
kham_keyin_captcha_code(driver)
except Exception as exc:
@@ -9161,7 +9140,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
]
for each_url in home_url_list:
if each_url == url.lower():
- #is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'.closeBTN')
+ #is_button_clicked = press_button(driver, By.CSS_SELECTOR,'.closeBTN')
clean_tag_by_selector(driver, ".popoutBG")
if config_dict["ocr_captcha"]["enable"]:
@@ -9232,7 +9211,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
# layout format #1
is_ticket_number_assigned = assign_text(driver, By.CSS_SELECTOR, select_query, str(config_dict["ticket_number"]), overwrite_when="0")
if is_ticket_number_assigned:
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'#buttonNext')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'#buttonNext')
else:
# layout format #2
date_auto_select_enable = config_dict["date_auto_select"]["enable"]
@@ -9247,7 +9226,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
is_ticket_number_sent = assign_text(driver, By.CSS_SELECTOR, 'input#QRY2', str(config_dict["ticket_number"]), overwrite_when="0")
if is_ticket_number_sent:
- is_fastbuy_pressed = force_press_button(driver, By.CSS_SELECTOR,'input#f_btn')
+ is_fastbuy_pressed = press_button(driver, By.CSS_SELECTOR,'input#f_btn')
else:
# kham / ticket.
@@ -9270,7 +9249,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
is_captcha_sent = kham_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
my_css_selector = 'div.ui-dialog-buttonset > button.ui-button'
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR, my_css_selector)
if config_dict["area_auto_select"]["enable"]:
if "ticket.com.tw" in url:
is_switch_to_auto_seat = ticket_switch_to_auto_seat(driver)
@@ -9342,7 +9321,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
else:
is_finish_checkbox_click = kham_allow_not_adjacent_seat(driver, config_dict)
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
if config_dict["ocr_captcha"]["enable"]:
if not is_captcha_sent:
is_captcha_sent = kham_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
@@ -9370,7 +9349,7 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
pass
if '/utk13/utk1306_.aspx' in url.lower():
- is_button_clicked = force_press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
+ is_button_clicked = press_button(driver, By.CSS_SELECTOR,'div.ui-dialog-buttonset > button.ui-button')
if config_dict["ocr_captcha"]["enable"]:
model_name = url.split('/')[5]
if len(model_name) > 7:
@@ -10276,7 +10255,7 @@ svgToPng(svg, (imgData) => {
previous_answer = ocr_answer
print("refresh captcha...")
my_css_selector = "div.recaptcha-area > div > div > span > i"
- is_refresh_button_pressed = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_refresh_button_pressed = press_button(driver, By.CSS_SELECTOR, my_css_selector)
# must have time to load captcha image.
time.sleep(0.4)
else:
@@ -10308,7 +10287,7 @@ def ticketplus_check_and_renew_captcha(driver):
is_messages_popup = True
print("error message popup, refresh captcha images.")
my_css_selector = "div.recaptcha-area > div > div > span > i"
- is_refresh_button_pressed = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_refresh_button_pressed = press_button(driver, By.CSS_SELECTOR, my_css_selector)
# must have time to load captcha image.
time.sleep(0.4)
except Exception as exc:
@@ -10414,11 +10393,11 @@ def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
# for style_2
my_css_selector = "div.order-footer > div.container > div.row > div > button.nextBtn"
- is_form_sumbited = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_form_sumbited = press_button(driver, By.CSS_SELECTOR, my_css_selector)
if not is_form_sumbited:
# for style_1
my_css_selector = "div.order-footer > div.container > div.row > div > div.row > div > button.nextBtn"
- is_form_sumbited = force_press_button(driver, By.CSS_SELECTOR, my_css_selector)
+ is_form_sumbited = press_button(driver, By.CSS_SELECTOR, my_css_selector)
if is_form_sumbited:
# must delay 0.5 second wait ajax return.
@@ -10607,17 +10586,17 @@ def ticketplus_account_sign_in(driver, config_dict):
# 未結帳訂單 (order)
def ticketplus_accept_realname_card(driver):
select_query = 'div.v-dialog__content > div > div > div > div.row > div > button.primary'
- return force_press_button(driver, By.CSS_SELECTOR, select_query)
+ return press_button(driver, By.CSS_SELECTOR, select_query)
# 好玩其他活動
def ticketplus_accept_other_activity(driver):
select_query = 'div[role="dialog"] > div.v-dialog > button.primary-1 > span > i.v-icon'
- return force_press_button(driver, By.CSS_SELECTOR, select_query)
+ return press_button(driver, By.CSS_SELECTOR, select_query)
# 購票失敗 您選擇的票種已售完或本活動有限制購票總張數,請詳閱 注意事項
def ticketplus_accept_order_fail(driver):
select_query = 'div[role="dialog"] > div.v-dialog > div.v-card > div > div.row > div.col > button.v-btn'
- return force_press_button(driver, By.CSS_SELECTOR, select_query)
+ return press_button(driver, By.CSS_SELECTOR, select_query)
def ticketplus_ticket_agree(driver, config_dict):
show_debug_message = True # debug.
@@ -10727,6 +10706,15 @@ def ticketplus_main(driver, url, config_dict, ocr, Captcha_Browser, ticketplus_d
return ticketplus_dict
+def facebook_main(driver, config_dict):
+ facebook_account = config_dict["advanced"]["facebook_account"].strip()
+ facebook_password = config_dict["advanced"]["facebook_password_plaintext"].strip()
+ if facebook_password == "":
+ facebook_password = util.decryptMe(config_dict["advanced"]["facebook_password"])
+ if len(facebook_account) > 4:
+ facebook_login(driver, facebook_account, facebook_password)
+ time.sleep(2)
+
def get_current_url(driver):
DISCONNECTED_MSG = ': target window already closed'
@@ -10875,6 +10863,8 @@ def main(args):
tixcraft_dict["elapsed_time"]=None
tixcraft_dict["is_popup_checkout"] = False
tixcraft_dict["area_retry_count"]=0
+ tixcraft_dict["played_sound_ticket"] = False
+ tixcraft_dict["played_sound_order"] = False
# for kktix
kktix_dict = {}
@@ -11023,16 +11013,10 @@ def main(args):
if softix_family:
hkticketing_dict = softix_powerweb_main(driver, url, config_dict, hkticketing_dict)
- # for facebook
+ # for facebook signin
facebook_login_url = 'https://www.facebook.com/login.php?'
if url[:len(facebook_login_url)]==facebook_login_url:
- facebook_account = config_dict["advanced"]["facebook_account"].strip()
- facebook_password = config_dict["advanced"]["facebook_password_plaintext"].strip()
- if facebook_password == "":
- facebook_password = util.decryptMe(config_dict["advanced"]["facebook_password"])
- if len(facebook_account) > 4:
- facebook_login(driver, facebook_account, facebook_password)
- time.sleep(2)
+ facebook_main(driver, config_dict)
def cli():
parser = argparse.ArgumentParser(
diff --git a/config_launcher.py b/config_launcher.py
index 0338f88..2851fd7 100644
--- a/config_launcher.py
+++ b/config_launcher.py
@@ -24,7 +24,7 @@ import webbrowser
import util
-CONST_APP_VERSION = "MaxBot (2024.03.26)"
+CONST_APP_VERSION = "MaxBot (2024.03.27)"
CONST_MAXBOT_LAUNCHER_FILE = "config_launcher.json"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
diff --git a/kktix_status.py b/kktix_status.py
index d609b0b..3ad3e89 100644
--- a/kktix_status.py
+++ b/kktix_status.py
@@ -29,7 +29,7 @@ from datetime import datetime
import util
-CONST_APP_VERSION = "MaxBot (2024.03.26)"
+CONST_APP_VERSION = "MaxBot (2024.03.27)"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
CONST_MAXBOT_KKTIX_CONFIG_FILE = "kktix.json"
diff --git a/nodriver_tixcraft.py b/nodriver_tixcraft.py
index e30043e..c0c09a3 100644
--- a/nodriver_tixcraft.py
+++ b/nodriver_tixcraft.py
@@ -32,7 +32,7 @@ except Exception as exc:
print(exc)
pass
-CONST_APP_VERSION = "MaxBot (2024.03.26)"
+CONST_APP_VERSION = "MaxBot (2024.03.27)"
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
@@ -191,6 +191,34 @@ def play_sound_while_ordering(config_dict):
captcha_sound_filename = os.path.join(app_root, config_dict["advanced"]["play_sound"]["filename"].strip())
util.play_mp3_async(captcha_sound_filename)
+async def nodriver_press_button(tab, select_query):
+ if tab:
+ try:
+ element = await tab.query_selector(select_query)
+ if element:
+ await element.click()
+ else:
+ #print("element not found:", select_query)
+ pass
+ except Exception as e:
+ #print("click fail for selector:", select_query)
+ print(e)
+ pass
+
+async def nodriver_check_checkbox(tab, select_query, value='true'):
+ is_checkbox_checked = False
+ if tab:
+ try:
+ element = await tab.query_selector(select_query)
+ if element:
+ await element.apply('function (element) { element.checked='+ value +'; } ')
+ is_checkbox_checked = True
+ except Exception as exc:
+ #print("check checkbox fail for selector:", select_query)
+ print(exc)
+ pass
+ return is_checkbox_checked
+
async def nodriver_facebook_login(tab, facebook_account, facebook_password):
if tab:
try:
@@ -295,20 +323,30 @@ async def nodriver_goto_homepage(driver, config_dict):
tixcraft_sid = config_dict["advanced"]["tixcraft_sid"]
if len(tixcraft_sid) > 1:
cookies = await driver.cookies.get_all()
+ is_cookie_exist = False
for cookie in cookies:
if cookie.name=='SID':
cookie.value=tixcraft_sid
+ is_cookie_exist = True
break
+ if not is_cookie_exist:
+ new_cookie = cdp.network.CookieParam("SID",tixcraft_sid, domain="tixcraft.com", path="/", http_only=True, secure=True)
+ cookies.append(new_cookie)
await driver.cookies.set_all(cookies)
if 'ibon.com' in homepage:
ibonqware = config_dict["advanced"]["ibonqware"]
if len(ibonqware) > 1:
cookies = await driver.cookies.get_all()
+ is_cookie_exist = False
for cookie in cookies:
if cookie.name=='ibonqware':
cookie.value=ibonqware
+ is_cookie_exist = True
break
+ if not is_cookie_exist:
+ new_cookie = cdp.network.CookieParam("ibonqware",ibonqware, domain=".ibon.com.tw", path="/", http_only=True, secure=True)
+ cookies.append(new_cookie)
await driver.cookies.set_all(cookies)
return tab
@@ -776,12 +814,13 @@ async def nodriver_kktix_main(tab, url, config_dict, kktix_dict):
try:
html_body = await tab.get_content()
#print("html_body:",len(html_body))
- if len(html_body) > 10240:
- if "registrationsNewApp" in html_body:
- if not "{{'new.i_read_and_agree_to'" in html_body:
- is_dom_ready = True
+ if html_body:
+ if len(html_body) > 10240:
+ if "registrationsNewApp" in html_body:
+ if not "{{'new.i_read_and_agree_to'" in html_body:
+ is_dom_ready = True
except Exception as exc:
- print(exc)
+ #print(exc)
pass
if not is_dom_ready:
@@ -977,6 +1016,26 @@ async def nodriver_tixcraft_input_check_code(tab, config_dict, fail_list, questi
return fail_list
+async def nodriver_tixcraft_ticket_main_agree(tab, config_dict):
+ for i in range(3):
+ is_finish_checkbox_click = await nodriver_check_checkbox(tab, '#TicketForm_agree')
+ if is_finish_checkbox_click:
+ break
+
+async def nodriver_tixcraft_ticket_main(tab, config_dict, ocr, Captcha_Browser, domain_name):
+ 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
+ #print("is_agree_at_webdriver:", is_agree_at_webdriver)
+ if is_agree_at_webdriver:
+ # use extension instead of selenium.
+ # checkbox javascrit code at chrome extension.
+ await nodriver_tixcraft_ticket_main_agree(tab, config_dict)
+
+
async def nodriver_tixcraft_main(tab, url, config_dict, tixcraft_dict, ocr, Captcha_Browser):
await nodriver_tixcraft_home_close_window(tab)
@@ -1054,8 +1113,7 @@ async def nodriver_tixcraft_main(tab, url, config_dict, tixcraft_dict, ocr, Capt
# main app, to select ticket number.
if '/ticket/ticket/' in url:
domain_name = url.split('/')[2]
- # TODO:
- #tixcraft_ticket_main(driver, config_dict, ocr, Captcha_Browser, domain_name)
+ await nodriver_tixcraft_ticket_main(tab, config_dict, ocr, Captcha_Browser, domain_name)
tixcraft_dict["done_time"] = time.time()
if config_dict["advanced"]["play_sound"]["ticket"]:
@@ -1319,6 +1377,220 @@ async def nodriver_ticketplus_main(tab, url, config_dict, ocr, Captcha_Browser,
return ticketplus_dict
+async def nodriver_ibon_ticket_agree(tab):
+ for i in range(3):
+ is_finish_checkbox_click = await nodriver_check_checkbox(tab, '#agreen')
+ if is_finish_checkbox_click:
+ break
+
+async def nodriver_ibon_main(tab, url, config_dict, ibon_dict, ocr, Captcha_Browser):
+ home_url_list = ['https://ticket.ibon.com.tw/'
+ ,'https://ticket.ibon.com.tw/index/entertainment'
+ ]
+ for each_url in home_url_list:
+ if each_url == url.lower():
+ if config_dict["ocr_captcha"]["enable"]:
+ # TODO:
+ #set_non_browser_cookies(driver, url, Captcha_Browser)
+ pass
+ break
+
+ # https://tour.ibon.com.tw/event/e23010000300mxu
+ if 'tour' in url.lower() and '/event/' in url.lower():
+ is_event_page = False
+ if len(url.split('/'))==5:
+ is_event_page = True
+ if is_event_page:
+ # ibon auto press signup
+ await nodriver_press_button('.btn.btn-signup')
+
+ is_match_target_feature = False
+
+ #PS: ibon some utk is upper case, some is lower.
+ if not is_match_target_feature:
+ #https://ticket.ibon.com.tw/ActivityInfo/Details/0000?pattern=entertainment
+ if '/activityinfo/details/' in url.lower():
+ is_event_page = False
+ if len(url.split('/'))==6:
+ is_event_page = True
+
+ if is_event_page:
+ if config_dict["date_auto_select"]["enable"]:
+ is_match_target_feature = True
+ # TODO:
+ #is_date_assign_by_bot = ibon_date_auto_select(driver, config_dict)
+ pass
+
+ if 'ibon.com.tw/error.html?' in url.lower():
+ try:
+ tab.back()
+ except Exception as exc:
+ pass
+
+ is_enter_verify_mode = False
+ if not is_match_target_feature:
+ # validation question url:
+ # https://orders.ibon.com.tw/application/UTK02/UTK0201_0.aspx?rn=1180872370&PERFORMANCE_ID=B04M7XZT&PRODUCT_ID=B04KS88E&SHOW_PLACE_MAP=True
+ is_event_page = False
+ if '/UTK02/UTK0201_0.' in url.upper():
+ if '.aspx?' in url.lower():
+ if 'rn=' in url.lower():
+ if 'PERFORMANCE_ID=' in url.upper():
+ if "PRODUCT_ID=" in url.upper():
+ is_event_page = True
+
+ if is_event_page:
+ is_enter_verify_mode = True
+ # TODO:
+ #ibon_dict["fail_list"] = ibon_verification_question(driver, ibon_dict["fail_list"], config_dict)
+ pass
+ is_match_target_feature = True
+
+ if not is_enter_verify_mode:
+ ibon_dict["fail_list"] = []
+
+ if not is_match_target_feature:
+ # https://orders.ibon.com.tw/application/UTK02/UTK0201_000.aspx?PERFORMANCE_ID=0000
+ # https://orders.ibon.com.tw/application/UTK02/UTK0201_000.aspx?rn=1111&PERFORMANCE_ID=2222&PRODUCT_ID=BBBB
+ # https://orders.ibon.com.tw/application/UTK02/UTK0201_001.aspx?PERFORMANCE_ID=2222&GROUP_ID=4&PERFORMANCE_PRICE_AREA_ID=3333
+
+ is_event_page = False
+ if '/UTK02/UTK0201_' in url.upper():
+ if '.aspx?' in url.lower():
+ if 'PERFORMANCE_ID=' in url.upper():
+ if len(url.split('/'))==6:
+ is_event_page = True
+
+ if '/UTK02/UTK0202_' in url.upper():
+ if '.aspx?' in url.lower():
+ if 'PERFORMANCE_ID=' in url.upper():
+ if len(url.split('/'))==6:
+ is_event_page = True
+
+ if is_event_page:
+ if config_dict["area_auto_select"]["enable"]:
+ select_query = "tr.disbled"
+ # TODO:
+ #clean_tag_by_selector(driver,select_query)
+
+ select_query = "tr.sold-out"
+ # TODO:
+ #clean_tag_by_selector(driver,select_query)
+
+ is_do_ibon_performance_with_ticket_number = False
+
+ if 'PRODUCT_ID=' in url.upper():
+ # step 1: select area.
+ is_match_target_feature = True
+ # TODO:
+ #is_price_assign_by_bot = ibon_performance(driver, config_dict)
+
+ #print("is_price_assign_by_bot:", is_price_assign_by_bot)
+ if not is_price_assign_by_bot:
+ # this case show captcha and ticket-number in this page.
+ # TODO:
+ #if ibon_ticket_number_appear(driver, config_dict):
+ # is_do_ibon_performance_with_ticket_number = True
+ pass
+
+ if 'PERFORMANCE_PRICE_AREA_ID=' in url.upper():
+ is_do_ibon_performance_with_ticket_number = True
+
+ if is_do_ibon_performance_with_ticket_number:
+ if config_dict["advanced"]["disable_adjacent_seat"]:
+ # TODO:
+ #is_finish_checkbox_click = ibon_allow_not_adjacent_seat(driver, config_dict)
+ pass
+
+ # captcha
+ is_captcha_sent = False
+ if config_dict["ocr_captcha"]["enable"]:
+ domain_name = url.split('/')[2]
+ model_name = url.split('/')[5]
+ if len(model_name) > 7:
+ model_name=model_name[:7]
+ captcha_url = '/pic.aspx?TYPE=%s' % (model_name)
+ #PS: need set cookies once, if user change domain.
+ if not Captcha_Browser is None:
+ Captcha_Browser.Set_Domain(domain_name, captcha_url=captcha_url)
+
+ # TODO:
+ #is_captcha_sent = ibon_captcha(driver, config_dict, ocr, Captcha_Browser, model_name)
+ pass
+
+ # assign ticket number.
+ is_match_target_feature = True
+ is_ticket_number_assigned = False
+ # TODO:
+ #is_ticket_number_assigned = ibon_ticket_number_auto_select(driver, config_dict)
+
+ #print("is_ticket_number_assigned:", is_ticket_number_assigned)
+ if is_ticket_number_assigned:
+ if is_captcha_sent:
+ # TODO:
+ #click_ret = ibon_purchase_button_press(driver)
+ pass
+
+ # only this case: "ticket number CHANGED by bot" and "cpatcha sent" to play sound!
+ if click_ret:
+ play_sound_while_ordering(config_dict)
+ else:
+ is_sold_out = False
+ # TODO:
+ #is_sold_out = ibon_check_sold_out(driver)
+ if is_sold_out:
+ print("is_sold_out, go back , and refresh.")
+ # plan-A
+ #is_button_clicked = press_button(tab, By.CSS_SELECTOR, 'a.btn.btn-primary')
+ # plan-B, easy and better than plan-A
+ try:
+ tab.back()
+ tab.reload()
+ except Exception as exc:
+ pass
+
+
+ if not is_match_target_feature:
+ #https://orders.ibon.com.tw/application/UTK02/UTK0206_.aspx
+ is_event_page = False
+ if '/UTK02/UTK020' in url.upper():
+ if '.aspx' in url.lower():
+ if len(url.split('/'))==6:
+ is_event_page = True
+
+ # ignore "pay money" step.
+ if '/UTK02/UTK0207_.ASPX' in url.upper():
+ is_event_page = False
+
+ if is_event_page:
+ if is_event_page:
+ is_match_target_feature = True
+ is_finish_checkbox_click = await nodriver_ibon_ticket_agree(tab)
+ if is_finish_checkbox_click:
+ is_name_based = False
+ try:
+ html_body = await tab.get_content()
+ #print("html_body:",len(html_body))
+ if html_body:
+ if len(html_body) > 1024:
+ if '實名制' in html_body:
+ is_name_based = True
+ except Exception as exc:
+ #print(exc)
+ pass
+
+ if not is_name_based:
+ is_button_clicked = await nodriver_press_button(tab, 'a.btn.btn-pink.continue')
+
+ return ibon_dict
+
+async def nodriver_facebook_main(tab, config_dict):
+ facebook_account = config_dict["advanced"]["facebook_account"].strip()
+ facebook_password = config_dict["advanced"]["facebook_password_plaintext"].strip()
+ if facebook_password == "":
+ facebook_password = util.decryptMe(config_dict["advanced"]["facebook_password"])
+ if len(facebook_account) > 4:
+ await nodriver_facebook_login(tab, facebook_account, facebook_password)
def get_nodriver_browser_args():
browser_args = [
@@ -1519,12 +1791,17 @@ async def nodriver_current_url(tab):
url = ''.join(url_array)
return url, is_quit_bot
-def nodriver_overwrite_prefs(conf, prefs_dict={}):
+def nodriver_overwrite_prefs(conf):
#print(conf.user_data_dir)
prefs_filepath = os.path.join(conf.user_data_dir,"Default")
if not os.path.exists(prefs_filepath):
os.mkdir(prefs_filepath)
prefs_filepath = os.path.join(prefs_filepath,"Preferences")
+
+ prefs_dict = {
+ "credentials_enable_service": False,
+ "ack_existing_ntp_extensions": False,
+ "translate":{"enabled": False}}
prefs_dict["in_product_help"]={}
prefs_dict["in_product_help"]["snoozed_feature"]={}
prefs_dict["in_product_help"]["snoozed_feature"]["IPH_LiveCaption"]={}
@@ -1580,10 +1857,7 @@ async def main(args):
if not config_dict is None:
sandbox = False
conf = get_extension_config(config_dict)
- prefs = {"credentials_enable_service": False,
- "ack_existing_ntp_extensions": False,
- "translate":{"enabled": False}}
- nodriver_overwrite_prefs(conf, prefs)
+ nodriver_overwrite_prefs(conf)
# PS: nodrirver run twice always cause error:
# Failed to connect to browser
# One of the causes could be when you are running as root.
@@ -1614,6 +1888,8 @@ async def main(args):
tixcraft_dict["elapsed_time"]=None
tixcraft_dict["is_popup_checkout"] = False
tixcraft_dict["area_retry_count"]=0
+ tixcraft_dict["played_sound_ticket"] = False
+ tixcraft_dict["played_sound_order"] = False
# for kktix
kktix_dict = {}
@@ -1718,7 +1994,7 @@ async def main(args):
tixcraft_family = True
if tixcraft_family:
- tixcraft_dict, is_quit_bot = await nodriver_tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
+ tixcraft_dict, is_quit_bot = await nodriver_tixcraft_main(tab, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
pass
if 'famiticket.com' in url:
@@ -1726,7 +2002,7 @@ async def main(args):
pass
if 'ibon.com' in url:
- #ibon_dict = ibon_main(driver, url, config_dict, ibon_dict, ocr, Captcha_Browser)
+ ibon_dict = await nodriver_ibon_main(tab, url, config_dict, ibon_dict, ocr, Captcha_Browser)
pass
kham_family = False
@@ -1769,12 +2045,7 @@ async def main(args):
# for facebook
facebook_login_url = 'https://www.facebook.com/login.php?'
if url[:len(facebook_login_url)]==facebook_login_url:
- facebook_account = config_dict["advanced"]["facebook_account"].strip()
- facebook_password = config_dict["advanced"]["facebook_password_plaintext"].strip()
- if facebook_password == "":
- facebook_password = util.decryptMe(config_dict["advanced"]["facebook_password"])
- if len(facebook_account) > 4:
- await nodriver_facebook_login(tab, facebook_account, facebook_password)
+ await nodriver_facebook_main(tab, config_dict)
def cli():
parser = argparse.ArgumentParser(
diff --git a/settings.json b/settings.json
index 47b4bf2..9a50050 100644
--- a/settings.json
+++ b/settings.json
@@ -69,7 +69,7 @@
"ticketplus_password_plaintext": "",
"chrome_extension": true,
"disable_adjacent_seat": false,
- "hide_some_image": false,
+ "hide_some_image": true,
"block_facebook_network": false,
"headless": false,
"verbose": false,
diff --git a/settings.py b/settings.py
index b102cd8..14a13cc 100644
--- a/settings.py
+++ b/settings.py
@@ -41,7 +41,7 @@ try:
except Exception as exc:
pass
-CONST_APP_VERSION = "MaxBot (2024.03.26)"
+CONST_APP_VERSION = "MaxBot (2024.03.27)"
CONST_MAXBOT_ANSWER_ONLINE_FILE = "MAXBOT_ONLINE_ANSWER.txt"
CONST_MAXBOT_CONFIG_FILE = "settings.json"
diff --git a/webdriver/Maxbotplus_1.0.0/js/cityline_event_detail.js b/webdriver/Maxbotplus_1.0.0/js/cityline_event_detail.js
index a00d466..515dda2 100644
--- a/webdriver/Maxbotplus_1.0.0/js/cityline_event_detail.js
+++ b/webdriver/Maxbotplus_1.0.0/js/cityline_event_detail.js
@@ -82,8 +82,6 @@ var fillEventData = function(data) {
if(settings) {
auto_reload_page_interval = settings.advanced.auto_reload_page_interval;
}
- const rootElement = document.documentElement;
- rootElement.remove();
if(auto_reload_page_interval == 0) {
//console.log('Start to reload now.');
location.reload();
@@ -103,7 +101,7 @@ var openWindow = function(url) {
}
var fillPerformanceData = function(data) {
- console.log("eventPerfData:", data);
+ //console.log("eventPerfData:", data);
performanceDataCache = data;
perfPriceListMap = new Map();
//selectedPerfId = null;
diff --git a/webdriver/Maxbotplus_1.0.0/js/cityline_msg_front.js b/webdriver/Maxbotplus_1.0.0/js/cityline_msg_front.js
index 52ce539..b6bfc91 100644
--- a/webdriver/Maxbotplus_1.0.0/js/cityline_msg_front.js
+++ b/webdriver/Maxbotplus_1.0.0/js/cityline_msg_front.js
@@ -1,16 +1,16 @@
function getHtmlDocName() {
var pathname = location.pathname;
- var pathParts = pathname.split('/');
- if(pathParts.length >= 3) return pathParts[2];
- return null;
+ var pathParts = pathname.split('/');
+ if(pathParts.length >= 3) return pathParts[2];
+ return null;
}
function goToCityline(){
- window.location="https://www.cityline.com";
+ window.location="https://www.cityline.com";
}
function setRetryUrl(requestUrl){
- urlThrottler = requestUrl;
+ urlThrottler = requestUrl;
}
function startCountDownTimer() {
@@ -90,9 +90,6 @@ function begin()
}
if(status=='ON') {
- const rootElement = document.documentElement;
- rootElement.remove();
-
let target_interval = auto_reload_page_interval * 1000;
setInterval(() => {
//retry();
diff --git a/webdriver/Maxbotplus_1.0.0/js/hkticketing_queue_front.js b/webdriver/Maxbotplus_1.0.0/js/hkticketing_queue_front.js
index 3f60004..f7b2894 100644
--- a/webdriver/Maxbotplus_1.0.0/js/hkticketing_queue_front.js
+++ b/webdriver/Maxbotplus_1.0.0/js/hkticketing_queue_front.js
@@ -4,9 +4,9 @@ function begin()
const status_div = document.querySelector('#status');
let settings = JSON.parse(settings_div.innerHTML);
let status = status_div.innerHTML;
- console.log("msg");
- console.log(settings);
- console.log(status);
+ //console.log("msg");
+ //console.log(settings);
+ //console.log(status);
let auto_reload_page_interval = 0.0;
if(settings) {
@@ -19,10 +19,8 @@ function begin()
}
if(status=='ON') {
- const rootElement = document.documentElement;
- rootElement.remove();
setInterval(() => {
- busyFor = 0;
+ //var busyFor = 0;
reload();
}, auto_reload_page_interval * 1000);
}
diff --git a/webdriver/Maxbotplus_1.0.0/js/ibon_area.js b/webdriver/Maxbotplus_1.0.0/js/ibon_area.js
index 6354129..aca3eed 100644
--- a/webdriver/Maxbotplus_1.0.0/js/ibon_area.js
+++ b/webdriver/Maxbotplus_1.0.0/js/ibon_area.js
@@ -122,8 +122,6 @@ function ibon_area_main() {
if(settings) {
auto_reload_page_interval = settings.advanced.auto_reload_page_interval;
}
- const rootElement = document.documentElement;
- rootElement.remove();
if(auto_reload_page_interval == 0) {
//console.log('Start to reload now.');
location.reload();
diff --git a/webdriver/Maxbotplus_1.0.0/js/ibon_detail.js b/webdriver/Maxbotplus_1.0.0/js/ibon_detail.js
index 03108d0..98be269 100644
--- a/webdriver/Maxbotplus_1.0.0/js/ibon_detail.js
+++ b/webdriver/Maxbotplus_1.0.0/js/ibon_detail.js
@@ -77,15 +77,13 @@ function ibon_detail_ajax_done(game_info)
}
- console.log("reload:"+reload);
- console.log("target_href:"+target_href);
+ //console.log("reload:"+reload);
+ //console.log("target_href:"+target_href);
if(reload) {
let auto_reload_page_interval = 0.0;
if(settings) {
auto_reload_page_interval = settings.advanced.auto_reload_page_interval;
}
- const rootElement = document.documentElement;
- rootElement.remove();
if(auto_reload_page_interval == 0) {
//console.log('Start to reload now.');
location.reload();
diff --git a/webdriver/Maxbotplus_1.0.0/js/ticketplus_order.js b/webdriver/Maxbotplus_1.0.0/js/ticketplus_order.js
index cf3f758..1caed60 100644
--- a/webdriver/Maxbotplus_1.0.0/js/ticketplus_order.js
+++ b/webdriver/Maxbotplus_1.0.0/js/ticketplus_order.js
@@ -34,8 +34,6 @@ function ajax_return_done(data, real_event_id, real_session_id) {
auto_reload_page_interval = 0.7;
}
- //const rootElement = document.documentElement;
- //rootElement.remove();
if(auto_reload_page_interval == 0) {
//console.log('Start to reload now.');
location.reload();
diff --git a/webdriver/Maxbotplus_1.0.0/manifest.json b/webdriver/Maxbotplus_1.0.0/manifest.json
index 134faf1..4b0a621 100644
--- a/webdriver/Maxbotplus_1.0.0/manifest.json
+++ b/webdriver/Maxbotplus_1.0.0/manifest.json
@@ -418,5 +418,5 @@
]
}
],
- "version": "1.0.18"
+ "version": "1.0.19"
}
\ No newline at end of file