fix bugs for tixcraft.
parent
da3678960e
commit
73ec0403e8
|
@ -656,7 +656,6 @@ def get_driver_by_config(config_dict):
|
||||||
driver.delete_cookie("SID")
|
driver.delete_cookie("SID")
|
||||||
driver.add_cookie({"name":"SID", "value": tixcraft_sid, "path" : "/", "secure":True})
|
driver.add_cookie({"name":"SID", "value": tixcraft_sid, "path" : "/", "secure":True})
|
||||||
|
|
||||||
|
|
||||||
if 'ibon.com' in homepage:
|
if 'ibon.com' in homepage:
|
||||||
if len(config_dict["advanced"]["ibonqware"]) > 1:
|
if len(config_dict["advanced"]["ibonqware"]) > 1:
|
||||||
ibonqware = decryptMe(config_dict["advanced"]["ibonqware"])
|
ibonqware = decryptMe(config_dict["advanced"]["ibonqware"])
|
||||||
|
@ -4876,6 +4875,9 @@ def cityline_performance(driver, config_dict):
|
||||||
show_debug_message = True # debug.
|
show_debug_message = True # debug.
|
||||||
show_debug_message = False # online
|
show_debug_message = False # online
|
||||||
|
|
||||||
|
if config_dict["advanced"]["verbose"]:
|
||||||
|
show_debug_message = True
|
||||||
|
|
||||||
is_price_assign_by_bot = False
|
is_price_assign_by_bot = False
|
||||||
is_need_refresh = False
|
is_need_refresh = False
|
||||||
|
|
||||||
|
@ -7892,13 +7894,14 @@ def kham_keyin_captcha_code(driver, answer = "", auto_submit = False):
|
||||||
|
|
||||||
return is_verifyCode_editing, is_form_sumbited
|
return is_verifyCode_editing, is_form_sumbited
|
||||||
|
|
||||||
def kham_auto_ocr(driver, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source, model_name):
|
def kham_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source, model_name):
|
||||||
show_debug_message = True # debug.
|
show_debug_message = True # debug.
|
||||||
show_debug_message = False # online
|
show_debug_message = False # online
|
||||||
print("start to ddddocr")
|
|
||||||
|
|
||||||
CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER = "NonBrowser"
|
if config_dict["advanced"]["verbose"]:
|
||||||
CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS = "canvas"
|
show_debug_message = True
|
||||||
|
|
||||||
|
print("start to ddddocr")
|
||||||
|
|
||||||
is_need_redo_ocr = False
|
is_need_redo_ocr = False
|
||||||
is_form_sumbited = False
|
is_form_sumbited = False
|
||||||
|
@ -8001,7 +8004,7 @@ def kham_captcha(driver, config_dict, ocr, Captcha_Browser, model_name):
|
||||||
previous_answer = None
|
previous_answer = None
|
||||||
is_verifyCode_editing = True
|
is_verifyCode_editing = True
|
||||||
for redo_ocr in range(999):
|
for redo_ocr in range(999):
|
||||||
is_need_redo_ocr, previous_answer, is_form_sumbited = kham_auto_ocr(driver, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source, model_name)
|
is_need_redo_ocr, previous_answer, is_form_sumbited = kham_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source, model_name)
|
||||||
|
|
||||||
# TODO: must ensure the answer is corrent...
|
# TODO: must ensure the answer is corrent...
|
||||||
is_cpatcha_sent = True
|
is_cpatcha_sent = True
|
||||||
|
@ -8149,6 +8152,486 @@ def kham_main(driver, url, config_dict, ocr, Captcha_Browser):
|
||||||
if len(account) > 4:
|
if len(account) > 4:
|
||||||
kham_login(driver, account, decryptMe(config_dict["advanced"]["kham_password"]))
|
kham_login(driver, account, decryptMe(config_dict["advanced"]["kham_password"]))
|
||||||
|
|
||||||
|
def ticketplus_date_auto_select(driver, config_dict):
|
||||||
|
show_debug_message = True # debug.
|
||||||
|
show_debug_message = False # online
|
||||||
|
|
||||||
|
if config_dict["advanced"]["verbose"]:
|
||||||
|
show_debug_message = True
|
||||||
|
|
||||||
|
# read config.
|
||||||
|
auto_select_mode = config_dict["tixcraft"]["date_auto_select"]["mode"]
|
||||||
|
date_keyword = config_dict["tixcraft"]["date_auto_select"]["date_keyword"].strip()
|
||||||
|
# TODO: implement this feature.
|
||||||
|
date_keyword_and = ""
|
||||||
|
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"]
|
||||||
|
|
||||||
|
if show_debug_message:
|
||||||
|
print("date_auto_select_mode:", auto_select_mode)
|
||||||
|
print("date_keyword:", date_keyword)
|
||||||
|
|
||||||
|
area_list = None
|
||||||
|
try:
|
||||||
|
area_list = driver.find_elements(By.CSS_SELECTOR, 'div#buyTicket > div.sesstion-item')
|
||||||
|
except Exception as exc:
|
||||||
|
print("find #gameList fail")
|
||||||
|
|
||||||
|
find_ticket_text_list = ['立即購票']
|
||||||
|
sold_out_text_list = ['銷售一空','尚未開賣']
|
||||||
|
|
||||||
|
matched_blocks = None
|
||||||
|
formated_area_list = None
|
||||||
|
|
||||||
|
if area_list is not None:
|
||||||
|
area_list_count = len(area_list)
|
||||||
|
if show_debug_message:
|
||||||
|
print("date_list_count:", area_list_count)
|
||||||
|
|
||||||
|
if area_list_count > 0:
|
||||||
|
formated_area_list = []
|
||||||
|
row_index = 0
|
||||||
|
for row in area_list:
|
||||||
|
row_index += 1
|
||||||
|
row_is_enabled=True
|
||||||
|
try:
|
||||||
|
if not row.is_enabled():
|
||||||
|
row_is_enabled=False
|
||||||
|
|
||||||
|
row_text = ""
|
||||||
|
# check buy button.
|
||||||
|
if row_is_enabled:
|
||||||
|
row_text = row.text
|
||||||
|
if row_text is None:
|
||||||
|
row_text = ""
|
||||||
|
|
||||||
|
row_is_enabled=False
|
||||||
|
for text_item in find_ticket_text_list:
|
||||||
|
if text_item in row_text:
|
||||||
|
row_is_enabled = True
|
||||||
|
break
|
||||||
|
|
||||||
|
# check sold out text.
|
||||||
|
if row_is_enabled:
|
||||||
|
if pass_date_is_sold_out_enable:
|
||||||
|
for sold_out_item in sold_out_text_list:
|
||||||
|
if sold_out_item in row_text:
|
||||||
|
row_is_enabled = False
|
||||||
|
if show_debug_message:
|
||||||
|
print("match sold out text: %s, skip this row." % (sold_out_item))
|
||||||
|
break
|
||||||
|
|
||||||
|
except Exception as exc:
|
||||||
|
if show_debug_message:
|
||||||
|
print(exc)
|
||||||
|
pass
|
||||||
|
|
||||||
|
if row_is_enabled:
|
||||||
|
formated_area_list.append(row)
|
||||||
|
|
||||||
|
if show_debug_message:
|
||||||
|
print("formated_area_list count:", len(formated_area_list))
|
||||||
|
|
||||||
|
if len(date_keyword) == 0:
|
||||||
|
matched_blocks = formated_area_list
|
||||||
|
else:
|
||||||
|
# match keyword.
|
||||||
|
date_keyword = format_keyword_string(date_keyword)
|
||||||
|
if show_debug_message:
|
||||||
|
print("start to match formated keyword:", date_keyword)
|
||||||
|
matched_blocks = []
|
||||||
|
|
||||||
|
row_index = 0
|
||||||
|
for row in formated_area_list:
|
||||||
|
row_index += 1
|
||||||
|
row_is_enabled=True
|
||||||
|
if row_is_enabled:
|
||||||
|
row_text = ""
|
||||||
|
try:
|
||||||
|
row_text = row.text
|
||||||
|
except Exception as exc:
|
||||||
|
print("get text fail")
|
||||||
|
break
|
||||||
|
|
||||||
|
if row_text is None:
|
||||||
|
row_text = ""
|
||||||
|
|
||||||
|
if len(row_text) > 0:
|
||||||
|
row_text = format_keyword_string(row_text)
|
||||||
|
if show_debug_message:
|
||||||
|
print("row_text:", row_text)
|
||||||
|
|
||||||
|
is_match_area = False
|
||||||
|
match_area_code = 0
|
||||||
|
|
||||||
|
if date_keyword in row_text:
|
||||||
|
if len(date_keyword_and) == 0:
|
||||||
|
if show_debug_message:
|
||||||
|
print('keyword_and # is empty, directly match.')
|
||||||
|
# keyword #2 is empty, direct append.
|
||||||
|
is_match_area = True
|
||||||
|
match_area_code = 2
|
||||||
|
else:
|
||||||
|
if date_keyword_and in row_text:
|
||||||
|
if show_debug_message:
|
||||||
|
print('match keyword_and')
|
||||||
|
is_match_area = True
|
||||||
|
match_area_code = 3
|
||||||
|
else:
|
||||||
|
if show_debug_message:
|
||||||
|
print('not match keyword_and')
|
||||||
|
pass
|
||||||
|
|
||||||
|
if is_match_area:
|
||||||
|
matched_blocks.append(row)
|
||||||
|
|
||||||
|
if show_debug_message:
|
||||||
|
if not matched_blocks is None:
|
||||||
|
print("after match keyword, found count:", len(matched_blocks))
|
||||||
|
else:
|
||||||
|
print("not found date-time-position")
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print("date date-time-position is None")
|
||||||
|
pass
|
||||||
|
|
||||||
|
target_area = None
|
||||||
|
if matched_blocks is not None:
|
||||||
|
if len(matched_blocks) > 0:
|
||||||
|
target_row_index = 0
|
||||||
|
|
||||||
|
if auto_select_mode == CONST_FROM_TOP_TO_BOTTOM:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if auto_select_mode == CONST_FROM_BOTTOM_TO_TOP:
|
||||||
|
target_row_index = len(matched_blocks)-1
|
||||||
|
|
||||||
|
if auto_select_mode == CONST_RANDOM:
|
||||||
|
target_row_index = random.randint(0,len(matched_blocks)-1)
|
||||||
|
|
||||||
|
target_area = matched_blocks[target_row_index]
|
||||||
|
|
||||||
|
is_date_clicked = False
|
||||||
|
if target_area is not None:
|
||||||
|
target_button = None
|
||||||
|
try:
|
||||||
|
target_button = target_area.find_element(By.CSS_SELECTOR, 'button')
|
||||||
|
if not target_button is None:
|
||||||
|
if target_button.is_enabled():
|
||||||
|
if show_debug_message:
|
||||||
|
print("start to press button...")
|
||||||
|
target_button.click()
|
||||||
|
is_date_clicked = True
|
||||||
|
else:
|
||||||
|
if show_debug_message:
|
||||||
|
print("target_button in target row is None.")
|
||||||
|
except Exception as exc:
|
||||||
|
if show_debug_message:
|
||||||
|
print("find or press button fail:", exc)
|
||||||
|
|
||||||
|
if not target_button is None:
|
||||||
|
print("try to click button fail, force click by js.")
|
||||||
|
try:
|
||||||
|
driver.execute_script("arguments[0].click();", target_button)
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# [PS]: current reload condition only when
|
||||||
|
if auto_reload_coming_soon_page_enable:
|
||||||
|
if not is_date_clicked:
|
||||||
|
if not formated_area_list is None:
|
||||||
|
if len(formated_area_list) == 0:
|
||||||
|
try:
|
||||||
|
driver.refresh()
|
||||||
|
time.sleep(0.3)
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return is_date_clicked
|
||||||
|
|
||||||
|
def ticketplus_order(driver, config_dict, ocr, Captcha_Browser):
|
||||||
|
ticket_number_div = None
|
||||||
|
try:
|
||||||
|
ticket_number_div = driver.find_element(By.CSS_SELECTOR, 'div.count-button > div')
|
||||||
|
except Exception as exc:
|
||||||
|
print("find ticket_number_div fail")
|
||||||
|
|
||||||
|
ticket_number = config_dict["ticket_number"]
|
||||||
|
if not ticket_number_div is None:
|
||||||
|
ticket_number_text = ""
|
||||||
|
ticket_number_text_int = 0
|
||||||
|
try:
|
||||||
|
ticket_number_text = ticket_number_div.text
|
||||||
|
except Exception as exc:
|
||||||
|
print("get ticket_number_text fail")
|
||||||
|
pass
|
||||||
|
|
||||||
|
if ticket_number_text is None:
|
||||||
|
ticket_number_text = ""
|
||||||
|
if len(ticket_number_text) > 0:
|
||||||
|
ticket_number_text_int = int(ticket_number_text)
|
||||||
|
if ticket_number_text_int < ticket_number:
|
||||||
|
ticket_number_plus = None
|
||||||
|
try:
|
||||||
|
ticket_number_plus = driver.find_element(By.CSS_SELECTOR, 'button > span > i.mid-plus')
|
||||||
|
except Exception as exc:
|
||||||
|
print("find ticket_number_plus fail")
|
||||||
|
|
||||||
|
# add
|
||||||
|
add_count = ticket_number - ticket_number_text_int
|
||||||
|
for i in range(add_count):
|
||||||
|
if not ticket_number_plus is None:
|
||||||
|
try:
|
||||||
|
if ticket_number_plus.is_enabled():
|
||||||
|
ticket_number_plus.click()
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
ocr_captcha_enable = config_dict["ocr_captcha"]["enable"]
|
||||||
|
away_from_keyboard_enable = config_dict["ocr_captcha"]["force_submit"]
|
||||||
|
if not ocr_captcha_enable:
|
||||||
|
away_from_keyboard_enable = False
|
||||||
|
ocr_captcha_image_source = config_dict["ocr_captcha"]["image_source"]
|
||||||
|
|
||||||
|
is_cpatcha_sent = False
|
||||||
|
previous_answer = None
|
||||||
|
is_verifyCode_editing = True
|
||||||
|
for redo_ocr in range(999):
|
||||||
|
is_need_redo_ocr, previous_answer, is_form_sumbited = ticketplus_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source)
|
||||||
|
|
||||||
|
# TODO: must ensure the answer is corrent...
|
||||||
|
is_cpatcha_sent = True
|
||||||
|
|
||||||
|
if is_form_sumbited:
|
||||||
|
break
|
||||||
|
|
||||||
|
if not away_from_keyboard_enable:
|
||||||
|
break
|
||||||
|
|
||||||
|
if not is_need_redo_ocr:
|
||||||
|
break
|
||||||
|
|
||||||
|
def ticketplus_auto_ocr(driver, config_dict, ocr, away_from_keyboard_enable, previous_answer, Captcha_Browser, ocr_captcha_image_source):
|
||||||
|
show_debug_message = True # debug.
|
||||||
|
show_debug_message = False # online
|
||||||
|
|
||||||
|
if config_dict["advanced"]["verbose"]:
|
||||||
|
show_debug_message = True
|
||||||
|
|
||||||
|
print("start to ddddocr")
|
||||||
|
|
||||||
|
is_need_redo_ocr = False
|
||||||
|
is_form_sumbited = False
|
||||||
|
|
||||||
|
ocr_answer = None
|
||||||
|
if not ocr is None:
|
||||||
|
if show_debug_message:
|
||||||
|
print("away_from_keyboard_enable:", away_from_keyboard_enable)
|
||||||
|
print("previous_answer:", previous_answer)
|
||||||
|
print("ocr_captcha_image_source:", ocr_captcha_image_source)
|
||||||
|
|
||||||
|
ocr_start_time = time.time()
|
||||||
|
|
||||||
|
img_base64 = None
|
||||||
|
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_NON_BROWSER:
|
||||||
|
if not Captcha_Browser is None:
|
||||||
|
img_base64 = base64.b64decode(Captcha_Browser.Request_Captcha())
|
||||||
|
if ocr_captcha_image_source == CONST_OCR_CAPTCH_IMAGE_SOURCE_CANVAS:
|
||||||
|
image_id = 'span.captcha-img'
|
||||||
|
try:
|
||||||
|
form_verifyCode_base64 = driver.execute_async_script("""
|
||||||
|
function svgToPng(svg, callback) {
|
||||||
|
const url = getSvgUrl(svg);
|
||||||
|
svgUrlToPng(url, (imgData) => {
|
||||||
|
callback(imgData);
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function getSvgUrl(svg) {
|
||||||
|
return URL.createObjectURL(new Blob([svg], {
|
||||||
|
type: 'image/svg+xml'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
function svgUrlToPng(svgUrl, callback) {
|
||||||
|
const svgImage = document.createElement('img');
|
||||||
|
document.body.appendChild(svgImage);
|
||||||
|
svgImage.onload = () => {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.width = svgImage.clientWidth;
|
||||||
|
canvas.height = svgImage.clientHeight;
|
||||||
|
const canvasCtx = canvas.getContext('2d');
|
||||||
|
canvasCtx.drawImage(svgImage, 0, 0);
|
||||||
|
const imgData = canvas.toDataURL('image/png');
|
||||||
|
callback(imgData);
|
||||||
|
};
|
||||||
|
svgImage.src = svgUrl;
|
||||||
|
}
|
||||||
|
const img=document.querySelector('%s');
|
||||||
|
const svg=img.innerHTML;
|
||||||
|
svgToPng(svg, (imgData) => {
|
||||||
|
callback = arguments[arguments.length - 1];
|
||||||
|
callback(imgData);
|
||||||
|
});
|
||||||
|
""" % (image_id))
|
||||||
|
img_base64 = base64.b64decode(form_verifyCode_base64.split(',')[1])
|
||||||
|
except Exception as exc:
|
||||||
|
if show_debug_message:
|
||||||
|
print("canvas exception:", str(exc))
|
||||||
|
pass
|
||||||
|
if not img_base64 is None:
|
||||||
|
try:
|
||||||
|
ocr_answer = ocr.classification(img_base64)
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
ocr_done_time = time.time()
|
||||||
|
ocr_elapsed_time = ocr_done_time - ocr_start_time
|
||||||
|
print("ocr elapsed time:", "{:.3f}".format(ocr_elapsed_time))
|
||||||
|
else:
|
||||||
|
print("ddddocr is None")
|
||||||
|
|
||||||
|
if not ocr_answer is None:
|
||||||
|
ocr_answer = ocr_answer.strip()
|
||||||
|
print("ocr_answer:", ocr_answer)
|
||||||
|
if len(ocr_answer)==4:
|
||||||
|
who_care_var, is_form_sumbited = ticketplus_keyin_captcha_code(driver, answer = ocr_answer, auto_submit = away_from_keyboard_enable)
|
||||||
|
else:
|
||||||
|
if not away_from_keyboard_enable:
|
||||||
|
ticketplus_keyin_captcha_code(driver)
|
||||||
|
#tixcraft_toast(driver, "※ OCR辨識失敗Q_Q,驗證碼請手動輸入...")
|
||||||
|
else:
|
||||||
|
is_need_redo_ocr = True
|
||||||
|
if previous_answer != ocr_answer:
|
||||||
|
previous_answer = ocr_answer
|
||||||
|
print("refresh captcha...")
|
||||||
|
refresh_btn = None
|
||||||
|
try:
|
||||||
|
my_css_selector = 'i.v-icon.mdi.mdi-refresh'
|
||||||
|
refresh_btn = driver.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
if not refresh_btn is None:
|
||||||
|
refresh_btn.click()
|
||||||
|
time.sleep(0.3)
|
||||||
|
except Exception as exc:
|
||||||
|
print("find refresh_btn fail")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("ocr_answer is None")
|
||||||
|
print("previous_answer:", previous_answer)
|
||||||
|
if previous_answer is None:
|
||||||
|
ticketplus_keyin_captcha_code(driver)
|
||||||
|
else:
|
||||||
|
# page is not ready, retry again.
|
||||||
|
# PS: usually occur in async script get captcha image.
|
||||||
|
is_need_redo_ocr = True
|
||||||
|
|
||||||
|
return is_need_redo_ocr, previous_answer, is_form_sumbited
|
||||||
|
|
||||||
|
|
||||||
|
def ticketplus_keyin_captcha_code(driver, answer = "", auto_submit = False):
|
||||||
|
is_verifyCode_editing = False
|
||||||
|
is_form_sumbited = False
|
||||||
|
|
||||||
|
# manually keyin verify code.
|
||||||
|
# start to input verify code.
|
||||||
|
form_verifyCode = None
|
||||||
|
try:
|
||||||
|
my_css_selector = 'input[placeholder="請輸入驗證碼"]'
|
||||||
|
form_verifyCode = driver.find_element(By.CSS_SELECTOR, my_css_selector)
|
||||||
|
except Exception as exc:
|
||||||
|
print("find captcha input fail")
|
||||||
|
|
||||||
|
if form_verifyCode is not None:
|
||||||
|
inputed_value = None
|
||||||
|
try:
|
||||||
|
inputed_value = form_verifyCode.get_attribute('value')
|
||||||
|
except Exception as exc:
|
||||||
|
print("find verify code fail")
|
||||||
|
pass
|
||||||
|
|
||||||
|
if inputed_value is None:
|
||||||
|
inputed_value = ""
|
||||||
|
|
||||||
|
if inputed_value == "請輸入驗證碼":
|
||||||
|
try:
|
||||||
|
form_verifyCode.clear()
|
||||||
|
except Exception as exc:
|
||||||
|
print("clear verify code fail")
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if len(inputed_value) > 0:
|
||||||
|
print("captcha text inputed.")
|
||||||
|
form_verifyCode = None
|
||||||
|
is_verifyCode_editing = True
|
||||||
|
|
||||||
|
if form_verifyCode is not None:
|
||||||
|
is_visible = False
|
||||||
|
try:
|
||||||
|
if form_verifyCode.is_enabled():
|
||||||
|
is_visible = True
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if is_visible:
|
||||||
|
try:
|
||||||
|
form_verifyCode.click()
|
||||||
|
is_verifyCode_editing = True
|
||||||
|
except Exception as exc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
#print("start to fill answer.")
|
||||||
|
try:
|
||||||
|
if len(answer) > 0:
|
||||||
|
answer=answer.upper()
|
||||||
|
form_verifyCode.clear()
|
||||||
|
form_verifyCode.send_keys(answer)
|
||||||
|
if auto_submit:
|
||||||
|
form_verifyCode.send_keys(Keys.ENTER)
|
||||||
|
is_verifyCode_editing = False
|
||||||
|
is_form_sumbited = True
|
||||||
|
else:
|
||||||
|
print("select all captcha text")
|
||||||
|
driver.execute_script("arguments[0].select();", form_verifyCode)
|
||||||
|
if len(answer) > 0:
|
||||||
|
#tixcraft_toast(driver, "※ 按 Enter 如果答案是: " + answer)
|
||||||
|
pass
|
||||||
|
except Exception as exc:
|
||||||
|
print("send_keys ocr answer fail.")
|
||||||
|
|
||||||
|
return is_verifyCode_editing, is_form_sumbited
|
||||||
|
|
||||||
|
def ticketplus_main(driver, url, config_dict, ocr, Captcha_Browser):
|
||||||
|
home_url_list = ['https://ticketplus.com.tw/']
|
||||||
|
for each_url in home_url_list:
|
||||||
|
if each_url == url.lower():
|
||||||
|
if config_dict["ocr_captcha"]["enable"]:
|
||||||
|
domain_name = url.split('/')[2]
|
||||||
|
if not Captcha_Browser is None:
|
||||||
|
Captcha_Browser.Set_cookies(driver.get_cookies())
|
||||||
|
Captcha_Browser.Set_Domain(domain_name)
|
||||||
|
break
|
||||||
|
|
||||||
|
# https://ticketplus.com.tw/activity/XXX
|
||||||
|
if '/activity/' in url.lower():
|
||||||
|
is_event_page = False
|
||||||
|
if len(url.split('/'))==5:
|
||||||
|
is_event_page = True
|
||||||
|
|
||||||
|
if is_event_page:
|
||||||
|
date_auto_select_enable = config_dict["tixcraft"]["date_auto_select"]["enable"]
|
||||||
|
if date_auto_select_enable:
|
||||||
|
ticketplus_date_auto_select(driver, config_dict)
|
||||||
|
|
||||||
|
#https://ticketplus.com.tw/order/XXX/OOO
|
||||||
|
if '/order/' in url.lower():
|
||||||
|
is_event_page = False
|
||||||
|
if len(url.split('/'))==6:
|
||||||
|
is_event_page = True
|
||||||
|
|
||||||
|
if is_event_page:
|
||||||
|
ticketplus_order(driver, config_dict, ocr, Captcha_Browser)
|
||||||
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
config_dict = get_config_dict(args)
|
config_dict = get_config_dict(args)
|
||||||
|
|
||||||
|
@ -8188,7 +8671,9 @@ def main(args):
|
||||||
Captcha_Browser = None
|
Captcha_Browser = None
|
||||||
try:
|
try:
|
||||||
if config_dict["ocr_captcha"]["enable"]:
|
if config_dict["ocr_captcha"]["enable"]:
|
||||||
ocr = ddddocr.DdddOcr(show_ad=False, beta=True)
|
ocr_beta_mode = True
|
||||||
|
#ocr_beta_mode = False
|
||||||
|
ocr = ddddocr.DdddOcr(show_ad=False, beta=ocr_beta_mode)
|
||||||
Captcha_Browser = NonBrowser()
|
Captcha_Browser = NonBrowser()
|
||||||
|
|
||||||
if len(config_dict["advanced"]["tixcraft_sid"]) > 1:
|
if len(config_dict["advanced"]["tixcraft_sid"]) > 1:
|
||||||
|
@ -8339,6 +8824,9 @@ def main(args):
|
||||||
if 'kham.com' in url:
|
if 'kham.com' in url:
|
||||||
kham_main(driver, url, config_dict, ocr, Captcha_Browser)
|
kham_main(driver, url, config_dict, ocr, Captcha_Browser)
|
||||||
|
|
||||||
|
if 'ticketplus.com' in url:
|
||||||
|
ticketplus_main(driver, url, config_dict, ocr, Captcha_Browser)
|
||||||
|
|
||||||
if 'urbtix.hk' in url:
|
if 'urbtix.hk' in url:
|
||||||
urbtix_main(driver, url, config_dict)
|
urbtix_main(driver, url, config_dict)
|
||||||
|
|
||||||
|
|
|
@ -1382,6 +1382,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X):
|
||||||
,"https://www.famiticket.com.tw (全網)"
|
,"https://www.famiticket.com.tw (全網)"
|
||||||
,"https://ticket.ibon.com.tw/"
|
,"https://ticket.ibon.com.tw/"
|
||||||
,"https://kham.com.tw/ (寬宏)"
|
,"https://kham.com.tw/ (寬宏)"
|
||||||
|
,"https://ticketplus.com.tw/ (遠大)"
|
||||||
,"http://www.urbtix.hk/ (城市)"
|
,"http://www.urbtix.hk/ (城市)"
|
||||||
,"https://www.cityline.com/ (買飛)"
|
,"https://www.cityline.com/ (買飛)"
|
||||||
,"https://premier.hkticketing.com/ (快達票)"
|
,"https://premier.hkticketing.com/ (快達票)"
|
||||||
|
|
Loading…
Reference in New Issue